0

Je voudrais faire la queue plusieurs struct task_struct s dans mon pilote de périphérique de bloc. Ici, chaque task_struct correspond à un thread de niveau utilisateur qui utilise l'appel système ioctl() pour envoyer un tampon d'espace utilisateur à mon pilote de périphérique de bloc. Une fois que je fais la queue plusieurs task_struct s, je voudrais les garder dans la file d'attente jusqu'à ce qu'une condition particulière soit rencontrée (c'est-à-dire, le tampon a été écrit sur le disque). Donc, ma question est, comment mettre en file d'attente plusieurs task_struct s, les mettre en veille, puis réactiver un sous-ensemble de la task_struct s en attente lorsque certaines conditions sont remplies?Mettre en file d'attente plusieurs structures task_struct?

Répondre

0

Vous pouvez appeler kthread_create autant de fois que vous le souhaitez pour créer de nouveaux threads, puis appeler wake_up sur le sous-ensemble de threads souhaité.

+0

Je ne crée aucun thread de noyau. Les threads d'Userland appellent 'ioctl()'. Je veux bloquer l'appel à 'ioctl()' fait par chaque thread. Puisque des appels simultanés seront faits à 'ioctl()' par plusieurs threads, je veux mettre en file d'attente le task_struct correspondant à chacun de ces threads d'utilisateur et appeler une forme de sleep interruptible. Une fois qu'une condition est remplie, je veux réveiller ces threads (au moins un sous-ensemble d'entre eux). J'espère que cela rend ma question plus claire? – user745878

+1

Bien sûr, chacun des threads utilisateur entre dans votre fonction 'ioctl', et vous pouvez les faire aller dormir avec' wait_event_interruptible() 'ou quoi que ce soit. Chaque invocation de 'ioctl' alloue quel que soit le contexte que vous voulez conserver (ou alloue du contexte par fichier, ou autre), placez-le sur la file d'attente interne souhaitée (créez une liste et' list_add') ou comme vous voulez implémentez-le), puis appelez 'wake_up' pour chaque contexte d'utilisateur quand il devient prêt. – Roland

+0

Merci pour votre contribution, Roland! Le prochain problème est le _context_ lui-même. Dans mon code, plusieurs buffers de 256 octets sont fusionnés en une seule page de 4 Ko. Plusieurs de ces pages de 4 Ko font partie d'une seule «structure bio» (jusqu'à un maximum de 8 pages de 4 Ko) et sont ensuite soumises au disque. Une fois que cette BIO a été traitée, j'ai besoin de réveiller ** tous ** les task_struct qui ont contribué 256 octets vers l'IOB. Alors, comment est-ce que je garde la trace des threads dont j'ai besoin pour me réveiller car il pourrait y avoir beaucoup plus de threads mis en file d'attente simultanément. – user745878

Questions connexes