В каком контексте находятся softirq и tasklet?

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

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

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

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

Ответы

Ответ 1

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

Ответ 2

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

Технически, softirq запускается в контексте прерывания - контекст "softirq"; это просто не контекст "жесткого irq" (который является контекстом, когда происходит аппаратное прерывание).

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

in_interrupt: yes | in_irq: no | in_softirq: yes | in_serving_softirq: yes

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

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

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

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

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

Whew: -)

Ответ 3

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

Итак, я думаю, что ответ на вопрос OP был бы: softirqs может работать в контексте прерывания или процесса.