Как определить источник 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