2009-06-30 7 views
14

In struttura file_operations del mio autista, ho:unlocked_ioctl vs ioctl normale

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

Vale a dire non esiste un campo ioctl usato. È sufficiente per evitare Big Kernel Lock ed entrare in device_ioctl() senza alcuna sincronizzazione? O devo cambiare anche le chiamate ioctl() nella parte userspace del codice?

+0

Questa sintassi è veramente valida? Dovrebbe essere più simile a '.read = device_read,' ecc. – ephemient

+0

sì, funziona solo –

+1

@ephemient: la sintassi 'name: value' è una vecchia estensione gcc, implementata prima che C99 aggiungesse inizializzatori designati con l'attuale' .name = sintassi value'. –

risposta

7

Uhm, ho risolto questo. È inoltre necessario modificare la firma della funzione device_ioctl. Non esiste un parametro inode e anche la funzione dovrebbe tornare a lungo. Proprio come nel seguente 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) 
{ 

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

10

Leggi questo articolo LWN: http://lwn.net/Articles/119652/

anche a volte tra 2.6.33 e 2.6.35 rc (uso git-diff per scoprire quale commit) il kernel ora WARNs quando viene definito solo .ioctl.

Si tratta di un passaggio verso un blocco più esplicito ea grana fine. Si noti inoltre che la modifica della firma della funzione e del puntatore compileranno, ma introdurranno la possibilità di condizioni di gara (due app userspace che eseguono chiamate ioctl contemporaneamente).

+4

A partire dal 2.6.38 (forse prima), .ioctl è scomparso. Non hai altra scelta che usare .unlocked_ioctl. – goertzenator

8

Andi Kleem postato una ricetta per una conversione rapida e-sporco di codice utilizzando ioctl-unlocked_ioctl su Linux kernel mailing list:

[JANITOR PROPOSAL] Switch ioctl functions to ->unlocked_ioctl

La ricetta spiega come tweak parametri della funzione e inserire bloccaggio e sblocco di chiamate.