Приостановка kthread в Linux

Здесь https://blog.packagecloud.io/eng/2017/02/06/monitoring-tuning-linux-networking-stack-sending-data/ написано:

Как вы увидите из предыдущего поста, в NET_TX_SOFTIRQ softirq зарегистрирована функция net_tx_action. Это означает, что есть поток ядра, выполняющий net_tx_action. Этот поток иногда приостанавливается, а метод lift_softirq_irqoff возобновляет его. Давайте посмотрим, что делает net_tx_action, чтобы понять, как ядро ​​обрабатывает передачу запросов.

Написано что kthread иногда останавливается Когда kthread приостановлено и почему?

Как kthread знает о работе для выполнения? Опрашивает ли очередь?

1 ответ

Решение

Я думаю, что то, что сказано о приостановке потока, больше похоже на фигуру речи. В этом случае это не kthread это приостановлено, поток работает просто отлично.

Основная часть работ, связанных с softirq, находится в __do_softirq() функция.

Существует несколько типов softirq, и каждый тип softirq представлен битовой маской. Всякий раз, когда есть работа для определенного типа softirq, соответствующий бит повышается в битовой маске. __do_softirq() обрабатывает эту битовую маску по битам, начиная с младшего значащего бита, и выполняет работу для каждого типа softirq, для которого установлен бит. Таким образом, типы softirq обрабатываются в порядке приоритета, причем бит 0 представляет наивысший приоритет. Фактически, если вы посмотрите на код, то увидите, что битовая маска сохраняется (копируется), а затем очищается перед началом обработки, и именно эта копия обрабатывается.

Бит для NET_TX_SOFTIRQ вызывается каждый раз, когда новый сетевой буфер передается в сетевой стек ядра для отправки данных. Это вызывает __do_softirq() звонить net_tx_action() для исходящих данных. Если нет данных для отправки, то бит не увеличивается. По сути, это то, что заставляет ядро ​​softirq "паузить", что является простым способом сказать, что для этого нет работы, поэтому net_tx_action() не называется. Как только появляется больше данных, бит снова увеличивается, когда данные передаются в сетевой стек ядра. __do_softirq() видит это и звонит net_tx_action() снова.

На каждом процессоре есть более мягкий поток. Поток запускается, когда есть хотя бы один ожидающий Softtirq тип. Потоки определены в softirq_threads структура и началась в spawn_softirqd() функция.

Другие вопросы по тегам