Sobre
Versão do Kernel Suportada
Uso
APIs disponíveis
Como contribuir
Licença
Nossa equipe
Kprofiles é um módulo simples do kernel Linux que pode ser usado para regular atividades no kernel, como reforços que normalmente não são expostos ao espaço do usuário. Kprofiles opera de maneira orientada ao perfil. Portanto, possui quatro modos de perfil: Disabled
, Battery
, Balanced
e Performance
. Cada modo recebe um número de modo. Os desenvolvedores podem usar a função da API Kprofiles em condições de limitar ou ativar tarefas no kernel em um determinado modo de perfil (veja a seção de uso, por exemplo) . O espaço do usuário pode interagir com Kprofiles ajustando o número do modo em /sys/kernel/kprofiles/kp_mode
. A tabela abaixo mostra qual número de modo corresponde ao modo de perfil.
Modo de perfil | Número do modo |
---|---|
Desativado (padrão) | 0 |
Bateria | 1 |
Equilibrado | 2 |
Desempenho | 3 |
Além disso, Kprofiles fornece trocador automático de perfil (auto Kprofiles), que usa FB notifier
, MSM DRM notifier
ou MI DRM notifier
para impor o modo de perfil de bateria quando a tela do dispositivo desliga e volta ao modo anteriormente ativo quando o dispositivo é ativado. Os usuários podem desabilitar ou habilitar esse recurso em tempo de execução sem recompilar o kernel, alterando o valor bool em /sys/module/kprofiles/parameters/auto_kp
Kprofiles também possui funções de API para alternar perfis em resposta a qualquer evento no kernel. Para mais informações, consulte a tabela de APIs disponíveis
Kprofiles é testado em kernels Linux 3.10+
Se você estiver usando git
, usar git subtree
ou git submodule
é altamente recomendado.
Adicione este repositório a drivers/misc/kprofiles
Modificar drivers/misc/Kconfig
menu "Dispositivos diversos" fonte "drivers/misc/genwqe/Kconfig"+fonte "drivers/misc/kprofiles/Kconfig"fonte "drivers/misc/echo/Kconfig" menu final
Modificar drivers/misc/Makefile
obj-$(CONFIG_GENWQE) += genwqe/+obj-$(CONFIG_KPROFILES) += kprofiles/obj-$(CONFIG_ECHO) += echo/
Defina a função API que você precisa no arquivo necessário usando extern, Kprofiles pode ser usado em vários lugares, como por exemplo, impulsionando drivers, abaixo está um exemplo de uso de kprofiles em kernel/fork.c para controlar aumentos de CPU e DDR durante a bifurcação do zigoto usando kp_active_mode () API.
+ #ifdef CONFIG_KPROFILES+ extern int kp_active_mode(void);+ #endif/* * Ok, esta é a rotina principal do fork. * * Ele copia o processo e, se for bem-sucedido, inicia * e espera que ele termine de usar a VM, se necessário. */ longo _do_fork(clone_flags longos não assinados, stack_start longo não assinado, stack_size longo não assinado, int __usuário *parent_tidptr, int __usuário *filho_tidptr, tls longos não assinados) { estrutura tarefa_struct *p; traço interno = 0; número longo; /* Aumenta a CPU ao máximo por 50 ms quando o espaço do usuário inicia um aplicativo */ if (task_is_zygote (atual)) {- cpu_input_boost_kick_max (50); - devfreq_boost_kick_max (DEVFREQ_MSM_LLCCBW, 50); - devfreq_boost_kick_max (DEVFREQ_MSM_CPUBW, 50); e DDR por 60ms se o modo de desempenho estiver ativo.+ * Aumente CPU e DDR por 50ms se o modo padrão estiver ativo para manter o comportamento padrão.+ * Aumente CPU e DDR por 25ms se o perfil balanceado estiver ativado+ * Não aumente CPU e DDR se economizar bateria perfil está habilitado+ */+ switch (kp_active_mode()) {+ case 0:+ cpu_input_boost_kick_max(60);+ devfreq_boost_kick_max (DEVFREQ_MSM_LLCCBW, 50); + devfreq_boost_kick_max (DEVFREQ_MSM_CPUBW, 50); + quebra; + caso 2: + cpu_input_boost_kick_max (60); 25);+ devfreq_boost_kick_max(DEVFREQ_MSM_CPUBW, 25);+ pausa;+ caso 3:+ cpu_input_boost_kick_max(60);+ devfreq_boost_kick_max(DEVFREQ_MSM_LLCCBW, 60);+ | );+ devfreq_boost_kick_max(DEVFREQ_MSM_CPUBW, 50);+ #endif
e você está pronto para ir!
Info : Esta função retorna um número de 0 e 3 dependendo do perfil selecionado. Pode ser usado em condições para regular impulsos e outras coisas.
Argumentos : Nenhum
Exemplo :
#include <linux/kernel.h>#include <linux/cpufreq.h>#ifdef CONFIG_KPROFILESextern int kp_active_mode(void);void example_function(void) { // Com base no modo de perfil ativo, ajuste os recursos ou configurações do kernel switch (kp_active_mode()) { case 1: // Coisas a serem feitas quando o perfil da bateria está ativo break; case 2: // Coisas a serem feitas quando o perfil de saldo está ativo break; case 3: // Coisas a serem feitas quando o perfil de desempenho está ativo break; default: // Coisas a serem feitas quando o kprofiles está desabilitado ou o perfil padrão está ativo break; } }#endif
Informações : Esta função pode ser usada para alterar o perfil para qualquer modo durante qualquer evento no kernel.
Argumentos :
level
:
tipo: int não assinado
definição: O número do modo para o qual alternar.
Exemplo :
vazio exemplo_função(vazio) { if (required_kernel_event()) { // Mudar para perfil de bateria (modo 0) kp_set_mode(1); printk(KERN_INFO "Alterado para perfil de bateria (modo 1)n"); } else { // Muda para perfil balanceado (modo 1) kp_set_mode(2); printk(KERN_INFO "Alterado para perfil balanceado (modo 2)n"); } }
Informações : Esta função pode ser usada para alterar o perfil para qualquer modo por um período específico de tempo durante qualquer evento no kernel e, em seguida, retornar ao modo ativo anteriormente.
Argumentos :
level
:
tipo : int não assinado
definição : o número do modo para o qual alternar.
duration_ms
:
tipo : int não assinado
definição : a quantidade de tempo (em milissegundos) que o modo especificado deve estar ativo antes de voltar ao modo usado anteriormente.
Exemplo :
vazio exemplo_função(vazio) { if (required_kernel_event()) { // Muda para o perfil de desempenho (modo 3) por 50 ms kp_set_mode_rollback(3, 50); printk(KERN_INFO "Alterado para perfil de desempenho por 50msn"); } }
Informações : Este notificador de eventos básico permite a execução de uma sequência de código assim que um modo de perfil é alterado por meio de APIs do usuário ou do kernel. Isto pode ser vantajoso para executar uma série de tarefas de maneira sincronizada após uma mudança de modo.
Exemplo :
extern unsigned int KP_MODE_CHANGE;extern int kp_notifier_register_client(struct notifier_block *nb);extern int kp_notifier_unregister_client(struct notifier_block *nb);static int kp_mode_notifier_callback(struct notifier_block *nb, evento longo não assinado, void *dados) { unsigned int profile_mode = (unsigned int)dados; if (event == KP_MODE_CHANGE) { switch (profile_mode) { case 1: // Coisas a serem feitas quando o perfil da bateria está ativo break; case 2: // Coisas a serem feitas quando o perfil balanceado estiver ativo break; case 3: // Coisas a serem feitas quando o perfil de desempenho está ativo break; default: // Coisas a serem feitas quando o kprofiles está desabilitado ou o perfil padrão está ativo break; } } retornar NOTIFY_OK; }estrutura estática notifier_block kp_mode_notifier = { .notifier_call=kp_mode_notifier_callback, };static int __init exemplo_driver_init(void) { // Registra o módulo do driver como cliente do notificador de eventos Kprofiles kp_notifier_register_client(&kp_mode_notifier); retornar 0; }static void __exit exemplo_driver_exit(void) { // Cancela o registro do módulo do driver como cliente do notificador de eventos Kprofiles kp_notifier_unregister_client(&kp_mode_notifier); }module_init(example_driver_init);module_exit(example_driver_exit);
Você pode contribuir com o Kprofiles enviando-nos solicitações pull com as alterações. Forneça uma mensagem precisa com o commit explicando por que você está fazendo a alteração.
Este projeto está licenciado sob GPL-2.0.
Dakkshesh: autor/mantenedor do módulo do kernel
Cyberknight777: Co-mantenedor do módulo do kernel | Mantenedor do Gerenciador Kprofiles
Vyom Desai: Kprofiles Manager (pacote rom) Autor/Mantenedor
Martin Valba: Kprofiles Manager (aplicativo independente) Autor/mantenedor
Someone5678: Kprofiles Manager (pacote rom) Co-mantenedor