В настоящее время я изучаю код внутренней сети ядра , особенно код RPS .Вы знаете, есть много функций об этом.Но я сосредоточусь на некоторых функциях обработки очереди SMP , таких как enqueue_to_backlog
и process_backlog
.
Меня интересует синхронизация между двумя ядрами (или одноядерными) с использованием двух функций - enqueue_to_backlog
и process_backlog
-.
В этих функциях Ядро (A) содержит spin_lock
другого ядра (B) для постановки пакетов в очередь в input_pkt_queue
и планирования napi ядра (B) .И Ядро (B) также содержит spin_lock
для сращивания input_pkt_queue
до process_queue
ядра (B) и удаления графика напи самостоятельно. Я знаю, что spin_lock
следует придерживатьсязапретить двум ядрам обращаться к одной и той же очереди друг другу во время обработки очереди.
Но я не могу понять, почему spin_lock
вызывается с local_irq_disable
(или local_irq_save
).Я думаю, что нет доступа к очередям или rps_lock
ядра (B) по контексту прерываний (TH), когда прерывания (TH) вытесняют текущий контекст (softirq, BH). - Конечно, napi struct можетбыть доступным для планирования напи через TH, но он удерживает отключение irq до тех пор, пока пакет не будет поставлен в очередь - Так что мне интересно, почему spin_lock
вызывается с отключением irq.
Я думаю, что это такневозможно выгрузить текущий контекст (напи, softirq) с помощью другой ЧД, такой как тасклет.Это правда?И я хочу знать, отключает ли local_irq_disable все ядра irq или буквально irq текущего ядра? На самом деле, я читал книгу о разработке ядра, но думаю, что недостаточно разбираюсь в preemption.
Объяснит причины, по которым процедура rps использует spin_lock
с local_irq_disable
?