Приостановка 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()
функция.