2009-06-30 16 views
14

W file_operations struktury mojego kierowcy, mam:unlocked_ioctl vs normalnej ioctl

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

Tj nie ma użytego pola ioctl. Czy to wystarcza, aby uniknąć Big Kernel Lock i wejść do device_ioctl() bez jakiejkolwiek synchronizacji? Czy muszę również zmieniać wywołania funkcji ioctl() w części przestrzeni użytkownika?

+0

Czy to naprawdę poprawna składnia? Powinien być bardziej podobny do '.read = device_read,' itp. – ephemient

+0

tak, to po prostu działa –

+1

@ephemient: Składnia 'name: value' to stare rozszerzenie gcc, zaimplementowane zanim C99 doda wyznaczone inicjalizatory z bieżącym' .name = składnia wartości. –

Odpowiedz

7

Uhm, rozwiązałem to. Wymagana jest również zmiana sygnatury funkcji device_ioctl. Nie ma parametru i-węzła, a także funkcja powinna zwracać się długo. Podobnie jak w następujących 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) 
{ 

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

10

przeczytać ten artykuł LWN: http://lwn.net/Articles/119652/

też kiedyś między 2.6.33 i 6.2.35 RC (użyj git-diff aby dowiedzieć się, które zatwierdzenie) jądro jest teraz WARNs, gdy zdefiniowana jest tylko .ioctl.

Jest to krok w kierunku bardziej wyraźnego i drobnoziarnistego blokowania. Zwróć też uwagę tylko na zmianę sygnatury funkcji i wskaźnika, ale wprowadzi możliwość warunków wyścigu (dwie aplikacje przestrzeni użytkownika wykonujące jednocześnie wywołania ioctl).

+4

Od wersji 2.6.38 (być może wcześniej), .ioctl zniknął. Teraz nie masz wyboru, musisz użyć .unlocked_ioctl. – goertzenator

Powiązane problemy