disable_local_irq и таймеры ядра

Привет, ребята! При переносе SMP некоторых наших драйверов (на powerpc target) мы наблюдали некоторое поведение, которое мне нужно, чтобы вы проливают свет:

  1. При выполнении local_irq_disable () в системе UP, jiffies имеют тенденцию замораживание, т.е. счетчик перестает увеличиваться. Ожидается ли это? я думал что декрементерное прерывание является «внутренним» и не должно затронутый вызовом local_irq_disable kindof, так как я ожидал, что он отключить обработку прерывания локального IRQ (внешнее прерывание). В система, конечно, зависает, а также после выполнения local_irq_enable () jiffies считает прыжки и, кажется, компенсирует время lapse 'между вызовами local_irq_disable () и enable ().

  2. То же самое в системе SMP (P2020 с 2 ядрами e500) результаты удивительны. Сначала модуль, который вставляется в сделать это тестирование всегда выполняется на ядре 1. Кроме того, иногда счетчик "jiffies" не замораживается, и иногда мы видим, что он действительно зависает. Опять же, в случае остановки счета он имеет тенденцию прыгать после выполнения local_irq_enable (). Я понятия не имею, почему это может быть происходит. Знаем ли мы, что в случае SMP оба ядра запускают таймер расписания, поэтому что в некоторых случаях мы не видим замораживания отсчетов Джиффи или это только на ядре 0?

Кроме того, поскольку таймеры ядра полагаются на 'jiffies' - это будет означать, что ни один из наших таймеров ядра не сработает, если local_irq_disable () была сделанный ? В каком случае это делается на одном из ядер в Система SMP?

Есть много других вопросов, но я думаю, что их будет достаточно, чтобы Начнем с общего обсуждения того же:)

TIA

NS

Еще несколько комментариев из проведенных экспериментов.

На данный момент я понимаю, что, поскольку таймеры ядра зависят от срабатывания «jiffies», они фактически не срабатывают в системе UP, когда я запускаю local_irq_save (). Фактически, часть нашего кода основана на предположении, что когда я вызываю local_irq_save (), он гарантирует защиту от прерываний на локальном процессоре и таймерах ядра.

Однако проведение того же эксперимента в системе SMP, даже с оба ядра выполняют local_irq_save (), jiffies НЕ перестают увеличиваться, и система не зависает. Как это возможно ? Использует ли LINUX какой-либо другой механизм для запуска прерываний таймера в системе SMP или, возможно, использует IPI? Это также разрушает наше предположение о том, что local_irq_disable защитит систему от таймеров ядра, работающих, по крайней мере, на том же ядре.

Как нам написать код, который безопасен от асинхронных событий, то есть прерываний и таймеров ядра, и действителен как для UP, так и для SMP.

7
задан skaffman 30 June 2011 в 08:49
поделиться