В случае tasklet_schedule:
Мы не хотим, чтобы прерывание мешало нам при планировании тасклета, поэтому мы должны его отключить. Но мы также знаем, что, когда мы закончили планирование тасклета, мы хотим вернуться к состоянию IRQ, как это было до вызова тасклета расписания. Чтобы достичь этого, мы сохраняем состояние регистра IRQ перед тем, как что-либо делать, затем отключаем IRQ согласно нашему требованию, выполняем планирование, теперь перед тем, как вернуться, восстановим состояние IRQ и затем вернемся из функции.
Теперь перейдем к сложной части. Почему нам не нужно сохранять IRQ при выполнении тасклета, т.е. когда обработчик вызывает функцию тасклета?
Чтобы понять, что нам нужно взглянуть на два разных абзаца:
На стр. 141:
Обработчики softirq работают с включенными прерываниями и не могут
sleep . Пока работает обработчик, softtirq на текущем процессоре
Другой процессор, однако, может прекрасно выполнять другие программы. Если
то же самое softirq поднимается снова во время выполнения, другой
процессор может запустить его одновременно.
Таким образом, это объявляет, что прерывания всегда включены.
Теперь перейдем к стр. 143:
- Отключить локальную доставку прерываний (нет необходимости сначала сохранять их состояние , потому что код здесь всегда вызывается как softirq
обработчик и прерывания всегда включены) и извлекает
tasklet_vec или tasklet_hi_vec для этого процессора
Таким образом, мы можем заключить, что нам не нужно сохранять состояние IRQ, поскольку мы уже знаем его состояние, и оно останется таковым при всех условиях, поэтому мы просто отключаем IRQ и включаем его позже.