LINUX.ORG.RU

poll внутри ядра

 , ,


0

7

Привет. Суть такова: пытаюсь понять как работает poll в ядре. В целом всё ясно, но есть один момент который не могу отследить.

Например, у нас есть 100 дескрипторов которые юзер хочет пополлить. Ядро начинает бежать по переданным дескрипторам и вызывать fops->poll(), внутри которого драйвер «регистрирует» свои waitqueue_head в полл-таблице (+ poll аллоцирует внутреннюю waitqueue и добавляет ее в переданный waitqueue_head) и возвращает текущую event-mask. Допустим poll уже зарегистрировал 99 дескрипторов и все они не готовы для работы (revents = 0). В это время из другого потока совершилась какая-то операция и первый дескриптор стал готов для работы, т.е. драйвер позвал wake_up на свой waitqueue_head, который поидеи должен разбудить и поллящийся тред, но тред и так не спит, т.к. еще не обработал все дескрипторы. Собственно после этого тред обрабатывает последний дескриптор, тот тоже возвращает 0.

Поидеи poll должен пересканить файлы и вернуть управление юзеру, но судя по коду он отправляется спать. Я что-то упустил и такой кейс как-то отслеживается или на него забивают/он невозможен?



Последнее исправление: oh-la-la (всего исправлений: 2)

Да, подпишусь.

Если я понял о чем ты, доспрошу — а есть какой-то способ поймать что все дескрипторы готовы к работе? И только после этого начинать свои пляски в прилаге.

deep-purple ★★★★★
()
Ответ на: комментарий от deep-purple

Ну если в кратце, то меня интересует возможна ли ситуация, когда дескриптор стал готов во время работы сискола, но poll этого не увидел и усыпил тред.

oh-la-la
() автор топика

Судя по тому алгоритму, что вы описали, wake_up в этом случае должен опосредованно ставить событие необходимости дальнейшей обработки для треда, обрабатывающего poll, чтобы тот не заснул, закончив с пустыми руками работу.

Sorcerer ★★★★★
()
Ответ на: комментарий от Sorcerer

Да-да, все так и есть. В wake_up функции выставляется флажок triggered, я не обратил внимание где он используется:

set_current_state(state);
if (!pwq->triggered)
    rc = schedule_hrtimeout_range(expires, slack, HRTIMER_MODE_ABS);
__set_current_state(TASK_RUNNING);

Теперь все сходится.

oh-la-la
() автор топика
Ответ на: комментарий от deep-purple

а есть какой-то способ поймать что все дескрипторы готовы к работе?

Может, тебе нужно просто блокируемое IO?

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

На самом деле мне пока сейчас ничего не нужно, я таки просто интересуюсь. И судя по кол-ву подписавшихся — не я один.

deep-purple ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.