#linux-kernel
#linux-ядро
Вопрос:
У меня есть очередь ожидания, определенная в модуле ядра, над которым я работаю:
static DECLARE_WAIT_QUEUE_HEAD(WaitQ);
в init_module()
процедуре я создаю новый поток ядра, который выводится на консоль каждые несколько секунд.
В моем cleanup_module
я установил переменную, которая сообщает потоку о завершении, а затем имеет sleep_on(amp;WaitQ)
в качестве последней строки cleanup_module
. Затем в потоке wake_up(amp;WaitQ)
вызывается процедура, когда переменная, установленная в cleanup_module
, имеет значение true, а затем complete_and_exit
завершает поток.
Мой вопрос. когда вызывается sleep_on(amp;WaitQ), что добавляется к WaitQ. Это модуль в целом или это поток, запущенный в init_module?
Ответ №1:
Ни то, ни другое — в очередь добавляется поток (задача) процессора «rmmod», который вызвал удаление модуля.
Комментарии:
1. Извините, я новичок во всем этом, поэтому я не совсем понимаю. Итак, в моем случае, когда вызывается sleep_on, процедура, которую я определил, все еще работает, так что же на самом деле спит в этом случае?
2. Задача утилиты «rmmod», которая вызвала системный вызов, вызвавший вызов cleanup_module.
3. хорошо, итак, sleep_on вызывается для перевода задачи в спящий режим, чтобы дождаться выполнения процедуры, которую я начал, чтобы закончить то, что она делает. Процедура вызывает wake_up(amp;WaitQ), чтобы разбудить задачу, чтобы сообщить ей, что она завершила выполнение, а затем может перейти к завершению_and_exit, завершающему поток. После этого модуль удаляется. Правильно ли это звучит?
4. Я не знаю, правильно это или нет (нужно увидеть фактический код, подумать об условиях гонки, поддержке SMP и т. Д.), Но похоже, что я понимаю, что происходит.