2010-12-10 4 views
0

Dans l'espace utilisateur je peux juste echo noop > /sys/block/sda/queue/scheduler. Comment faire la même chose à l'intérieur d'un module noyau?Comment utiliser sysfs dans le module du noyau?

Je me attends quelque chose comme ça (pseudo-code):

struct dentry* e = sysfs_get_root(); 
vfs_path_lookup(e, ????, "block/sda/queue/scheduler", ???); 
????; 
struct something* q = ????; 
????->store(q, "noop", 1); 
/* some cleanup */ 

Comment mettre en œuvre correctement?

Mon module noyau enregistre tout gestionnaire sysrq et doit configurer le planificateur io lorsque ce sysrq est déclenché (programmes de l'espace utilisateur peuvent être suspendus à ce moment-là à cause du mauvais io-scheduler)

+0

NO. Quoi que vous fassiez, c'est certainement la mauvaise façon de le faire. – ephemient

Répondre

0

Il n'y a aucun moyen de le mettre en œuvre correctement. Si vous voulez le faire de toute façon, et aussi comprendre la raison pour laquelle c'est une mauvaise idée (tm), voir ceci article

+0

L'article concerne principalement l'écriture et la lecture de fichiers dans le noyau. (J'ai déjà essayé d'implémenter http://stackoverflow.com/questions/1184274/kernelhow-to-read-write-files-within-kernel-module/1184346#1184346, mais il a paniqué). Il est dit quelque part que le contenu de sysfs est constitué de kobjets. Donc, il devrait être mieux gérable depuis l'intérieur du noyau. –

1

Si vous souhaitez configurer quelque chose pour votre module noyau, vous pouvez le faire dans un script wrapper qui insère votre module noyau en utilisant la commande insmod.

Et un coup d'oeil à this article où il dit « Pourquoi est-il mauvais d'écrire des fichiers à partir du noyau »

+0

Non, ce n'est pas la configuration de mon module noyau. Mon module veut configurer autre chose. –

-1

Mauvais. sysfs est une interface à l'espace utilisateur, vous ne devriez pas l'utiliser dans le noyau.

Si votre module veut changer le planificateur de blocs, alors vous devriez trouver comment le faire dans le noyau, c'est-à-dire. Quand un utilisateur écrit /sys/block/sda/queue/scheduler, un code noyau est exécuté, vous devriez appeler ce code directement. Après avoir dit que cela semble être une mauvaise idée, comment allez-vous gérer plusieurs périphériques de bloc par exemple?

+0

Oui, la bonne façon sera probablement itérer sur les périphériques et changer le programmateur de spécial à habituel. (En fait, je me suis retrouvé avec un assistant d'espace utilisateur et il semble ne pas se bloquer quand la plupart du système est bloqué). P.S. le planificateur io bloque délibérément le périphérique de bloc pour "ralentir le disque dur et ne pas tourner jusqu'à la commande explicite") –

+0

Si vous voulez vous assurer que l'assistant de l'espace utilisateur ne se bloque pas, vous pouvez le 'mlockall()' et garder un handle ouvrir le fichier sysfs en question (donc vous ne serez pas bloqué sur traversal à travers '/') – bdonlan

Questions connexes