yangPSO 发表于 2015-12-07 11:04

nmi watchdog与nmi 中断

下面是Linux-4.0.4内核中函数watchdog_nmi_enable()的语句:
        wd_attr = &wd_hw_attr;
        wd_attr->sample_period = hw_nmi_get_sample_period(watchdog_thresh);

        /* Try to register using hardware perf events */
        event = perf_event_create_kernel_counter(wd_attr, cpu, NULL, watchdog_overflow_callback, NULL);

其中wd_hw_attr定义如下:
static struct perf_event_attr wd_hw_attr = {
        .type                = PERF_TYPE_HARDWARE,
        .config                = PERF_COUNT_HW_CPU_CYCLES,
        .size                = sizeof(struct perf_event_attr),
        .pinned                = 1,
        .disabled        = 1,
};

可见nmi watchdog是依据cpu-cycles的perf 计数器实现的。

我的理解是,每当达到wd_attr->sample_period,就会产生nmi中断,并调用到
函数watchdog_overflow_callback(),但是实际上在正常情况下发现nmi中断并没有增加。

看了很久代码也没有找到答案,请教大家了,为什么nmi中断没有增加?!

yangPSO 发表于 2015-12-08 12:01

没有人吗,随便说点啥啊,内核版怎么这么冷清了,哪些往昔的熟面孔好像也不来逛内核版了?!

nswcfd 发表于 2015-12-08 17:49

加入jprobe跑了一下,好像每1000s调一下watchdog_overflow_callback

yangPSO 发表于 2015-12-09 18:46

回复 3# nswcfd


谢谢回复,不知道你用的内核是什么版本,你的1000s一次是有规律的吗,
但是系统的hardlock检测不可能是1000s一次的吧?!

   

yangPSO 发表于 2015-12-10 09:31

原来nmi watchdog统计的是UnHalted Core Cycles ,关键是UnHalted

nswcfd 发表于 2015-12-14 16:58

回复 4# yangPSO

2.6.32

        wd_attr->sample_period = hw_nmi_get_sample_period();
        event = perf_event_create_kernel_counter(wd_attr, cpu, NULL, watchdog_overflow_callback, NULL);

u64 hw_nmi_get_sample_period(void)
{
        return (u64)(cpu_khz) * 1000 * 60;
}


PS,为什么说Unhalted是关键?
页: [1]
查看完整版本: nmi watchdog与nmi 中断