Может ли функция send_sig () спать в Linux? - PullRequest
2 голосов
/ 09 февраля 2020

Можно ли безопасно использовать функцию send_sig() в режиме ядра для отправки сигнала процессу изнутри атома c context ?
Другими словами, может ли этот функциональный блок блокировать или спать?

1 Ответ

0 голосов
/ 09 февраля 2020

Беглый взгляд на исходный код (v4.20):

  1. send_sig() только звонки send_sig_info() ...
  2. . .. который проверяет, является ли значение сигнала действительным, а затем вызывает do_send_sig_info() ...
  3. ... который вызывает lock_task_sighand() ...
  4. ... с функцией блокировки спин-блокировки tsk->sighand->siglock (через spin_lock_irqsave()). Эта спин-блокировка освобождается только в конце do_send_sig_info(), который затем немедленно возвращается.

Мы знаем, что код ядра не должен спать во время удержания спин-блокировки, поскольку это будет фатальной ошибкой. Поскольку самая первая цепочка вызовов, выполняемых send_sig(), блокирует спин-блокировку, которая затем удерживается на протяжении всей операции, мы можем сделать вывод, что функция send_sig() не спит .

...