Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

netdev: Add tracepoints to netdev layer

This patch adds tracepoint to dev_queue_xmit, dev_hard_start_xmit,
netif_rx and netif_receive_skb. These tracepoints help you to monitor
network driver's input/output.

<idle>-0 [001] 112447.902030: netif_rx: dev=eth1 skbaddr=f3ef0900 len=84
<idle>-0 [001] 112447.902039: netif_receive_skb: dev=eth1 skbaddr=f3ef0900 len=84
sshd-6828 [000] 112447.903257: net_dev_queue: dev=eth4 skbaddr=f3fca538 len=226
sshd-6828 [000] 112447.903260: net_dev_xmit: dev=eth4 skbaddr=f3fca538 len=226 rc=0

Signed-off-by: Koki Sanagi <sanagi.koki@jp.fujitsu.com>
Acked-by: David S. Miller <davem@davemloft.net>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Cc: Kaneshige Kenji <kaneshige.kenji@jp.fujitsu.com>
Cc: Izumo Taku <izumi.taku@jp.fujitsu.com>
Cc: Kosaki Motohiro <kosaki.motohiro@jp.fujitsu.com>
Cc: Lai Jiangshan <laijs@cn.fujitsu.com>
Cc: Scott Mcmillan <scott.a.mcmillan@intel.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Eric Dumazet <eric.dumazet@gmail.com>
LKML-Reference: <4C72431E.3000901@jp.fujitsu.com>
Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>

authored by

Koki Sanagi and committed by
Frederic Weisbecker
cf66ba58 3e4b10d7

+89
+82
include/trace/events/net.h
··· 1 + #undef TRACE_SYSTEM 2 + #define TRACE_SYSTEM net 3 + 4 + #if !defined(_TRACE_NET_H) || defined(TRACE_HEADER_MULTI_READ) 5 + #define _TRACE_NET_H 6 + 7 + #include <linux/skbuff.h> 8 + #include <linux/netdevice.h> 9 + #include <linux/ip.h> 10 + #include <linux/tracepoint.h> 11 + 12 + TRACE_EVENT(net_dev_xmit, 13 + 14 + TP_PROTO(struct sk_buff *skb, 15 + int rc), 16 + 17 + TP_ARGS(skb, rc), 18 + 19 + TP_STRUCT__entry( 20 + __field( void *, skbaddr ) 21 + __field( unsigned int, len ) 22 + __field( int, rc ) 23 + __string( name, skb->dev->name ) 24 + ), 25 + 26 + TP_fast_assign( 27 + __entry->skbaddr = skb; 28 + __entry->len = skb->len; 29 + __entry->rc = rc; 30 + __assign_str(name, skb->dev->name); 31 + ), 32 + 33 + TP_printk("dev=%s skbaddr=%p len=%u rc=%d", 34 + __get_str(name), __entry->skbaddr, __entry->len, __entry->rc) 35 + ); 36 + 37 + DECLARE_EVENT_CLASS(net_dev_template, 38 + 39 + TP_PROTO(struct sk_buff *skb), 40 + 41 + TP_ARGS(skb), 42 + 43 + TP_STRUCT__entry( 44 + __field( void *, skbaddr ) 45 + __field( unsigned int, len ) 46 + __string( name, skb->dev->name ) 47 + ), 48 + 49 + TP_fast_assign( 50 + __entry->skbaddr = skb; 51 + __entry->len = skb->len; 52 + __assign_str(name, skb->dev->name); 53 + ), 54 + 55 + TP_printk("dev=%s skbaddr=%p len=%u", 56 + __get_str(name), __entry->skbaddr, __entry->len) 57 + ) 58 + 59 + DEFINE_EVENT(net_dev_template, net_dev_queue, 60 + 61 + TP_PROTO(struct sk_buff *skb), 62 + 63 + TP_ARGS(skb) 64 + ); 65 + 66 + DEFINE_EVENT(net_dev_template, netif_receive_skb, 67 + 68 + TP_PROTO(struct sk_buff *skb), 69 + 70 + TP_ARGS(skb) 71 + ); 72 + 73 + DEFINE_EVENT(net_dev_template, netif_rx, 74 + 75 + TP_PROTO(struct sk_buff *skb), 76 + 77 + TP_ARGS(skb) 78 + ); 79 + #endif /* _TRACE_NET_H */ 80 + 81 + /* This part must be outside protection */ 82 + #include <trace/define_trace.h>
+6
net/core/dev.c
··· 128 128 #include <linux/jhash.h> 129 129 #include <linux/random.h> 130 130 #include <trace/events/napi.h> 131 + #include <trace/events/net.h> 131 132 #include <linux/pci.h> 132 133 133 134 #include "net-sysfs.h" ··· 1979 1978 } 1980 1979 1981 1980 rc = ops->ndo_start_xmit(skb, dev); 1981 + trace_net_dev_xmit(skb, rc); 1982 1982 if (rc == NETDEV_TX_OK) 1983 1983 txq_trans_update(txq); 1984 1984 return rc; ··· 2000 1998 skb_dst_drop(nskb); 2001 1999 2002 2000 rc = ops->ndo_start_xmit(nskb, dev); 2001 + trace_net_dev_xmit(nskb, rc); 2003 2002 if (unlikely(rc != NETDEV_TX_OK)) { 2004 2003 if (rc & ~NETDEV_TX_MASK) 2005 2004 goto out_kfree_gso_skb; ··· 2189 2186 #ifdef CONFIG_NET_CLS_ACT 2190 2187 skb->tc_verd = SET_TC_AT(skb->tc_verd, AT_EGRESS); 2191 2188 #endif 2189 + trace_net_dev_queue(skb); 2192 2190 if (q->enqueue) { 2193 2191 rc = __dev_xmit_skb(skb, q, dev, txq); 2194 2192 goto out; ··· 2516 2512 if (netdev_tstamp_prequeue) 2517 2513 net_timestamp_check(skb); 2518 2514 2515 + trace_netif_rx(skb); 2519 2516 #ifdef CONFIG_RPS 2520 2517 { 2521 2518 struct rps_dev_flow voidflow, *rflow = &voidflow; ··· 2833 2828 if (!netdev_tstamp_prequeue) 2834 2829 net_timestamp_check(skb); 2835 2830 2831 + trace_netif_receive_skb(skb); 2836 2832 if (vlan_tx_tag_present(skb) && vlan_hwaccel_do_receive(skb)) 2837 2833 return NET_RX_SUCCESS; 2838 2834
+1
net/core/net-traces.c
··· 26 26 27 27 #define CREATE_TRACE_POINTS 28 28 #include <trace/events/skb.h> 29 + #include <trace/events/net.h> 29 30 #include <trace/events/napi.h> 30 31 31 32 EXPORT_TRACEPOINT_SYMBOL_GPL(kfree_skb);