Interrupt Pipeline系列文章大纲-CSDN博客
2.3 el0_irq
2.3.1 el0_irq代码框架
2.3.2 kernel_entry 0 与kernel_exit 0
2.3.3 el0_irq_naked与enable_da_f
2.3.4 trace_hardirqs_off与trace_hardirqs_on
2.3.5 irq_handler
2.3.6 返回用户空间
2.3.4 trace_hardirqs_off与trace_hardirqs_on
如果打开内核配置项CONFIG_TRACE_IRQFLAGS,那么在硬件中断关闭和打开的过程中,通过调用trace_hardirqs_off/trace_hardirqs_on函数可以记录硬件中断关闭和打开的事件。两个函数调用的tracer_hardirqs_off/tracer_hardirqs_off,服务于ftrace的众多tracer之一irqsoff(CONFIG_IRQSOFF_TRACER)。
引入了I-pipe之后,这个机制只作用于root域,而且记录的是虚拟中断的关闭和打开事件。
在el0_irq中,硬件中断由HEAD域接管,所以,直接跳过对trace_hardirqs_off的调用。
#if defined(CONFIG_TRACE_IRQFLAGS) && !defined(CONFIG_I-pipe)
bl trace_hardirqs_off
#endif
在其它调用trace_hardirqs_off/ trace_hardirqs_on的位置,在函数中加上对root域的检查。这两个函数定义在kernel/trace/trace_preemptirq.c:
void trace_hardirqs_on(void) { if (!ipipe_root_p) //如果是非root域,直接return return; if (this_cpu_read(tracing_irq_cpu)) { if (!in_nmi()) trace_irq_enable_rcuidle(CALLER_ADDR0, CALLER_ADDR1); tracer_hardirqs_on(CALLER_ADDR0, CALLER_ADDR1); this_cpu_write(tracing_irq_cpu, 0); } lockdep_hardirqs_on(CALLER_ADDR0); } EXPORT_SYMBOL(trace_hardirqs_on); void trace_hardirqs_off(void) { if (!ipipe_root_p) //如果是非root域,直接return return; if (!this_cpu_read(tracing_irq_cpu)) { this_cpu_write(tracing_irq_cpu, 1); tracer_hardirqs_off(CALLER_ADDR0, CALLER_ADDR1); if (!in_nmi()) trace_irq_disable_rcuidle(CALLER_ADDR0, CALLER_ADDR1); } lockdep_hardirqs_off(CALLER_ADDR0); } EXPORT_SYMBOL(trace_hardirqs_off); |
点击查看系列文章 =》 Interrupt Pipeline系列文章大纲-CSDN博客
原创不易,需要大家多多鼓励!您的关注、点赞、收藏就是我的创作动力!