diff options
author | Satoru Moriya <satoru.moriya@hds.com> | 2011-06-17 07:58:39 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-06-21 19:06:10 -0400 |
commit | 296f7ea75b45913d5e2067baef0812087e0b6eb9 (patch) | |
tree | 94a5774a525ebb388306a4ae2aef90a0706031f4 | |
parent | dec17b74516bb780de75b41e7cfa0072df16bb82 (diff) |
udp: add tracepoints for queueing skb to rcvbuf
This patch adds a tracepoint to __udp_queue_rcv_skb to get the
return value of ip_queue_rcv_skb. It indicates why kernel drops
a packet at this point.
ip_queue_rcv_skb returns following values in the packet drop case:
rcvbuf is full : -ENOMEM
sk_filter returns error : -EINVAL, -EACCESS, -ENOMEM, etc.
__sk_mem_schedule returns error: -ENOBUF
Signed-off-by: Satoru Moriya <satoru.moriya@hds.com>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | include/trace/events/udp.h | 32 | ||||
-rw-r--r-- | net/core/net-traces.c | 1 | ||||
-rw-r--r-- | net/ipv4/udp.c | 2 |
3 files changed, 35 insertions, 0 deletions
diff --git a/include/trace/events/udp.h b/include/trace/events/udp.h new file mode 100644 index 000000000000..a664bb940973 --- /dev/null +++ b/include/trace/events/udp.h | |||
@@ -0,0 +1,32 @@ | |||
1 | #undef TRACE_SYSTEM | ||
2 | #define TRACE_SYSTEM udp | ||
3 | |||
4 | #if !defined(_TRACE_UDP_H) || defined(TRACE_HEADER_MULTI_READ) | ||
5 | #define _TRACE_UDP_H | ||
6 | |||
7 | #include <linux/udp.h> | ||
8 | #include <linux/tracepoint.h> | ||
9 | |||
10 | TRACE_EVENT(udp_fail_queue_rcv_skb, | ||
11 | |||
12 | TP_PROTO(int rc, struct sock *sk), | ||
13 | |||
14 | TP_ARGS(rc, sk), | ||
15 | |||
16 | TP_STRUCT__entry( | ||
17 | __field(int, rc) | ||
18 | __field(__u16, lport) | ||
19 | ), | ||
20 | |||
21 | TP_fast_assign( | ||
22 | __entry->rc = rc; | ||
23 | __entry->lport = inet_sk(sk)->inet_num; | ||
24 | ), | ||
25 | |||
26 | TP_printk("rc=%d port=%hu", __entry->rc, __entry->lport) | ||
27 | ); | ||
28 | |||
29 | #endif /* _TRACE_UDP_H */ | ||
30 | |||
31 | /* This part must be outside protection */ | ||
32 | #include <trace/define_trace.h> | ||
diff --git a/net/core/net-traces.c b/net/core/net-traces.c index 7f1bb2aba03b..13aab64520ad 100644 --- a/net/core/net-traces.c +++ b/net/core/net-traces.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #include <trace/events/skb.h> | 28 | #include <trace/events/skb.h> |
29 | #include <trace/events/net.h> | 29 | #include <trace/events/net.h> |
30 | #include <trace/events/napi.h> | 30 | #include <trace/events/napi.h> |
31 | #include <trace/events/udp.h> | ||
31 | 32 | ||
32 | EXPORT_TRACEPOINT_SYMBOL_GPL(kfree_skb); | 33 | EXPORT_TRACEPOINT_SYMBOL_GPL(kfree_skb); |
33 | 34 | ||
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index abca870d8ff6..37aa9bf8d382 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c | |||
@@ -105,6 +105,7 @@ | |||
105 | #include <net/route.h> | 105 | #include <net/route.h> |
106 | #include <net/checksum.h> | 106 | #include <net/checksum.h> |
107 | #include <net/xfrm.h> | 107 | #include <net/xfrm.h> |
108 | #include <trace/events/udp.h> | ||
108 | #include "udp_impl.h" | 109 | #include "udp_impl.h" |
109 | 110 | ||
110 | struct udp_table udp_table __read_mostly; | 111 | struct udp_table udp_table __read_mostly; |
@@ -1363,6 +1364,7 @@ static int __udp_queue_rcv_skb(struct sock *sk, struct sk_buff *skb) | |||
1363 | is_udplite); | 1364 | is_udplite); |
1364 | UDP_INC_STATS_BH(sock_net(sk), UDP_MIB_INERRORS, is_udplite); | 1365 | UDP_INC_STATS_BH(sock_net(sk), UDP_MIB_INERRORS, is_udplite); |
1365 | kfree_skb(skb); | 1366 | kfree_skb(skb); |
1367 | trace_udp_fail_queue_rcv_skb(rc, sk); | ||
1366 | return -1; | 1368 | return -1; |
1367 | } | 1369 | } |
1368 | 1370 | ||