-
Keep preemption disabled until we are done with
-
softirq processing:
*/
preempt_count_sub(cnt - 1);
if (unlikely(!in_interrupt() && local_softirq_pending())) {
do_softirq();
}
preempt_count_dec();
}
我们可以看到如果有 softirq pending 的话,do_softirq()会负责在当前进程上下文处理 softirq。并其他抢占是关闭的状态。所以我们不会调度出去,并且调用 local_bh_enable() 会立刻响应普通定时器 timer。所以这也满足以上条件。
6. softirq 的特殊
===============
我先回忆下触发 softirq 的执行场景。一共会有 3 个地方。
-
irq_exit()
-
local_bh_enable()
-
ksoftirqd 进程
当中断返回时会检查 softirq pending,这是大部分执行 softirq 的场景,由于中断的特殊性,在 timer handle 里面记录当前 CPU 的栈是有效的。local_bh_enable()的情况上面已经讨论,可以抓住元凶。但是第 3 种情况下,却不能。这是为什么呢?我们是在 timer handle 里面记录堆栈信息,如果 irq_exit 时 softirq 执行时间过长,会被安排到 ksoftirqd 进程执行。那我们记录的栈信息是什么?仅仅是 ksoftirqd 进程的栈,ksoftirq 并不是元凶。记录是没有用的。所以针对 ksoftirqd 执行的场景,我们需要特殊的处理。我们借助 hrtimer handle。hrtimer 除了测量两次 hardirq 间隔外,还测量 softirq 多长时间没有执行,在合适的时候记录栈。hrtimer 执行的时候,顺便会检测 softirqirq 多长时间没有更新时间戳,如果操作阈值我们也会记录栈信息,这是因为后续如果 softirq 被推迟到 ksoftirqd 进程执行的话,由 softirq 的 timer 记录的栈就没有价值了。
7. 如何安装
========
安装 trace-irqoff 工具很简单,git clone 代码后执行如下命令即可安装。
make -j8
make install
8. 如何使用
========
安装 trace-irqoff 工具成功后。会创建如下 /proc/trace_irqoff 目录。
root@n18-061-206:/proc/trace_irqoff# ls
distribute enable sampling_period trace_latency
/proc/trace_irqoff 目录下存在 4 个文件,分别:distribute, enable, sampling_period 和 trace_latency。工具安装后,默认是关闭状态,我们需要手动打开 trace。
8.1 打开 trace
echo 1 > /proc/trace_irqoff/enable
8.2 关闭 trace
echo 0 > /proc/trace_irqoff/enable

1186

被折叠的 条评论
为什么被折叠?



