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);这个周期设置的有什么用,反正都没按照它来?????、

以上三个问题,求大神们指点。。。。。。
...全文
971 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_43951139 2018-12-04
  • 打赏
  • 举报
回复
老哥,最近遇到同样的问题,后来有结论吗?ftrace看根本没有按这个周期走。 wd_attr->sample_period = hw_nmi_get_sample_period(watchdog_thresh);
浩爹 2016-10-08
  • 打赏
  • 举报
回复
没人研究过吗?
nswcfd 2016-09-26
  • 打赏
  • 举报
回复
赞!楼主钻研的很深入啊
浩爹 2016-09-26
  • 打赏
  • 举报
回复
上述的三个问题,其实就归结为一个原因,当知道NMI中断事件计数是记录的UnHalted cpu cycle之后,上述的问题就清晰了,不过重新发现了新的问题,就是在2.6.32中,发现perf counter 和 event counter 貌似是两个计数器,nmi按照perf counter计数,event注册的回调函数按照event counter计数,例如:1秒产生一次NMI中断,然后60秒后执行event 注册的回调函数! 在3.18.27中,发现改了,貌似两个计数器是同一个了,执行完intel_pmu_handle_irq后会同时执行watchdog_overflow_callback,不过没找到代码中计数器的具体位置,只能继续啃源码了,有清楚的希望得到指教,不知道理解的对不对
浩爹 2016-09-24
  • 打赏
  • 举报
回复
问题三好像懂了,NMI中断事件计数是记录的UnHalted cpu cycle ,所以这个是要看cpu忙碌的周期,如果cpu是空闲的,那么nmi触发的频率就是比较低的

4,436

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧