aboutsummaryrefslogtreecommitdiffstats
path: root/net/core
diff options
context:
space:
mode:
authorBen Hutchings <bhutchings@solarflare.com>2014-01-10 17:17:24 -0500
committerDavid S. Miller <davem@davemloft.net>2014-01-14 17:46:02 -0500
commitae78dbfa40c629f79c72ab93525508ef49e798b6 (patch)
tree34d5de250013a76f8949ddf733cebd9385e0379d /net/core
parentd87d04a7851f067a06bb10acca8aca62a8cad6f0 (diff)
net: Add trace events for all receive entry points, exposing more skb fields
The existing net/netif_rx and net/netif_receive_skb trace events provide little information about the skb, nor do they indicate how it entered the stack. Add trace events at entry of each of the exported functions, including most fields that are likely to be interesting for debugging driver datapath behaviour. Split netif_rx() and netif_receive_skb() so that internal calls are not traced. Signed-off-by: Ben Hutchings <bhutchings@solarflare.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/core')
-rw-r--r--net/core/dev.c100
1 files changed, 61 insertions, 39 deletions
diff --git a/net/core/dev.c b/net/core/dev.c
index 9e93a1464216..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
@@ -3219,22 +3221,7 @@ enqueue:
3219 return NET_RX_DROP; 3221 return NET_RX_DROP;
3220} 3222}
3221 3223
3222/** 3224static int netif_rx_internal(struct sk_buff *skb)
3223 * netif_rx - post buffer to the network code
3224 * @skb: buffer to post
3225 *
3226 * This function receives a packet from a device driver and queues it for
3227 * the upper (protocol) levels to process. It always succeeds. The buffer
3228 * may be dropped during processing for congestion control or by the
3229 * protocol layers.
3230 *
3231 * return values:
3232 * NET_RX_SUCCESS (no congestion)
3233 * NET_RX_DROP (packet was dropped)
3234 *
3235 */
3236
3237int netif_rx(struct sk_buff *skb)
3238{ 3225{
3239 int ret; 3226 int ret;
3240 3227
@@ -3270,14 +3257,38 @@ int netif_rx(struct sk_buff *skb)
3270 } 3257 }
3271 return ret; 3258 return ret;
3272} 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}
3273EXPORT_SYMBOL(netif_rx); 3282EXPORT_SYMBOL(netif_rx);
3274 3283
3275int netif_rx_ni(struct sk_buff *skb) 3284int netif_rx_ni(struct sk_buff *skb)
3276{ 3285{
3277 int err; 3286 int err;
3278 3287
3288 trace_netif_rx_ni_entry(skb);
3289
3279 preempt_disable(); 3290 preempt_disable();
3280 err = netif_rx(skb); 3291 err = netif_rx_internal(skb);
3281 if (local_softirq_pending()) 3292 if (local_softirq_pending())
3282 do_softirq(); 3293 do_softirq();
3283 preempt_enable(); 3294 preempt_enable();
@@ -3662,22 +3673,7 @@ static int __netif_receive_skb(struct sk_buff *skb)
3662 return ret; 3673 return ret;
3663} 3674}
3664 3675
3665/** 3676static int netif_receive_skb_internal(struct sk_buff *skb)
3666 * netif_receive_skb - process receive buffer from network
3667 * @skb: buffer to process
3668 *
3669 * netif_receive_skb() is the main receive data processing function.
3670 * It always succeeds. The buffer may be dropped during processing
3671 * for congestion control or by the protocol layers.
3672 *
3673 * This function may only be called from softirq context and interrupts
3674 * should be enabled.
3675 *
3676 * Return values (usually ignored):
3677 * NET_RX_SUCCESS: no congestion
3678 * NET_RX_DROP: packet was dropped
3679 */
3680int netif_receive_skb(struct sk_buff *skb)
3681{ 3677{
3682 net_timestamp_check(netdev_tstamp_prequeue, skb); 3678 net_timestamp_check(netdev_tstamp_prequeue, skb);
3683 3679
@@ -3703,6 +3699,28 @@ int netif_receive_skb(struct sk_buff *skb)
3703#endif 3699#endif
3704 return __netif_receive_skb(skb); 3700 return __netif_receive_skb(skb);
3705} 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}
3706EXPORT_SYMBOL(netif_receive_skb); 3724EXPORT_SYMBOL(netif_receive_skb);
3707 3725
3708/* Network device is going away, flush any packets still pending 3726/* Network device is going away, flush any packets still pending
@@ -3764,7 +3782,7 @@ static int napi_gro_complete(struct sk_buff *skb)
3764 } 3782 }
3765 3783
3766out: 3784out:
3767 return netif_receive_skb(skb); 3785 return netif_receive_skb_internal(skb);
3768} 3786}
3769 3787
3770/* napi->gro_list contains packets ordered by age. 3788/* napi->gro_list contains packets ordered by age.
@@ -3972,7 +3990,7 @@ static gro_result_t napi_skb_finish(gro_result_t ret, struct sk_buff *skb)
3972{ 3990{
3973 switch (ret) { 3991 switch (ret) {
3974 case GRO_NORMAL: 3992 case GRO_NORMAL:
3975 if (netif_receive_skb(skb)) 3993 if (netif_receive_skb_internal(skb))
3976 ret = GRO_DROP; 3994 ret = GRO_DROP;
3977 break; 3995 break;
3978 3996
@@ -3997,6 +4015,8 @@ static gro_result_t napi_skb_finish(gro_result_t ret, struct sk_buff *skb)
3997 4015
3998gro_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)
3999{ 4017{
4018 trace_napi_gro_receive_entry(skb);
4019
4000 return napi_skb_finish(dev_gro_receive(napi, skb), skb); 4020 return napi_skb_finish(dev_gro_receive(napi, skb), skb);
4001} 4021}
4002EXPORT_SYMBOL(napi_gro_receive); 4022EXPORT_SYMBOL(napi_gro_receive);
@@ -4030,7 +4050,7 @@ static gro_result_t napi_frags_finish(struct napi_struct *napi, struct sk_buff *
4030{ 4050{
4031 switch (ret) { 4051 switch (ret) {
4032 case GRO_NORMAL: 4052 case GRO_NORMAL:
4033 if (netif_receive_skb(skb)) 4053 if (netif_receive_skb_internal(skb))
4034 ret = GRO_DROP; 4054 ret = GRO_DROP;
4035 break; 4055 break;
4036 4056
@@ -4069,6 +4089,8 @@ gro_result_t napi_gro_frags(struct napi_struct *napi)
4069 if (!skb) 4089 if (!skb)
4070 return GRO_DROP; 4090 return GRO_DROP;
4071 4091
4092 trace_napi_gro_frags_entry(skb);
4093
4072 return napi_frags_finish(napi, skb, dev_gro_receive(napi, skb)); 4094 return napi_frags_finish(napi, skb, dev_gro_receive(napi, skb));
4073} 4095}
4074EXPORT_SYMBOL(napi_gro_frags); 4096EXPORT_SYMBOL(napi_gro_frags);
@@ -6621,11 +6643,11 @@ static int dev_cpu_callback(struct notifier_block *nfb,
6621 6643
6622 /* Process offline CPU's input_pkt_queue */ 6644 /* Process offline CPU's input_pkt_queue */
6623 while ((skb = __skb_dequeue(&oldsd->process_queue))) { 6645 while ((skb = __skb_dequeue(&oldsd->process_queue))) {
6624 netif_rx(skb); 6646 netif_rx_internal(skb);
6625 input_queue_head_incr(oldsd); 6647 input_queue_head_incr(oldsd);
6626 } 6648 }
6627 while ((skb = __skb_dequeue(&oldsd->input_pkt_queue))) { 6649 while ((skb = __skb_dequeue(&oldsd->input_pkt_queue))) {
6628 netif_rx(skb); 6650 netif_rx_internal(skb);
6629 input_queue_head_incr(oldsd); 6651 input_queue_head_incr(oldsd);
6630 } 6652 }
6631 6653