2009-06-30 15 views
14

Dans mon pilote structure file_operations, j'ai:unlocked_ioctl vs ioctl normale

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

à savoir il n'y a pas de champ ioctl utilisé. Est-ce suffisant pour éviter Big Kernel Lock et entrer dans device_ioctl() sans aucune synchronisation? Ou dois-je également modifier les appels ioctl() dans la partie espace utilisateur du code?

+0

Est-ce vraiment une syntaxe valide? Cela devrait ressembler plus à '.read = device_read,' etc. – ephemient

+0

oui, ça marche tout simplement –

+1

@ephemient: La syntaxe 'name: value' est une ancienne extension gcc, implémentée avant que C99 ajoute des initialiseurs désignés avec l'actuel' .name = value' syntaxe. –

Répondre

7

Uhm, j'ai résolu ceci. Il est également nécessaire de changer la signature de la fonction device_ioctl. Il n'y a pas de paramètre inode, et la fonction devrait aussi retourner longtemps. Tout comme dans la suite 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) 
{ 

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

10

Lire cet article LWN: http://lwn.net/Articles/119652/

également quelque part entre 2.6.33 et 2.6.35 rc (utilisation git-diff pour savoir quel commit) le noyau WARNs maintenant lorsque seul .ioctl est défini.

Il s'agit d'un mouvement vers un verrouillage plus explicite et plus précis. Notez également que seule la modification de la signature de la fonction et du pointeur sera compilée mais introduira la possibilité de conditions de course (deux applications de l'espace utilisateur effectuant des appels ioctl en même temps).

+4

A partir du 2.6.38 (peut-être plus tôt), .ioctl est parti. Vous n'avez plus d'autre choix que d'utiliser .unlocked_ioctl. – goertzenator

8

Andi Kleem a posté une recette pour une conversion rapide et sale de code à l'aide ioctl-unlocked_ioctl sur la liste de diffusion du noyau Linux:

[JANITOR PROPOSAL] Switch ioctl functions to ->unlocked_ioctl

La recette explique comment modifier les paramètres de la fonction et insérer verrouillage et déverrouillage des appels.