aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeil Horman <nhorman@tuxdriver.com>2009-08-13 01:19:44 -0400
committerDavid S. Miller <davem@davemloft.net>2009-08-13 19:26:14 -0400
commite9b3cc1b3779fe10a80de4c3e7404bd308d0eae3 (patch)
tree3c6c8ea0fd37a2d26eb7d06f2ce29baf98503702
parent1e5053b7635c6a985a7cd8108e538883d961de2a (diff)
net: skb ftracer - add tracepoint to skb_copy_datagram_iovec (v3)
skb allocation / cosumption tracer - Add consumption tracepoint This patch adds a tracepoint to skb_copy_datagram_iovec, which is called each time a userspace process copies a frame from a socket receive queue to a user space buffer. It allows us to hook in and examine each sk_buff that the system receives on a per-socket bases, and can be use to compile a list of which skb's were received by which processes. Signed-off-by: Neil Horman <nhorman@tuxdriver.com> include/trace/events/skb.h | 20 ++++++++++++++++++++ net/core/datagram.c | 3 +++ 2 files changed, 23 insertions(+) Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--include/trace/events/skb.h20
-rw-r--r--net/core/datagram.c3
2 files changed, 23 insertions, 0 deletions
diff --git a/include/trace/events/skb.h b/include/trace/events/skb.h
index e499863b9669..4b2be6dc76f0 100644
--- a/include/trace/events/skb.h
+++ b/include/trace/events/skb.h
@@ -5,6 +5,7 @@
5#define _TRACE_SKB_H 5#define _TRACE_SKB_H
6 6
7#include <linux/skbuff.h> 7#include <linux/skbuff.h>
8#include <linux/netdevice.h>
8#include <linux/tracepoint.h> 9#include <linux/tracepoint.h>
9 10
10/* 11/*
@@ -34,6 +35,25 @@ TRACE_EVENT(kfree_skb,
34 __entry->skbaddr, __entry->protocol, __entry->location) 35 __entry->skbaddr, __entry->protocol, __entry->location)
35); 36);
36 37
38TRACE_EVENT(skb_copy_datagram_iovec,
39
40 TP_PROTO(const struct sk_buff *skb, int len),
41
42 TP_ARGS(skb, len),
43
44 TP_STRUCT__entry(
45 __field( const void *, skbaddr )
46 __field( int, len )
47 ),
48
49 TP_fast_assign(
50 __entry->skbaddr = skb;
51 __entry->len = len;
52 ),
53
54 TP_printk("skbaddr=%p len=%d", __entry->skbaddr, __entry->len)
55);
56
37#endif /* _TRACE_SKB_H */ 57#endif /* _TRACE_SKB_H */
38 58
39/* This part must be outside protection */ 59/* This part must be outside protection */
diff --git a/net/core/datagram.c b/net/core/datagram.c
index b0fe69211eef..1c6cf3a1a4f6 100644
--- a/net/core/datagram.c
+++ b/net/core/datagram.c
@@ -55,6 +55,7 @@
55#include <net/checksum.h> 55#include <net/checksum.h>
56#include <net/sock.h> 56#include <net/sock.h>
57#include <net/tcp_states.h> 57#include <net/tcp_states.h>
58#include <trace/events/skb.h>
58 59
59/* 60/*
60 * Is a socket 'connection oriented' ? 61 * Is a socket 'connection oriented' ?
@@ -284,6 +285,8 @@ int skb_copy_datagram_iovec(const struct sk_buff *skb, int offset,
284 int i, copy = start - offset; 285 int i, copy = start - offset;
285 struct sk_buff *frag_iter; 286 struct sk_buff *frag_iter;
286 287
288 trace_skb_copy_datagram_iovec(skb, len);
289
287 /* Copy header. */ 290 /* Copy header. */
288 if (copy > 0) { 291 if (copy > 0) {
289 if (copy > len) 292 if (copy > len)