2014-03-30 3 views
1

В модуле ядра Linux Я пытаюсь изменить код, который говорит:down_interruptible Не Рабочая

down(&semaphore1); 

down(&semaphore2); 

    critical code here! 

up(&semaphore2); 

up(&semaphore1); 

Чтобы использовать down_interruptible();

if(down_interruptible(&semaphore1)) 
    return -ERESTARTSYS; 

if(down_interruptible(&semaphore2)) 
    return -ERESTARTSYS; 

    critical code here! 

up(&semaphore2); 

up(&semaphore1); 

Является ли это правильный путь, чтобы перейти от " лишен "down до down_interruptible?

Я не понимаю, что делает return -ERESTARTSYS;, но для меня кажется, что он выводит мой модуль ядра и позволяет ядру делать некоторые другие вещи, пока мой модуль ядра не проснется снова, не так ли?

ответ

3

Все хорошо, кроме одного: вы должны освободить semaphore1 до того второго возвращения:

if(down_interruptible(&semaphore1)) 
    return -ERESTARTSYS; 

if(down_interruptible(&semaphore2)) { 
    up(&semaphore1); 
    return -ERESTARTSYS; 
} 

    critical code here! 

up(&semaphore2); 

up(&semaphore1); 

Описание об использовании ERESTARTSYS см the answer.

В общем, down_interruptible может быть прерван сигналом в приложении пользовательского пространства. Вернув ERESTARTSYS, вы сообщите ядру обработать сигнал и снова вызвать драйвер. Если вы не отпустите semaphore1, второй вызов драйвера будет блокироваться на семафоре1.