Skip to content

Commit b0e3f1b

Browse files
tahinidavem330
authored andcommitted
net: Add trace events for all receive exit points
Trace events are already present for the receive entry points, to indicate how the reception entered the stack. This patch adds the corresponding exit trace events that will bound the reception such that all events occurring between the entry and the exit can be considered as part of the reception context. This greatly helps for dependency and root cause analyses. Without this, it is not possible with tracepoint instrumentation to determine whether a sched_wakeup event following a netif_receive_skb event is the result of the packet reception or a simple coincidence after further processing by the thread. It is possible using other mechanisms like kretprobes, but considering the "entry" points are already present, it would be good to add the matching exit events. In addition to linking packets with wakeups, the entry/exit event pair can also be used to perform network stack latency analyses. Signed-off-by: Geneviève Bastien <[email protected]> CC: Mathieu Desnoyers <[email protected]> CC: Steven Rostedt <[email protected]> CC: Ingo Molnar <[email protected]> CC: David S. Miller <[email protected]> Reviewed-by: Steven Rostedt (VMware) <[email protected]> (tracing side) Signed-off-by: David S. Miller <[email protected]>
1 parent 91c4595 commit b0e3f1b

File tree

2 files changed

+88
-6
lines changed

2 files changed

+88
-6
lines changed

include/trace/events/net.h

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,65 @@ DEFINE_EVENT(net_dev_rx_verbose_template, netif_rx_ni_entry,
244244
TP_ARGS(skb)
245245
);
246246

247+
DECLARE_EVENT_CLASS(net_dev_rx_exit_template,
248+
249+
TP_PROTO(int ret),
250+
251+
TP_ARGS(ret),
252+
253+
TP_STRUCT__entry(
254+
__field(int, ret)
255+
),
256+
257+
TP_fast_assign(
258+
__entry->ret = ret;
259+
),
260+
261+
TP_printk("ret=%d", __entry->ret)
262+
);
263+
264+
DEFINE_EVENT(net_dev_rx_exit_template, napi_gro_frags_exit,
265+
266+
TP_PROTO(int ret),
267+
268+
TP_ARGS(ret)
269+
);
270+
271+
DEFINE_EVENT(net_dev_rx_exit_template, napi_gro_receive_exit,
272+
273+
TP_PROTO(int ret),
274+
275+
TP_ARGS(ret)
276+
);
277+
278+
DEFINE_EVENT(net_dev_rx_exit_template, netif_receive_skb_exit,
279+
280+
TP_PROTO(int ret),
281+
282+
TP_ARGS(ret)
283+
);
284+
285+
DEFINE_EVENT(net_dev_rx_exit_template, netif_rx_exit,
286+
287+
TP_PROTO(int ret),
288+
289+
TP_ARGS(ret)
290+
);
291+
292+
DEFINE_EVENT(net_dev_rx_exit_template, netif_rx_ni_exit,
293+
294+
TP_PROTO(int ret),
295+
296+
TP_ARGS(ret)
297+
);
298+
299+
DEFINE_EVENT(net_dev_rx_exit_template, netif_receive_skb_list_exit,
300+
301+
TP_PROTO(int ret),
302+
303+
TP_ARGS(ret)
304+
);
305+
247306
#endif /* _TRACE_NET_H */
248307

249308
/* This part must be outside protection */

net/core/dev.c

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4527,9 +4527,14 @@ static int netif_rx_internal(struct sk_buff *skb)
45274527

45284528
int netif_rx(struct sk_buff *skb)
45294529
{
4530+
int ret;
4531+
45304532
trace_netif_rx_entry(skb);
45314533

4532-
return netif_rx_internal(skb);
4534+
ret = netif_rx_internal(skb);
4535+
trace_netif_rx_exit(ret);
4536+
4537+
return ret;
45334538
}
45344539
EXPORT_SYMBOL(netif_rx);
45354540

@@ -4544,6 +4549,7 @@ int netif_rx_ni(struct sk_buff *skb)
45444549
if (local_softirq_pending())
45454550
do_softirq();
45464551
preempt_enable();
4552+
trace_netif_rx_ni_exit(err);
45474553

45484554
return err;
45494555
}
@@ -5229,9 +5235,14 @@ static void netif_receive_skb_list_internal(struct list_head *head)
52295235
*/
52305236
int netif_receive_skb(struct sk_buff *skb)
52315237
{
5238+
int ret;
5239+
52325240
trace_netif_receive_skb_entry(skb);
52335241

5234-
return netif_receive_skb_internal(skb);
5242+
ret = netif_receive_skb_internal(skb);
5243+
trace_netif_receive_skb_exit(ret);
5244+
5245+
return ret;
52355246
}
52365247
EXPORT_SYMBOL(netif_receive_skb);
52375248

@@ -5251,9 +5262,12 @@ void netif_receive_skb_list(struct list_head *head)
52515262

52525263
if (list_empty(head))
52535264
return;
5254-
list_for_each_entry(skb, head, list)
5255-
trace_netif_receive_skb_list_entry(skb);
5265+
if (trace_netif_receive_skb_list_entry_enabled()) {
5266+
list_for_each_entry(skb, head, list)
5267+
trace_netif_receive_skb_list_entry(skb);
5268+
}
52565269
netif_receive_skb_list_internal(head);
5270+
trace_netif_receive_skb_list_exit(0);
52575271
}
52585272
EXPORT_SYMBOL(netif_receive_skb_list);
52595273

@@ -5645,12 +5659,17 @@ static gro_result_t napi_skb_finish(gro_result_t ret, struct sk_buff *skb)
56455659

56465660
gro_result_t napi_gro_receive(struct napi_struct *napi, struct sk_buff *skb)
56475661
{
5662+
gro_result_t ret;
5663+
56485664
skb_mark_napi_id(skb, napi);
56495665
trace_napi_gro_receive_entry(skb);
56505666

56515667
skb_gro_reset_offset(skb);
56525668

5653-
return napi_skb_finish(dev_gro_receive(napi, skb), skb);
5669+
ret = napi_skb_finish(dev_gro_receive(napi, skb), skb);
5670+
trace_napi_gro_receive_exit(ret);
5671+
5672+
return ret;
56545673
}
56555674
EXPORT_SYMBOL(napi_gro_receive);
56565675

@@ -5768,14 +5787,18 @@ static struct sk_buff *napi_frags_skb(struct napi_struct *napi)
57685787

57695788
gro_result_t napi_gro_frags(struct napi_struct *napi)
57705789
{
5790+
gro_result_t ret;
57715791
struct sk_buff *skb = napi_frags_skb(napi);
57725792

57735793
if (!skb)
57745794
return GRO_DROP;
57755795

57765796
trace_napi_gro_frags_entry(skb);
57775797

5778-
return napi_frags_finish(napi, skb, dev_gro_receive(napi, skb));
5798+
ret = napi_frags_finish(napi, skb, dev_gro_receive(napi, skb));
5799+
trace_napi_gro_frags_exit(ret);
5800+
5801+
return ret;
57795802
}
57805803
EXPORT_SYMBOL(napi_gro_frags);
57815804

0 commit comments

Comments
 (0)