Я думаю, что то, что сказано о приостановке потока, больше похоже на фигуру речи.В этом случае это не 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()
.