2010-12-10 5 views
0

In Userspace kann ich nur echo noop > /sys/block/sda/queue/scheduler.Wie sysfs im Kernelmodul zu verwenden?

Wie macht man dasselbe in einem Kernelmodul?

Ich erwarte, dass so etwas wie dieser (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 */ 

Wie es richtig zu implementieren?

Mein Kernel-Modul registriert nur SysRQ Handler und sollte die io-Scheduler konfigurieren, wenn das SysRQ ausgelöst wird (User-Space-Programme können zu dieser Zeit wegen des schlechten io-Scheduler gehängt werden)

+0

NR. Was auch immer Sie tun, dies ist mit ziemlicher Sicherheit der falsche Weg. – ephemient

Antwort

0

Es gibt einfach keine Möglichkeit, es richtig zu implementieren. Wenn Sie es trotzdem tun möchten, und auch den Grund verstehen, warum es eine schlechte Idee (tm) ist, siehe

+0

Der Artikel befasst sich hauptsächlich mit dem Schreiben und Lesen von Dateien im Kernel. (Ich habe bereits versucht, http://stackoverflow.com/questions/1184274/kernelhow-to-read-write-files-within-kernel-module/1184346#1184346 zu implementieren, aber es geriet in Panik). Es wird irgendwo gesagt, dass sysfs Inhalt aus kobjects besteht. Es sollte also besser innerhalb des Kerns handhabbar sein. –

1

Wenn Sie etwas konfigurieren möchten für Ihr Kernel-Modul, können Sie dies in einem Wrapper-Skript, das Ihr Kernel-Modul mit insmod Befehl einfügen.

Und haben einen Blick auf this Artikel, in dem es sagen: „Warum es schlecht ist, Dateien von Kernel zu schreiben“

+0

Nein, es ist keine Konfiguration meines Kernelmoduls. Mein Modul möchte etwas anderes konfigurieren. –

-1

Falsches falsch falsch. sysfs ist eine Schnittstelle zu Benutzerbereich, Sie sollten es nicht im Kernel verwenden.

Wenn Ihr Modul den Blockscheduler ändern möchte, sollten Sie herausfinden, wie Sie das im Kernel tun können, z. Wenn ein Benutzer schreibt an /sys/block/sda/queue/scheduler einige Kernel-Code ausgeführt wird, sollten Sie diesen Code direkt aufrufen.

Nachdem gesagt, dass dies wie eine schlechte Idee scheint, wie werden Sie zum Beispiel mit mehreren Block-Geräten umgehen?

+0

Ja, der richtige Weg wird wahrscheinlich sein, über Geräte zu iterieren und den Scheduler von Spezial auf Normal zu ändern. (Tatsächlich endete ich mit User-Space-Helfer und es scheint nicht zu hängen, wenn der größte Teil des Systems stecken bleibt). P.S. der io scheduler hängt das Block-Gerät absichtlich auf "HDD runterdrehen und nicht hochfahren bis zum expliziten Befehl") –

+0

Wenn Sie sicherstellen wollen, dass der Userspace-Helfer nicht hängen bleibt, können Sie ihn "mlockall()" halten Öffnen Sie die fragliche sysfs-Datei (so dass Sie nicht bei der Traversierung über '/' hängen bleiben) – bdonlan

Verwandte Themen