Привет, ребята,
При выполнении SMP портирования некоторых наших драйверов (на
цель powerpc) мы наблюдали какое-то поведение, на котором вы, ребята, должны
пролить немного света:
При выполнении local_irq_disable () в системе UP, jiffies имеют тенденцию к
замораживание, то есть счет перестает увеличиваться. Это ожидается? я думал
что прерывание декментера является «внутренним» и не должно получаться
затронуты вызовом вида local_irq_disable, так как я ожидал
отключить локальную обработку прерываний IRQ (внешнее прерывание).
Система, конечно же, зависает и после выполнения local_irq_enable ()
Jiffies считает прыжки, и это, кажется, компенсирует 'время
lapse 'между вызовом local_irq_disable () и enable ().
То же самое в системе SMP (P2020 с 2 ядрами e500)
результаты удивительны. Во-первых, модуль, который вставляется в
делать это тестирование всегда выполняется на ядре 1. Далее иногда
не вижу замораживания счетчика 'jiffies', а иногда мы видим, что это
действительно замерзает. Снова в случае замораживания счета это имеет тенденцию прыгать
после выполнения local_irq_enable (). Я понятия не имею, почему это может быть
происходит.
Знаем ли мы, что в случае SMP оба ядра запускают таймер расписания, поэтому
что в некоторых случаях мы не видим замораживание отсчетов или это
только на ядре 0?
Кроме того, поскольку таймеры ядра полагаются на «jiffies» - это будет означать, что
ни один из наших таймеров ядра не сработает, если local_irq_disable () был
сделанный ? В таком случае это делается на одном из ядер в
SMP система?
Есть много других вопросов, но я думаю, их будет достаточно, чтобы
начнем общую дискуссию о том же:)
ТИА
NS
Еще несколько комментариев из проведенного эксперимента.
На данный момент я понимаю, что, поскольку таймеры ядра зависят от запуска jiffies, они фактически не запускаются в системе UP, когда я запускаю local_irq_save (). Фактически, некоторые из нашего кода основаны на предположении, что когда я запускаю local_irq_save (), это гарантирует защиту от прерываний на локальном процессоре и таймерах ядра.
Однако, выполняя тот же эксперимент на SMP-системе, даже если оба ядра выполняют local_irq_save (), jiffies не прекращают увеличиваться, и система не останавливается. Как это возможно ? Использует ли LINUX какой-либо другой механизм для запуска прерываний по таймеру в системе SMP или, возможно, использует IPI? Это также нарушает наше предположение, что local_irq_disable защитит систему от таймеров ядра, работающих на том же ядре, по крайней мере.
Как нам написать код, который защищен от асинхронных событий, то есть прерываний и таймеров ядра, и действителен как для UP, так и для SMP.