Как определить источник NMI в ядре Linux?

Я использую ядро ​​апстрима 5.2. Проблема в том, что я зарегистрировал обработчик NMI, который никогда не вызывается. Я вижу, что количество NMI увеличивается в /proc/interrupts примерно каждые несколько секунд.

      $cat /proc/interrupts | grep NMI
NMI:       1948       1904       1948       1963  Non-maskable interrupts
$cat /proc/interrupts | grep NMI
NMI:       1948       1905       1948       1963  Non-maskable interrupts
$cat /proc/interrupts | grep NMI
NMI:       1948       1905       1948       1964  Non-maskable interrupts

Я не очень понимаю, как NMI реализован в ядре Linux, поэтому, пожалуйста, заполните его. Абсолютно нуб в этой области. Я понимаю, что получаемые мной НМИ (подтвержденные через /proc/interrupts/ count) поступают с некоторых известных ресурсов, поэтому мои NMI_UNKNOWNобработчик не получает вызова. Если я неправильно понимаю, не могли бы вы объяснить, почему мой обработчик NMI не вызывается?

Как я могу подтвердить, откуда берутся эти НМИ в моем случае? Любой интерфейс в proc или sysfs может мне помочь?

Конфигурация моего ядра

      $cat config | grep NMI
CONFIG_PRINTK_NMI=y
CONFIG_HAVE_ACPI_APEI_NMI=y
CONFIG_OPROFILE_NMI_TIMER=y
CONFIG_HAVE_NMI=y
CONFIG_HAVE_PERF_EVENTS_NMI=y
CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y
# CONFIG_DEBUG_NMI_SELFTEST is not set

РЕДАКТИРОВАТЬ

Я попробовал NMI tracer и могу неоднократно просматривать следующие журналы, которые, вероятно, указывают, кто является источником и кто обрабатывает его:

      n nmi:0_RP0:/sys/kernel/debug/tracing/events/nmi]$ cat ../../trace_pipe | grep -
856591:           <...>-1452534 [004] d.Z. 602920.053471: nmi_handler: perf_event_nmi_handler() delta_ns: 5944 handled: 1
856592:           <...>-1452534 [004] d.Z. 602920.053471: nmi_handler: nmi_cpu_backtrace_handler() delta_ns: 360 handled: 0
856593:           <...>-1452534 [004] d.Z. 602920.053472: nmi_handler: mce_raise_notify() delta_ns: 350 handled: 0

0 ответов

Другие вопросы по тегам