net: skb ftracer - add tracepoint to skb_copy_datagram_iovec (v3)
authorNeil Horman <nhorman@tuxdriver.com>
Thu, 13 Aug 2009 05:19:44 +0000 (05:19 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 13 Aug 2009 23:26:14 +0000 (16:26 -0700)
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>
include/trace/events/skb.h
net/core/datagram.c

index e499863b96693b108fef4c2bc5b07fd52624ba63..4b2be6dc76f091647eb30f30a40a49218def8682 100644 (file)
@@ -5,6 +5,7 @@
 #define _TRACE_SKB_H
 
 #include <linux/skbuff.h>
+#include <linux/netdevice.h>
 #include <linux/tracepoint.h>
 
 /*
@@ -34,6 +35,25 @@ TRACE_EVENT(kfree_skb,
                __entry->skbaddr, __entry->protocol, __entry->location)
 );
 
+TRACE_EVENT(skb_copy_datagram_iovec,
+
+       TP_PROTO(const struct sk_buff *skb, int len),
+
+       TP_ARGS(skb, len),
+
+       TP_STRUCT__entry(
+               __field(        const void *,           skbaddr         )
+               __field(        int,                    len             )
+       ),
+
+       TP_fast_assign(
+               __entry->skbaddr = skb;
+               __entry->len = len;
+       ),
+
+       TP_printk("skbaddr=%p len=%d", __entry->skbaddr, __entry->len)
+);
+
 #endif /* _TRACE_SKB_H */
 
 /* This part must be outside protection */
index b0fe69211eefef1e18224fa123d2b13498bffefa..1c6cf3a1a4f6abc3c605e492c4381d40103d3094 100644 (file)
@@ -55,6 +55,7 @@
 #include <net/checksum.h>
 #include <net/sock.h>
 #include <net/tcp_states.h>
+#include <trace/events/skb.h>
 
 /*
  *     Is a socket 'connection oriented' ?
@@ -284,6 +285,8 @@ int skb_copy_datagram_iovec(const struct sk_buff *skb, int offset,
        int i, copy = start - offset;
        struct sk_buff *frag_iter;
 
+       trace_skb_copy_datagram_iovec(skb, len);
+
        /* Copy header. */
        if (copy > 0) {
                if (copy > len)