我有一个与在 Linux 内核 4.15 上使用 ftrace 相关的问题。 ftrace 配置如下:
mount -t debugfs nodev /sys/kernel/debug
echo funcgraph-proc > /sys/kernel/debug/tracing/trace_options
echo function_graph >/sys/kernel/debug/tracing/current_tracer
echo *gro_receive > /sys/kernel/debug/tracing/set_graph_function
echo > /sys/kernel/debug/tracing/trace
echo 1 >/sys/kernel/debug/tracing/tracing_on
sleep 2
echo 0 >/sys/kernel/debug/tracing/tracing_on
cat /sys/kernel/debug/tracing/trace > ./result.out
以下是跟踪输出 (result.out) 的两段摘录。
0) sleep-13890 => <idle>-0
------------------------------------------
0) <idle>-0 | | napi_gro_receive() {
0) <idle>-0 | 0.255 us | skb_gro_reset_offset();
0) <idle>-0 | | dev_gro_receive() {
0) <idle>-0 | | inet_gro_receive() {
0) <idle>-0 | | tcp4_gro_receive() {
0) <idle>-0 | 0.307 us | tcp_gro_receive();
0) <idle>-0 | 1.007 us | }
0) <idle>-0 | 1.725 us | }
0) <idle>-0 | 2.396 us | }
0) <idle>-0 | | netif_receive_skb_internal() {
0) <idle>-0 | 0.171 us | ktime_get_with_offset();
0) <idle>-0 | 0.174 us | skb_defer_rx_timestamp();
0) <idle>-0 | | __netif_receive_skb() {
0) <idle>-0 | | __netif_receive_skb_core() {
0) <idle>-0 | | tpacket_rcv() {
1) <idle>-0 => ksoftir-17
------------------------------------------
1) ksoftir-17 | 0.327 us | finish_task_switch();
1) ksoftir-17 | | napi_gro_receive() {
1) ksoftir-17 | 0.238 us | skb_gro_reset_offset();
1) ksoftir-17 | | dev_gro_receive() {
1) ksoftir-17 | 0.166 us | inet_gro_receive();
1) ksoftir-17 | 0.472 us | }
1) ksoftir-17 | | netif_receive_skb_internal() {
1) ksoftir-17 | 0.178 us | ktime_get_with_offset();
1) ksoftir-17 | 0.143 us | skb_defer_rx_timestamp();
1) ksoftir-17 | | __netif_receive_skb() {
1) ksoftir-17 | | __netif_receive_skb_core() {
1) ksoftir-17 | | tpacket_rcv() {
如您所见,对
napi_gro_receive()
的调用显示在不同进程的上下文中。根据我的理解,它应该始终在 ksoftirq
的上下文中调用,但我可以在跟踪中第二次出现时看到它。
以上是预期的行为吗?谢谢。
napi_gro_receive 是 BH 上下文的一部分 在启用中断的高优先级工作队列上执行的中断处理部分称为下半中断处理。