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