cleanup_module ядро linux

#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 и т. Д.), Но похоже, что я понимаю, что происходит.