Когда сохранять состояния при работе с тасклетами? - PullRequest
0 голосов
/ 30 июня 2018

Я читаю разработку ядра Linux и запутался в главе тасклетов (https://doc.lagout.org/operating%20system%20/linux/Linux%20Kernel%20Development%2C%203rd%20Edition.pdf стр. 143). В функции tasklet_schedule состояние прерывания сохраняется, а в taslet_action - нет. Автор объясняет, что контекст не сохраняется в taslet_action, потому что функция знает, что прерывания всегда включены. Я не понимаю, как набор прерываний мешает сохранению контекста? Спасибо!

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

В случае tasklet_schedule:

Мы не хотим, чтобы прерывание мешало нам при планировании тасклета, поэтому мы должны его отключить. Но мы также знаем, что, когда мы закончили планирование тасклета, мы хотим вернуться к состоянию IRQ, как это было до вызова тасклета расписания. Чтобы достичь этого, мы сохраняем состояние регистра IRQ перед тем, как что-либо делать, затем отключаем IRQ согласно нашему требованию, выполняем планирование, теперь перед тем, как вернуться, восстановим состояние IRQ и затем вернемся из функции.

Теперь перейдем к сложной части. Почему нам не нужно сохранять IRQ при выполнении тасклета, т.е. когда обработчик вызывает функцию тасклета? Чтобы понять, что нам нужно взглянуть на два разных абзаца:

На стр. 141:

Обработчики softirq работают с включенными прерываниями и не могут sleep . Пока работает обработчик, softtirq на текущем процессоре Другой процессор, однако, может прекрасно выполнять другие программы. Если то же самое softirq поднимается снова во время выполнения, другой процессор может запустить его одновременно.

Таким образом, это объявляет, что прерывания всегда включены.

Теперь перейдем к стр. 143:

  1. Отключить локальную доставку прерываний (нет необходимости сначала сохранять их состояние , потому что код здесь всегда вызывается как softirq обработчик и прерывания всегда включены) и извлекает tasklet_vec или tasklet_hi_vec для этого процессора

Таким образом, мы можем заключить, что нам не нужно сохранять состояние IRQ, поскольку мы уже знаем его состояние, и оно останется таковым при всех условиях, поэтому мы просто отключаем IRQ и включаем его позже.

0 голосов
/ 30 июня 2018

Автор заявляет, что tasklet_schedule может вызываться с отключенными или включенными прерываниями. Поскольку он хочет, чтобы они были отключены, он должен сохранить, отключены ли они уже. Затем, после того, как работа завершена, он знает, следует ли их включить (если они были включены до вызова, он включает их, если они были отключены до вызова, он оставляет их отключенными). Напротив, tasklet_action вызывается только с включенными прерываниями, поэтому нет смысла проверять их состояние. Они всегда отключаются и включаются по возвращении.

...