Comment utiliser Linux File d'attente de Travail
Linux files d'attente de travail sont destinés à être de niveau noyau fils avec le contexte de processus. J'ai essayé de l'utiliser comme une alternative à kthread qui n'a pas de contexte de processus. Mais comment puis-je passer des données à la file d'attente de travail? work_struct a un champ de données, qui est de type atomic_long_t. Je ne pouvais pas passer pointeur vers ce domaine. Comment dois-je faire?
Aussi je ne pouvais pas trouver un seul exemple concret de la file d'attente de travail. Pouvez-vous suggérer?
Un super blog qui explique toutes les règles de base du noyau linux concept avec des exemples: tuxthink.blogspot.co.il/2011/09/workqueues-1-introduction.html tuxthink.blogspot.co.il/2011/09/workqueue-2-declarework.html tuxthink.blogspot.co.il/2011/09/...
Le blog ci-dessus est plein de annonces et de fautes de frappe... Voici une meilleure référence (LDD3): safaribooksonline.com/library/view/linux-device-drivers/...
Le blog ci-dessus est plein de annonces et de fautes de frappe... Voici une meilleure référence (LDD3): safaribooksonline.com/library/view/linux-device-drivers/...
OriginalL'auteur max | 2011-10-29
Vous devez vous connecter pour publier un commentaire.
Si vous souhaitez transmettre des données à votre file d'attente de travail, juste incorporer le
work_struct
structure à l'intérieur de votre propre structure de données et l'utilisationcontainer_of
à l'intérieur de votre fonction de travail pour le récupérer.Comme pour un exemple simple, le noyau est plein de peine
git grep work_struct
. Vous pouvez regarderdrivers/cpufreq/cpufreq.c
(handle_update
fonction) pour un exemple simple. L'article ci-dessous intègre un exemple à la fin, mais il n'utilise pascontainer_of
et repose plutôt sur le fait que le premier membre d'une structure a la même adresse que son parent:http://www.ibm.com/developerworks/linux/library/l-tasklets/index.html
OriginalL'auteur Gnurou
Il semble être résolu, et vous avez été très utile pour moi afin de comprendre comment utiliser les Files d'attente de Travail. Je vous donne un peu de code d'un exemple simple dans mon github, en espérant qu'il sera utile à tout le monde:
https://github.com/m0r3n/kernel_modules/blob/master/workQueue.c
Vous pouvez compiler avec le Makefile suivant:
Insérez le module par:
Et voir les logs:
EDIT:
J'ai juste ajouté le retard de la version:
https://github.com/m0r3n/kernel_modules/blob/master/workQueueDelayed.c
OriginalL'auteur Fernando
Par défaut, la fonction est appelée avec travail a frappé comme paramètre.
À l'intérieur du filetage de l'élément de données de la structure peut être facilement obtenu.
Aussi un Gnurou, pour obtenir l'accès de plus de données, le travail struct peut être mis à l'intérieur d'une mise en œuvre spécifique de la structure et de l'utilisation du container de la macro à l'intérieur de la discussion de tous les données peuvent être accessibles.
Une simple description de workqueue
worqueue sont la gestion des interruptions moitié inférieure mechanishm, où une partie de ce travail est donné à un thread du noyau pour exécuter plus tard avec preemtion sur les interruptions de l'activer.
Un percpu fil des événements/n est créé par le noyau , les threads peuvent également être créés par les pilotes de code.Une structure est utilisée pour identifier le fil, un paramètre important à l'intérieur de la structure est le nom du champ.Il contient également un par uc structure qui contient à son tour l'waitqueue tête sur lequel le thread attend et une liste de liens pour ajouter de la structure qui définit le travail c'est à dire la fonction et les données .Le thread obtient de cette structure que le paramètre d'entrée.Le thread s'exécute et d'attendre sur le waitqueue pour que quelqu'un réveil le fil. Une structure de travail est créé définition de la fonction . Lorsqu'un
workqueue est l'annexe, la structure est ajouté à la queue de la liste de liens et le thread est réveillé. En se réveillant, le thread s'exécute par le biais de la liste de liens définis dans le par uc de la structure et de commencer à exécuter les fonctions définies avec la structure de travail en tant que paramètre. Après l'exécution, il supprime l'entrée de la liste de liens.
OriginalL'auteur Surajit