В каком контексте находятся softirq и tasklet? - PullRequest
14 голосов
/ 21 августа 2011

Я знаю, что есть контекст процесса и контекст прерывания, но я не понимаю, при выполнении softirq или тасклета, в каком контексте он запускается.

Я видел, как некоторые люди используют термин "контекст нижней половины", если такой термин есть, в чем разница с другими.

Еще один вопрос к softirq и тасклету: почему во время выполнения не разрешено спать ??

Может кто-нибудь помочь мне определить эти вопросы, спасибо !!

Ответы [ 3 ]

16 голосов
/ 21 августа 2011

Softirq и тасклет являются разновидностями механизма нижних половин.Сон не разрешен, потому что они работают в контексте прерывания, а не в контексте процесса.Если режим сна разрешен, Linux не может их запланировать и, наконец, вызвать панику ядра с ошибкой dequeue_task.Контекст прерывания даже не имеет структуры данных, описывающей информацию о регистре, поэтому они никогда не могут планироваться linux.Если он разработан с такой структурой и может быть запланирован, производительность процесса обработки прерываний будет затронута.

12 голосов
/ 25 ноября 2011

@ kai: ваш qs reg, в каких контекстных нижних половинах выполняется?

Технически, do программы softirq работают в контексте прерывания - контекст "softirq"; просто это не «hard-irq» контекст (который является контекстом, когда происходит аппаратное прерывание).

Итак, в обработчике softirq в терминах макросов 'lookup' Linux предоставляет:

in_interrupt: да | in_irq: нет | in_softirq: да | in_serving_softirq: да

Но будьте осторожны (будьте осторожны !!! :): «Все ограничения, которые применяются к обработчикам прерываний, также применяются к нижним половинам. Таким образом, нижние половины не могут спать, не могут получить доступ к пользовательскому пространству и не могут вызвать планировщик». - LDD3.

Джермейн отвечает на остальную часть вашего вопроса.

[Update] Кроме того, я хотел бы отметить, что можно определить простые и элегантные макросы, которые помогают печатать отладочную информацию по мере необходимости. За эти годы я поместил эти макросы и вспомогательные процедуры в заголовочный файл; Вы можете проверить это и скачать здесь: «Заголовок удобства» .

Есть макросы / функции для:

  • сделать отладочную распечатку вместе с funcname / line # info (через обычный printk () или trace_printk ()) и только если включен режим отладки
    • сбросить стек режима ядра
    • печать текущего контекста (обрабатывать или прерывать вместе с флагами в форме, которую использует ftrace )
    • простой макрос assert () (!)
    • DELAY_LOOP с интенсивным использованием процессора (полезно для тестовых установок, которые должны вращаться на процессоре)
    • эквивалентно режиму сна пользовательского режима
    • функция для расчета дельты времени по двум временным меткам (временные структуры)
    • преобразовать десятичную в двоичную и
    • еще несколько.

Вот так: -)

6 голосов
/ 17 октября 2014

Я согласен с принятым ответом и ответом Кайвана, но они не упомянули ksoftirqd.Если центральный процессор находится под большой нагрузкой программных и / или тасклетов, он планирует свой поток ksfotirqd, который обрабатывает поднятые программные компоненты и тасклеты в контексте процесса.

Поэтому я думаю, что ответом на вопрос ОП будет:работать в контексте прерывания или процесса.

...