aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2014-01-14 17:46:13 -0500
committerDavid S. Miller <davem@davemloft.net>2014-01-14 17:46:13 -0500
commitc49fa0166391279249483d61511c358580e29ee4 (patch)
tree34d5de250013a76f8949ddf733cebd9385e0379d
parent0a379e21c503b2ff66b44d588df9f231e9b0b9ca (diff)
parentae78dbfa40c629f79c72ab93525508ef49e798b6 (diff)
Merge branch 'netdev_tracing'
Ben Hutchings says: ==================== Improve tracing at the driver/core boundary These patches add static tracpeoints at the driver/core boundary which record various skb fields likely to be useful for datapath debugging. On the TX side the boundary is where the core calls ndo_start_xmit, and on the RX side it is where any of the various exported receive functions is called. The set of skb fields is mostly based on what I thought would be interesting for sfc. These patches are basically the same as what I sent as an RFC in November, but rebased. They now depend on 'net: core: explicitly select a txq before doing l2 forwarding', so please merge net into net-next before trying to apply them. The first patch fixes a code formatting error left behind after that fix. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--include/trace/events/net.h158
-rw-r--r--net/core/dev.c105
2 files changed, 222 insertions, 41 deletions
diff --git a/include/trace/events/net.h b/include/trace/events/net.h
index f99645d05a8f..a34f27b2e394 100644
--- a/include/trace/events/net.h
+++ b/include/trace/events/net.h
@@ -6,9 +6,67 @@
6 6
7#include <linux/skbuff.h> 7#include <linux/skbuff.h>
8#include <linux/netdevice.h> 8#include <linux/netdevice.h>
9#include <linux/if_vlan.h>
9#include <linux/ip.h> 10#include <linux/ip.h>
10#include <linux/tracepoint.h> 11#include <linux/tracepoint.h>
11 12
13TRACE_EVENT(net_dev_start_xmit,
14
15 TP_PROTO(const struct sk_buff *skb, const struct net_device *dev),
16
17 TP_ARGS(skb, dev),
18
19 TP_STRUCT__entry(
20 __string( name, dev->name )
21 __field( u16, queue_mapping )
22 __field( const void *, skbaddr )
23 __field( bool, vlan_tagged )
24 __field( u16, vlan_proto )
25 __field( u16, vlan_tci )
26 __field( u16, protocol )
27 __field( u8, ip_summed )
28 __field( unsigned int, len )
29 __field( unsigned int, data_len )
30 __field( int, network_offset )
31 __field( bool, transport_offset_valid)
32 __field( int, transport_offset)
33 __field( u8, tx_flags )
34 __field( u16, gso_size )
35 __field( u16, gso_segs )
36 __field( u16, gso_type )
37 ),
38
39 TP_fast_assign(
40 __assign_str(name, dev->name);
41 __entry->queue_mapping = skb->queue_mapping;
42 __entry->skbaddr = skb;
43 __entry->vlan_tagged = vlan_tx_tag_present(skb);
44 __entry->vlan_proto = ntohs(skb->vlan_proto);
45 __entry->vlan_tci = vlan_tx_tag_get(skb);
46 __entry->protocol = ntohs(skb->protocol);
47 __entry->ip_summed = skb->ip_summed;
48 __entry->len = skb->len;
49 __entry->data_len = skb->data_len;
50 __entry->network_offset = skb_network_offset(skb);
51 __entry->transport_offset_valid =
52 skb_transport_header_was_set(skb);
53 __entry->transport_offset = skb_transport_offset(skb);
54 __entry->tx_flags = skb_shinfo(skb)->tx_flags;
55 __entry->gso_size = skb_shinfo(skb)->gso_size;
56 __entry->gso_segs = skb_shinfo(skb)->gso_segs;
57 __entry->gso_type = skb_shinfo(skb)->gso_type;
58 ),
59
60 TP_printk("dev=%s queue_mapping=%u skbaddr=%p vlan_tagged=%d vlan_proto=0x%04x vlan_tci=0x%04x protocol=0x%04x ip_summed=%d len=%u data_len=%u network_offset=%d transport_offset_valid=%d transport_offset=%d tx_flags=%d gso_size=%d gso_segs=%d gso_type=%#x",
61 __get_str(name), __entry->queue_mapping, __entry->skbaddr,
62 __entry->vlan_tagged, __entry->vlan_proto, __entry->vlan_tci,
63 __entry->protocol, __entry->ip_summed, __entry->len,
64 __entry->data_len,
65 __entry->network_offset, __entry->transport_offset_valid,
66 __entry->transport_offset, __entry->tx_flags,
67 __entry->gso_size, __entry->gso_segs, __entry->gso_type)
68);
69
12TRACE_EVENT(net_dev_xmit, 70TRACE_EVENT(net_dev_xmit,
13 71
14 TP_PROTO(struct sk_buff *skb, 72 TP_PROTO(struct sk_buff *skb,
@@ -78,6 +136,106 @@ DEFINE_EVENT(net_dev_template, netif_rx,
78 136
79 TP_ARGS(skb) 137 TP_ARGS(skb)
80); 138);
139
140DECLARE_EVENT_CLASS(net_dev_rx_verbose_template,
141
142 TP_PROTO(const struct sk_buff *skb),
143
144 TP_ARGS(skb),
145
146 TP_STRUCT__entry(
147 __string( name, skb->dev->name )
148 __field( unsigned int, napi_id )
149 __field( u16, queue_mapping )
150 __field( const void *, skbaddr )
151 __field( bool, vlan_tagged )
152 __field( u16, vlan_proto )
153 __field( u16, vlan_tci )
154 __field( u16, protocol )
155 __field( u8, ip_summed )
156 __field( u32, rxhash )
157 __field( bool, l4_rxhash )
158 __field( unsigned int, len )
159 __field( unsigned int, data_len )
160 __field( unsigned int, truesize )
161 __field( bool, mac_header_valid)
162 __field( int, mac_header )
163 __field( unsigned char, nr_frags )
164 __field( u16, gso_size )
165 __field( u16, gso_type )
166 ),
167
168 TP_fast_assign(
169 __assign_str(name, skb->dev->name);
170#ifdef CONFIG_NET_RX_BUSY_POLL
171 __entry->napi_id = skb->napi_id;
172#else
173 __entry->napi_id = 0;
174#endif
175 __entry->queue_mapping = skb->queue_mapping;
176 __entry->skbaddr = skb;
177 __entry->vlan_tagged = vlan_tx_tag_present(skb);
178 __entry->vlan_proto = ntohs(skb->vlan_proto);
179 __entry->vlan_tci = vlan_tx_tag_get(skb);
180 __entry->protocol = ntohs(skb->protocol);
181 __entry->ip_summed = skb->ip_summed;
182 __entry->rxhash = skb->rxhash;
183 __entry->l4_rxhash = skb->l4_rxhash;
184 __entry->len = skb->len;
185 __entry->data_len = skb->data_len;
186 __entry->truesize = skb->truesize;
187 __entry->mac_header_valid = skb_mac_header_was_set(skb);
188 __entry->mac_header = skb_mac_header(skb) - skb->data;
189 __entry->nr_frags = skb_shinfo(skb)->nr_frags;
190 __entry->gso_size = skb_shinfo(skb)->gso_size;
191 __entry->gso_type = skb_shinfo(skb)->gso_type;
192 ),
193
194 TP_printk("dev=%s napi_id=%#x queue_mapping=%u skbaddr=%p vlan_tagged=%d vlan_proto=0x%04x vlan_tci=0x%04x protocol=0x%04x ip_summed=%d rxhash=0x%08x l4_rxhash=%d len=%u data_len=%u truesize=%u mac_header_valid=%d mac_header=%d nr_frags=%d gso_size=%d gso_type=%#x",
195 __get_str(name), __entry->napi_id, __entry->queue_mapping,
196 __entry->skbaddr, __entry->vlan_tagged, __entry->vlan_proto,
197 __entry->vlan_tci, __entry->protocol, __entry->ip_summed,
198 __entry->rxhash, __entry->l4_rxhash, __entry->len,
199 __entry->data_len, __entry->truesize,
200 __entry->mac_header_valid, __entry->mac_header,
201 __entry->nr_frags, __entry->gso_size, __entry->gso_type)
202);
203
204DEFINE_EVENT(net_dev_rx_verbose_template, napi_gro_frags_entry,
205
206 TP_PROTO(const struct sk_buff *skb),
207
208 TP_ARGS(skb)
209);
210
211DEFINE_EVENT(net_dev_rx_verbose_template, napi_gro_receive_entry,
212
213 TP_PROTO(const struct sk_buff *skb),
214
215 TP_ARGS(skb)
216);
217
218DEFINE_EVENT(net_dev_rx_verbose_template, netif_receive_skb_entry,
219
220 TP_PROTO(const struct sk_buff *skb),
221
222 TP_ARGS(skb)
223);
224
225DEFINE_EVENT(net_dev_rx_verbose_template, netif_rx_entry,
226
227 TP_PROTO(const struct sk_buff *skb),
228
229 TP_ARGS(skb)
230);
231
232DEFINE_EVENT(net_dev_rx_verbose_template, netif_rx_ni_entry,
233
234 TP_PROTO(const struct sk_buff *skb),
235
236 TP_ARGS(skb)
237);
238
81#endif /* _TRACE_NET_H */ 239#endif /* _TRACE_NET_H */
82 240
83/* This part must be outside protection */ 241/* This part must be outside protection */
diff --git a/net/core/dev.c b/net/core/dev.c
index 2bee80591f9a..20c834e3c7ca 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -147,6 +147,8 @@ struct list_head ptype_base[PTYPE_HASH_SIZE] __read_mostly;
147struct list_head ptype_all __read_mostly; /* Taps */ 147struct list_head ptype_all __read_mostly; /* Taps */
148static struct list_head offload_base __read_mostly; 148static struct list_head offload_base __read_mostly;
149 149
150static int netif_rx_internal(struct sk_buff *skb);
151
150/* 152/*
151 * The @dev_base_head list is protected by @dev_base_lock and the rtnl 153 * The @dev_base_head list is protected by @dev_base_lock and the rtnl
152 * semaphore. 154 * semaphore.
@@ -1698,7 +1700,7 @@ int dev_forward_skb(struct net_device *dev, struct sk_buff *skb)
1698 skb_scrub_packet(skb, true); 1700 skb_scrub_packet(skb, true);
1699 skb->protocol = eth_type_trans(skb, dev); 1701 skb->protocol = eth_type_trans(skb, dev);
1700 1702
1701 return netif_rx(skb); 1703 return netif_rx_internal(skb);
1702} 1704}
1703EXPORT_SYMBOL_GPL(dev_forward_skb); 1705EXPORT_SYMBOL_GPL(dev_forward_skb);
1704 1706
@@ -2596,8 +2598,8 @@ int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev,
2596 dev_queue_xmit_nit(skb, dev); 2598 dev_queue_xmit_nit(skb, dev);
2597 2599
2598 skb_len = skb->len; 2600 skb_len = skb->len;
2599 rc = ops->ndo_start_xmit(skb, dev); 2601 trace_net_dev_start_xmit(skb, dev);
2600 2602 rc = ops->ndo_start_xmit(skb, dev);
2601 trace_net_dev_xmit(skb, rc, dev, skb_len); 2603 trace_net_dev_xmit(skb, rc, dev, skb_len);
2602 if (rc == NETDEV_TX_OK) 2604 if (rc == NETDEV_TX_OK)
2603 txq_trans_update(txq); 2605 txq_trans_update(txq);
@@ -2615,6 +2617,7 @@ gso:
2615 dev_queue_xmit_nit(nskb, dev); 2617 dev_queue_xmit_nit(nskb, dev);
2616 2618
2617 skb_len = nskb->len; 2619 skb_len = nskb->len;
2620 trace_net_dev_start_xmit(nskb, dev);
2618 rc = ops->ndo_start_xmit(nskb, dev); 2621 rc = ops->ndo_start_xmit(nskb, dev);
2619 trace_net_dev_xmit(nskb, rc, dev, skb_len); 2622 trace_net_dev_xmit(nskb, rc, dev, skb_len);
2620 if (unlikely(rc != NETDEV_TX_OK)) { 2623 if (unlikely(rc != NETDEV_TX_OK)) {
@@ -3218,22 +3221,7 @@ enqueue:
3218 return NET_RX_DROP; 3221 return NET_RX_DROP;
3219} 3222}
3220 3223
3221/** 3224static int netif_rx_internal(struct sk_buff *skb)
3222 * netif_rx - post buffer to the network code
3223 * @skb: buffer to post
3224 *
3225 * This function receives a packet from a device driver and queues it for
3226 * the upper (protocol) levels to process. It always succeeds. The buffer
3227 * may be dropped during processing for congestion control or by the
3228 * protocol layers.
3229 *
3230 * return values:
3231 * NET_RX_SUCCESS (no congestion)
3232 * NET_RX_DROP (packet was dropped)
3233 *
3234 */
3235
3236int netif_rx(struct sk_buff *skb)
3237{ 3225{
3238 int ret; 3226 int ret;
3239 3227
@@ -3269,14 +3257,38 @@ int netif_rx(struct sk_buff *skb)
3269 } 3257 }
3270 return ret; 3258 return ret;
3271} 3259}
3260
3261/**
3262 * netif_rx - post buffer to the network code
3263 * @skb: buffer to post
3264 *
3265 * This function receives a packet from a device driver and queues it for
3266 * the upper (protocol) levels to process. It always succeeds. The buffer
3267 * may be dropped during processing for congestion control or by the
3268 * protocol layers.
3269 *
3270 * return values:
3271 * NET_RX_SUCCESS (no congestion)
3272 * NET_RX_DROP (packet was dropped)
3273 *
3274 */
3275
3276int netif_rx(struct sk_buff *skb)
3277{
3278 trace_netif_rx_entry(skb);
3279
3280 return netif_rx_internal(skb);
3281}
3272EXPORT_SYMBOL(netif_rx); 3282EXPORT_SYMBOL(netif_rx);
3273 3283
3274int netif_rx_ni(struct sk_buff *skb) 3284int netif_rx_ni(struct sk_buff *skb)
3275{ 3285{
3276 int err; 3286 int err;
3277 3287
3288 trace_netif_rx_ni_entry(skb);
3289
3278 preempt_disable(); 3290 preempt_disable();
3279 err = netif_rx(skb); 3291 err = netif_rx_internal(skb);
3280 if (local_softirq_pending()) 3292 if (local_softirq_pending())
3281 do_softirq(); 3293 do_softirq();
3282 preempt_enable(); 3294 preempt_enable();
@@ -3661,22 +3673,7 @@ static int __netif_receive_skb(struct sk_buff *skb)
3661 return ret; 3673 return ret;
3662} 3674}
3663 3675
3664/** 3676static int netif_receive_skb_internal(struct sk_buff *skb)
3665 * netif_receive_skb - process receive buffer from network
3666 * @skb: buffer to process
3667 *
3668 * netif_receive_skb() is the main receive data processing function.
3669 * It always succeeds. The buffer may be dropped during processing
3670 * for congestion control or by the protocol layers.
3671 *
3672 * This function may only be called from softirq context and interrupts
3673 * should be enabled.
3674 *
3675 * Return values (usually ignored):
3676 * NET_RX_SUCCESS: no congestion
3677 * NET_RX_DROP: packet was dropped
3678 */
3679int netif_receive_skb(struct sk_buff *skb)
3680{ 3677{
3681 net_timestamp_check(netdev_tstamp_prequeue, skb); 3678 net_timestamp_check(netdev_tstamp_prequeue, skb);
3682 3679
@@ -3702,6 +3699,28 @@ int netif_receive_skb(struct sk_buff *skb)
3702#endif 3699#endif
3703 return __netif_receive_skb(skb); 3700 return __netif_receive_skb(skb);
3704} 3701}
3702
3703/**
3704 * netif_receive_skb - process receive buffer from network
3705 * @skb: buffer to process
3706 *
3707 * netif_receive_skb() is the main receive data processing function.
3708 * It always succeeds. The buffer may be dropped during processing
3709 * for congestion control or by the protocol layers.
3710 *
3711 * This function may only be called from softirq context and interrupts
3712 * should be enabled.
3713 *
3714 * Return values (usually ignored):
3715 * NET_RX_SUCCESS: no congestion
3716 * NET_RX_DROP: packet was dropped
3717 */
3718int netif_receive_skb(struct sk_buff *skb)
3719{
3720 trace_netif_receive_skb_entry(skb);
3721
3722 return netif_receive_skb_internal(skb);
3723}
3705EXPORT_SYMBOL(netif_receive_skb); 3724EXPORT_SYMBOL(netif_receive_skb);
3706 3725
3707/* Network device is going away, flush any packets still pending 3726/* Network device is going away, flush any packets still pending
@@ -3763,7 +3782,7 @@ static int napi_gro_complete(struct sk_buff *skb)
3763 } 3782 }
3764 3783
3765out: 3784out:
3766 return netif_receive_skb(skb); 3785 return netif_receive_skb_internal(skb);
3767} 3786}
3768 3787
3769/* napi->gro_list contains packets ordered by age. 3788/* napi->gro_list contains packets ordered by age.
@@ -3971,7 +3990,7 @@ static gro_result_t napi_skb_finish(gro_result_t ret, struct sk_buff *skb)
3971{ 3990{
3972 switch (ret) { 3991 switch (ret) {
3973 case GRO_NORMAL: 3992 case GRO_NORMAL:
3974 if (netif_receive_skb(skb)) 3993 if (netif_receive_skb_internal(skb))
3975 ret = GRO_DROP; 3994 ret = GRO_DROP;
3976 break; 3995 break;
3977 3996
@@ -3996,6 +4015,8 @@ static gro_result_t napi_skb_finish(gro_result_t ret, struct sk_buff *skb)
3996 4015
3997gro_result_t napi_gro_receive(struct napi_struct *napi, struct sk_buff *skb) 4016gro_result_t napi_gro_receive(struct napi_struct *napi, struct sk_buff *skb)
3998{ 4017{
4018 trace_napi_gro_receive_entry(skb);
4019
3999 return napi_skb_finish(dev_gro_receive(napi, skb), skb); 4020 return napi_skb_finish(dev_gro_receive(napi, skb), skb);
4000} 4021}
4001EXPORT_SYMBOL(napi_gro_receive); 4022EXPORT_SYMBOL(napi_gro_receive);
@@ -4029,7 +4050,7 @@ static gro_result_t napi_frags_finish(struct napi_struct *napi, struct sk_buff *
4029{ 4050{
4030 switch (ret) { 4051 switch (ret) {
4031 case GRO_NORMAL: 4052 case GRO_NORMAL:
4032 if (netif_receive_skb(skb)) 4053 if (netif_receive_skb_internal(skb))
4033 ret = GRO_DROP; 4054 ret = GRO_DROP;
4034 break; 4055 break;
4035 4056
@@ -4068,6 +4089,8 @@ gro_result_t napi_gro_frags(struct napi_struct *napi)
4068 if (!skb) 4089 if (!skb)
4069 return GRO_DROP; 4090 return GRO_DROP;
4070 4091
4092 trace_napi_gro_frags_entry(skb);
4093
4071 return napi_frags_finish(napi, skb, dev_gro_receive(napi, skb)); 4094 return napi_frags_finish(napi, skb, dev_gro_receive(napi, skb));
4072} 4095}
4073EXPORT_SYMBOL(napi_gro_frags); 4096EXPORT_SYMBOL(napi_gro_frags);
@@ -6620,11 +6643,11 @@ static int dev_cpu_callback(struct notifier_block *nfb,
6620 6643
6621 /* Process offline CPU's input_pkt_queue */ 6644 /* Process offline CPU's input_pkt_queue */
6622 while ((skb = __skb_dequeue(&oldsd->process_queue))) { 6645 while ((skb = __skb_dequeue(&oldsd->process_queue))) {
6623 netif_rx(skb); 6646 netif_rx_internal(skb);
6624 input_queue_head_incr(oldsd); 6647 input_queue_head_incr(oldsd);
6625 } 6648 }
6626 while ((skb = __skb_dequeue(&oldsd->input_pkt_queue))) { 6649 while ((skb = __skb_dequeue(&oldsd->input_pkt_queue))) {
6627 netif_rx(skb); 6650 netif_rx_internal(skb);
6628 input_queue_head_incr(oldsd); 6651 input_queue_head_incr(oldsd);
6629 } 6652 }
6630 6653