NMI ---perf event intel ---子系统问题
浩爹 2016-09-23 04:42:26 1、当计数溢出是,Local APIC会发一个PMI,然后在本地中这个PMI会被设置成NMI中断,所以在perf_event_intel.c文件中,中断处理函数的调用接口是intel_pmu_handle_irq,这个中断处理函数,应该是每个中断都会进这个函数的吧?(不确定,个人猜测)
然后在watchdog 中注册了一个perf event 事件,watchdog_nmi_enable()函数部分代码如下:
wd_attr = &wd_hw_attr;
wd_attr->sample_period = hw_nmi_get_sample_period(watchdog_thresh);这个值是10s
/* Try to register using hardware perf events */
event = perf_event_create_kernel_counter(wd_attr, cpu, NULL, watchdog_overflow_callback, NULL);
问题一、为什么设置的event周期是10s(3.18.27内核)2.6.32中时60s,但是在实际运行当中,并不是按照这个时间来调用的呢?2.6的调用时间很长,有时候都能达到9分钟才会调用watchdog_overflow_callback这个函数,理论上应该是intel_pmu_handle_irq这个中断处理函数执行后,就跟着执行watchdog_overflow_callback它才对啊?就是NMI事件产生了,就进入到event注册的这个watchdog_overflow_callback函数中????
问题二、 2.6内核是只有nmi中断事件确实产生了,才算是watchdog_nmi事件发生了,才调用watchdog_overflow_callback它吗?????
如果是这样,那么现在3.18.27中,为什么每次中断处理函数intel_pmu_handle_irq执行完后,跟着就调用了watchdog_overflow_callback????难道不是watchdog nmi事件发生了,它也调用watchdog nmi事件的注册函数吗?
问题三、综上,那wd_attr->sample_period = hw_nmi_get_sample_period(watchdog_thresh);这个周期设置的有什么用,反正都没按照它来?????、
以上三个问题,求大神们指点。。。。。。