2009-06-30 10 views
14

In meinem Fahrer file_operations Struktur, die ich habe:unlocked_ioctl vs normalen ioctl

struct file_operations Fops = { 
    read: device_read, 
    write: device_write, 
    unlocked_ioctl: device_ioctl, 
    ... 
}; 

D.h. Es wird kein ioctl-Feld verwendet. Ist das ausreichend um Big Kernel Lock zu vermeiden und ohne Synchronisation in device_ioctl() einzutreten? Oder muss ich ioctl() Aufrufe im Userspace-Teil des Codes auch ändern?

+0

Ist das wirklich gültige Syntax? Es sollte eher wie '.read = device_read,' usw. sein. – ephemient

+0

ja, es funktioniert einfach –

+1

@ephemient: Die 'Name: Wert'-Syntax ist eine alte gcc-Erweiterung, implementiert vor C99 hinzugefügt designed Initializers mit dem aktuellen' .name = Wert-Syntax. –

Antwort

7

Uhm, das habe ich gelöst. Es ist auch erforderlich, die Signatur der Funktion device_ioctl zu ändern. Es gibt keinen Inode-Parameter und die Funktion sollte auch lange zurückgeben. Genau wie im folgenden Patch:

-static int st_ioctl(struct inode *inode, struct file *file, 
- unsigned int cmd_in, unsigned long arg) 
+static long st_ioctl(struct file *file, unsigned int cmd_in, unsigned long arg) 
{ 

(aus: http://linux.derkeiler.com/Mailing-Lists/Kernel/2008-01/msg06799.html)

10

Lesen Sie diesen Artikel LWN: http://lwn.net/Articles/119652/

auch irgendwann zwischen 2.6.33 und 2.6.35 rc (Verwendung git-diff um herauszufinden, welcher Commit) der Kernel jetzt WARNs wenn nur .ioctl definiert ist.

Dies ist ein Schritt zu mehr expliziten und feinkörnigen Sperren. Beachten Sie auch, dass nur die Funktionssignatur und der Zeiger kompiliert werden, aber die Möglichkeit von Race-Bedingungen (zwei Userspace-Apps, die gleichzeitig ioctl-Aufrufe ausführen) eingeführt wird.

+4

Ab 2.6.38 (vielleicht früher) ist .ioctl weg. Sie haben jetzt keine andere Wahl, als .unlocked_ioctl zu verwenden. – goertzenator

8

Andi Kleem hat ein neues Rezept für eine schnelle und unsaubere Umwandlung von Code ioctl-unlocked_ioctl auf Linux-Kernel-Mailingliste:

[JANITOR PROPOSAL] Switch ioctl functions to ->unlocked_ioctl

Das Rezept wird erläutert, wie die Funktion der Parameter optimieren und Sperreinsatz und Entsperren von Anrufen.