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

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

0 голосов
/ 25 августа 2018

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

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

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

Откуда kthread знает о работе, которую нужно выполнить?Опрашивает ли очередь?

1 Ответ

0 голосов
/ 27 августа 2018

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

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

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

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

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

...