À propos
Version du noyau prise en charge
Usage
API disponibles
Comment contribuer
Licence
Notre équipe
Kprofiles est un simple module du noyau Linux qui peut être utilisé pour réguler les activités du noyau telles que les boosts qui ne sont normalement pas exposées à l'espace utilisateur. Kprofiles fonctionne de manière orientée profil. Il dispose donc de quatre modes de profil : Disabled
, Battery
, Balanced
et Performance
. Chaque mode se voit attribuer un numéro de mode. Les développeurs peuvent utiliser la fonction API Kprofiles dans des conditions permettant de limiter ou d'activer les tâches dans le noyau dans un certain mode de profil (consultez la section d'utilisation par exemple) . L'espace utilisateur peut interagir avec Kprofiles en ajustant le numéro de mode dans /sys/kernel/kprofiles/kp_mode
. Le tableau ci-dessous indique quel numéro de mode correspond au mode profil.
Mode Profil | Numéro de mode |
---|---|
Désactivé (par défaut) | 0 |
Batterie | 1 |
Équilibré | 2 |
Performance | 3 |
De plus, Kprofiles fournit un changeur de profil automatique (auto Kprofiles), qui utilise FB notifier
, MSM DRM notifier
ou MI DRM notifier
pour appliquer le mode profil de batterie lorsque l'écran de l'appareil s'éteint et revient au mode précédemment actif lorsque l'appareil se réveille. Les utilisateurs peuvent désactiver ou activer cette fonctionnalité au moment de l'exécution sans recompiler le noyau en modifiant la valeur bool dans /sys/module/kprofiles/parameters/auto_kp
Kprofiles dispose en outre de fonctions API pour changer de profil en réponse à tout événement interne au noyau. Pour plus d'informations, veuillez consulter le tableau des API disponibles
Kprofiles est testé sur les noyaux Linux 3.10+
Si vous utilisez git
, l'utilisation de git subtree
ou git submodule
est fortement recommandée.
Ajoutez ce référentiel à drivers/misc/kprofiles
Modifier drivers/misc/Kconfig
menu "Divers appareils" source "drivers/misc/genwqe/Kconfig"+source "drivers/misc/kprofiles/Kconfig"source "drivers/misc/echo/Kconfig" fin du menu
Modifier drivers/misc/Makefile
obj-$(CONFIG_GENWQE) += genwqe/+obj-$(CONFIG_KPROFILES) += kprofiles/obj-$(CONFIG_ECHO) += echo/
Définissez la fonction API dont vous avez besoin dans le fichier requis à l'aide de extern, les Kprofiles peuvent être utilisés à divers endroits comme par exemple pour booster les pilotes, vous trouverez ci-dessous un exemple d'utilisation de kprofiles dans kernel/fork.c pour contrôler les boosts du processeur et de la DDR pendant le fork de zygote en utilisant kp_active_mode ()API.
+ #ifdef CONFIG_KPROFILES+ extern int kp_active_mode(void);+ #endif/* * Ok, c'est la routine principale du fork. * * Il copie le processus et, en cas de succès, démarre * et attend qu'il ait fini d'utiliser la VM si nécessaire. */ long _do_fork(longs clone_flags non signés, stack_start long non signé, longue non signée stack_size, int __user *parent_tidptr, int __user *child_tidptr, tls longs non signés) { struct task_struct *p; trace int = 0 ; numéro long ; /* Augmente le CPU au maximum pendant 50 ms lorsque l'espace utilisateur lance une application */ if (task_is_zygote(current)) {- cpu_input_boost_kick_max(50);- devfreq_boost_kick_max(DEVFREQ_MSM_LLCCBW, 50);- devfreq_boost_kick_max(DEVFREQ_MSM_CPUBW, 50);+ #ifdef CONFIG_KPROFILES+ /*+ * Boost CPU et DDR pendant 60 ms si le mode performance est actif.+ * Boostez le CPU et la DDR pendant 50 ms si le mode par défaut est actif pour conserver le comportement par défaut.+ * Boostez le CPU et la DDR pendant 25 ms si le profil équilibré est activé+ * Ne pas augmenter le CPU et la DDR si le profil d'économie de batterie est activé+ */+ 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);+ break;+ cas 2 :+ cpu_input_boost_kick_max(60);+ devfreq_boost_kick_max(DEVFREQ_MSM_LLCCBW, 25);+ devfreq_boost_kick_max(DEVFREQ_MSM_CPUBW, 25);+ break;+ cas 3:+ cpu_input_boost_kick_max(60);+ devfreq_boost_kick_max(DEVFREQ_MSM_LLCCBW, 60);+ devfreq_boost_kick_max(DEVFREQ_MSM_CPUBW, 60);+ break;+ default:+ pr_info("Profil de batterie actif, saut de boost...n");+ break;+ }+ #else+ cpu_input_boost_kick_max(60);+ devfreq_boost_kick_max(DEVFREQ_MSM_LLCCBW, 50 );+ devfreq_boost_kick_max(DEVFREQ_MSM_CPUBW, 50);+ #endif
et vous êtes prêt à partir !
Info : Cette fonction renvoie un nombre de 0 à 3 selon le profil sélectionné. Il peut être utilisé dans des conditions permettant de réguler les boosts et d’autres choses.
Arguments : Aucun
Exemple :
#include <linux/kernel.h>#include <linux/cpufreq.h>#ifdef CONFIG_KPROFILESextern int kp_active_mode(void);void example_function(void) { // En fonction du mode de profil actif, ajustez les fonctionnalités du noyau ou le commutateur de paramètres (kp_active_mode()) { case 1 : // Choses à faire lorsque le profil de batterie est actif break ; cas 2 : // Choses à faire lorsque le profil d'équilibre est actif break ; cas 3 : // Choses à faire lorsque le profil de performances est actif break ; default: // Choses à faire lorsque kprofiles est désactivé ou que le profil par défaut est actif break; } }#endif
Info : Cette fonction peut être utilisée pour changer de profil dans n'importe quel mode donné lors de n'importe quel événement dans le noyau.
Arguments :
level
:
type : entier non signé
définition : le numéro de mode vers lequel basculer.
Exemple :
void exemple_fonction (vide) { if (required_kernel_event()) { // Passer au profil de batterie (mode 0) kp_set_mode(1); printk(KERN_INFO "Commuté en profil de batterie (mode 1)n"); } else { // Passer au profil équilibré (mode 1) kp_set_mode(2); printk(KERN_INFO "Commuté en profil équilibré (mode 2)n"); } }
Info : Cette fonction peut être utilisée pour changer de profil vers n'importe quel mode donné pendant une période de temps spécifique lors de tout événement dans le noyau, puis revenir au mode précédemment actif.
Arguments :
level
:
type : entier non signé
définition : Le numéro de mode vers lequel basculer.
duration_ms
:
type : entier non signé
définition : La durée (en millisecondes) pendant laquelle le mode spécifié doit être actif avant de revenir au mode précédemment utilisé.
Exemple :
void exemple_fonction (vide) { if (required_kernel_event()) { // Passer au profil de performances (mode 3) pendant 50 ms kp_set_mode_rollback(3, 50); printk(KERN_INFO "Passer au profil Performance pendant 50 msn"); } }
Info : Ce notificateur d'événement de base permet l'exécution d'une séquence de code dès qu'un mode de profil est modifié via les API utilisateur ou internes au noyau. Cela peut être avantageux pour effectuer une série de tâches de manière synchronisée suite à un changement de mode.
Exemple :
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, événement long non signé, void *data) { int non signé profile_mode = (int non signé)données ; if (event == KP_MODE_CHANGE) { switch (profile_mode) { case 1 : // Choses à faire lorsque le profil de batterie est actif break ; cas 2 : // Choses à faire lorsque le profil équilibré est en pause active ; cas 3 : // Choses à faire lorsque le profil de performances est actif break ; default: // Choses à faire lorsque kprofiles est désactivé ou que le profil par défaut est actif break; } } renvoie NOTIFY_OK ; }structure statique notifier_block kp_mode_notifier = { .notifier_call = kp_mode_notifier_callback, };static int __init exemple_driver_init(void) { // Enregistrez le module pilote en tant que client du notificateur d'événements Kprofiles kp_notifier_register_client(&kp_mode_notifier); renvoie 0 ; }static void __exit exemple_driver_exit(void) { // Désenregistrez le module pilote en tant que client du notificateur d'événements Kprofiles kp_notifier_unregister_client(&kp_mode_notifier); }module_init(exemple_driver_init);module_exit(exemple_driver_exit);
Vous pouvez contribuer à Kprofiles en nous envoyant des pull request avec les modifications. Veuillez fournir un message précis avec le commit expliquant pourquoi vous effectuez la modification.
Ce projet est sous licence GPL-2.0.
Dakkshesh : module noyau Auteur/Mainteneur
Cyberknight777 : Co-Mainteneur du module noyau | Responsable de la maintenance du gestionnaire Kprofiles
Vyom Desai : Kprofiles Manager (paquet rom) Auteur/Mainteneur
Martin Valba : Kprofiles Manager (application autonome) Auteur/Mainteneur
Someone5678 : Kprofiles Manager (paquet rom) Co-mainteneur