From mboxrd@z Thu Jan 1 00:00:00 1970 From: Koki Sanagi Subject: Re: [PATCH 2/5] tracing/events: add tracepoint to IP protocol Date: Wed, 20 Jan 2010 10:03:12 +0900 Message-ID: <4B565650.5070006@jp.fujitsu.com> References: <4B541B8F.8080801@jp.fujitsu.com> <4B555B27.5030505@cn.fujitsu.com> <4B555DF2.3090104@cn.fujitsu.com> Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Cc: netdev@vger.kernel.org, davem@davemloft.net, nhorman@tuxdriver.com, izumi.taku@jp.fujitsu.com, kaneshige.kenji@jp.fujitsu.com To: Yang Hongyang Return-path: Received: from fgwmail6.fujitsu.co.jp ([192.51.44.36]:53035 "EHLO fgwmail6.fujitsu.co.jp" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752397Ab0ATBD3 (ORCPT ); Tue, 19 Jan 2010 20:03:29 -0500 Received: from m1.gw.fujitsu.co.jp ([10.0.50.71]) by fgwmail6.fujitsu.co.jp (Fujitsu Gateway) with ESMTP id o0K13RDL006704 for (envelope-from sanagi.koki@jp.fujitsu.com); Wed, 20 Jan 2010 10:03:27 +0900 Received: from smail (m1 [127.0.0.1]) by outgoing.m1.gw.fujitsu.co.jp (Postfix) with ESMTP id F162545DE52 for ; Wed, 20 Jan 2010 10:03:26 +0900 (JST) Received: from s1.gw.fujitsu.co.jp (s1.gw.fujitsu.co.jp [10.0.50.91]) by m1.gw.fujitsu.co.jp (Postfix) with ESMTP id AE0B945DE4F for ; Wed, 20 Jan 2010 10:03:26 +0900 (JST) Received: from s1.gw.fujitsu.co.jp (localhost.localdomain [127.0.0.1]) by s1.gw.fujitsu.co.jp (Postfix) with ESMTP id 84C781DB8040 for ; Wed, 20 Jan 2010 10:03:26 +0900 (JST) Received: from m105.s.css.fujitsu.com (m105.s.css.fujitsu.com [10.249.87.105]) by s1.gw.fujitsu.co.jp (Postfix) with ESMTP id 1B4AEE38006 for ; Wed, 20 Jan 2010 10:03:26 +0900 (JST) In-Reply-To: <4B555DF2.3090104@cn.fujitsu.com> Sender: netdev-owner@vger.kernel.org List-ID: Thanks for your reply. (2010/01/19 16:23), Yang Hongyang wrote: > Yang Hongyang wrote: >> Koki Sanagi wrote: >>> This patch adds tracepoints at IP protocol, skb_clone and locations where >>> copy user data to skb. >>> >>> skb_clone chase the cloned skb >>> senddata_copy_skb copy userdata to skb for transmit >>> ip_queue_xmit entry of IP layer(TCP transmit) >>> ip_push_pending_frames entry of IP layer(UDP transmit) >>> ip_output entry of IP layer(RAW transmit) >>> ip_frag_queue aggregate fragmented packet >>> ip_frag_reasm reasemble fragmented packet >>> ip_rcv entry of IP layer(receive) >>> >>> Signed-off-by: Koki Sanagi >>> --- >>> include/trace/events/skb.h | 188 ++++++++++++++++++++++++++++++++++++++++++++ >>> net/core/skbuff.c | 1 + >>> net/ipv4/ip_fragment.c | 3 + >>> net/ipv4/ip_input.c | 3 + >>> net/ipv4/ip_output.c | 11 +++ >>> 5 files changed, 206 insertions(+), 0 deletions(-) >>> >>> diff --git a/include/trace/events/skb.h b/include/trace/events/skb.h >>> index d732f07..a33893f 100644 >>> --- a/include/trace/events/skb.h >>> +++ b/include/trace/events/skb.h >>> @@ -6,8 +6,154 @@ >>> >>> #include >>> #include >>> +#include >>> #include >>> >>> +#define FORMAT_IPADDR(x) ((unsigned char *)&x)[3],\ >>> + ((unsigned char *)&x)[2],\ >>> + ((unsigned char *)&x)[1],\ >>> + ((unsigned char *)&x)[0] >> >> I think you should use ntohl() to convert Big endian to Little endian. >> Otherwise you will have problems on some other platforms. > > Sorry,Please ignore this comment.I didn't notice that you have use ntohl in TP_fast_assign. > Yeah, this is correct. But it may be better to use ntohl in FORMAT_IPADDR or TP_printk than in TP_fast_assign. >> >>> + >>> +TRACE_EVENT(ip_queue_xmit, >>> + >>> + TP_PROTO(struct sk_buff *skb), >>> + >>> + TP_ARGS(skb), >>> + >>> + TP_STRUCT__entry( >>> + __field( const void *, skbaddr ) >>> + __field( unsigned int, saddr ) >>> + __field( unsigned int, daddr ) >>> + ), >>> + >>> + TP_fast_assign( >>> + __entry->skbaddr = skb; >>> + __entry->saddr = ntohl(ip_hdr(skb)->saddr); >>> + __entry->daddr = ntohl(ip_hdr(skb)->daddr); >>> + ), >>> + >>> + TP_printk("skbaddr=%p saddr=%u.%u.%u.%u daddr=%u.%u.%u.%u", >>> + __entry->skbaddr, >>> + FORMAT_IPADDR(__entry->saddr), >>> + FORMAT_IPADDR(__entry->daddr) >> >> Just as I said above,use "FORMAT_IPADDR(ntohl(__entry->daddr))" instead. >> Same on other places. >> >>> + ) >>> +); >>> + >>> +TRACE_EVENT(ip_push_pending_frames, >>> + >>> + TP_PROTO(struct sk_buff *skb), >>> + >>> + TP_ARGS(skb), >>> + >>> + TP_STRUCT__entry( >>> + __field( const void *, skbaddr ) >>> + __field( unsigned int, saddr ) >>> + __field( unsigned int, daddr ) >>> + ), >>> + >>> + TP_fast_assign( >>> + __entry->skbaddr = skb; >>> + __entry->saddr = ntohl(((struct iphdr *)skb->data)->saddr); >>> + __entry->daddr = ntohl(((struct iphdr *)skb->data)->daddr); >>> + ), >>> + >>> + TP_printk("skbaddr=%p saddr=%u.%u.%u.%u daddr=%u.%u.%u.%u", >>> + __entry->skbaddr, >>> + FORMAT_IPADDR(__entry->saddr), >>> + FORMAT_IPADDR(__entry->daddr) >>> + ) >>> +); >>> + >>> +TRACE_EVENT(ip_output, >>> + >>> + TP_PROTO(struct sk_buff *skb), >>> + >>> + TP_ARGS(skb), >>> + >>> + TP_STRUCT__entry( >>> + __field( const void *, skbaddr ) >>> + __field( unsigned int, saddr ) >>> + __field( unsigned int, daddr ) >>> + ), >>> + >>> + TP_fast_assign( >>> + __entry->skbaddr = skb; >>> + __entry->saddr = ntohl(ip_hdr(skb)->saddr); >>> + __entry->daddr = ntohl(ip_hdr(skb)->daddr); >>> + ), >>> + >>> + TP_printk("skbaddr=%p saddr=%u.%u.%u.%u daddr=%u.%u.%u.%u", >>> + __entry->skbaddr, >>> + FORMAT_IPADDR(__entry->saddr), >>> + FORMAT_IPADDR(__entry->daddr) >>> + ) >>> +); >>> + >>> +TRACE_EVENT(ip_rcv, >>> + >>> + TP_PROTO(struct sk_buff *skb), >>> + >>> + TP_ARGS(skb), >>> + >>> + TP_STRUCT__entry( >>> + __field( const void *, skbaddr ) >>> + __field( unsigned int, saddr ) >>> + __field( unsigned int, daddr ) >>> + ), >>> + >>> + TP_fast_assign( >>> + __entry->skbaddr = skb; >>> + __entry->saddr = ntohl(ip_hdr(skb)->saddr); >>> + __entry->daddr = ntohl(ip_hdr(skb)->daddr); >>> + ), >>> + >>> + TP_printk("skbaddr=%p saddr=%u.%u.%u.%u daddr=%u.%u.%u.%u", >>> + __entry->skbaddr, >>> + FORMAT_IPADDR(__entry->saddr), >>> + FORMAT_IPADDR(__entry->daddr) >>> + ) >>> +); >>> + >>> +TRACE_EVENT(ip_frag_queue, >>> + >>> + TP_PROTO(struct sk_buff *skb, struct sk_buff *prev), >>> + >>> + TP_ARGS(skb, prev), >>> + >>> + TP_STRUCT__entry( >>> + __field( const void *, skbaddr ) >>> + __field( const void *, prevaddr ) >>> + ), >>> + >>> + TP_fast_assign( >>> + __entry->skbaddr = skb; >>> + __entry->prevaddr = prev; >>> + ), >>> + >>> + TP_printk("skbaddr=%p prev=%p", >>> + __entry->skbaddr, __entry->prevaddr) >>> +); >>> + >>> +TRACE_EVENT(ip_frag_reasm, >>> + >>> + TP_PROTO(struct sk_buff *head), >>> + >>> + TP_ARGS(head), >>> + >>> + TP_STRUCT__entry( >>> + __field( const void *, skbaddr ) >>> + __field( unsigned int, len ) >>> + ), >>> + >>> + TP_fast_assign( >>> + __entry->skbaddr = head; >>> + __entry->len = head->len; >>> + ), >>> + >>> + TP_printk("head=%p len=%u", >>> + __entry->skbaddr, __entry->len) >>> +); >>> + >>> TRACE_EVENT(dev_queue_xmit, >>> >>> TP_PROTO(struct sk_buff *skb, >>> @@ -77,6 +223,48 @@ TRACE_EVENT(netdev_receive_skb, >>> __get_str(name), __entry->skbaddr, __entry->len) >>> ); >>> >>> +TRACE_EVENT(senddata_copy_skb, >>> + >>> + TP_PROTO(struct sock *sk, struct sk_buff *skb, int len), >>> + >>> + TP_ARGS(sk, skb, len), >>> + >>> + TP_STRUCT__entry( >>> + __field( const void *, skaddr ) >>> + __field( const void *, skbaddr ) >>> + __field( int, len ) >>> + ), >>> + >>> + TP_fast_assign( >>> + __entry->skaddr = sk; >>> + __entry->skbaddr = skb; >>> + __entry->len = len; >>> + ), >>> + >>> + TP_printk("sk=%p skbaddr=%p len=%d", >>> + __entry->skaddr, __entry->skbaddr, __entry->len) >>> +); >>> + >>> +TRACE_EVENT(skb_clone, >>> + >>> + TP_PROTO(struct sk_buff *original_skb, struct sk_buff *clone_skb), >>> + >>> + TP_ARGS(original_skb, clone_skb), >>> + >>> + TP_STRUCT__entry( >>> + __field( const void *, original_skbaddr ) >>> + __field( const void *, clone_skbaddr ) >>> + ), >>> + >>> + TP_fast_assign( >>> + __entry->original_skbaddr = original_skb; >>> + __entry->clone_skbaddr = clone_skb; >>> + ), >>> + >>> + TP_printk("original=%p clone=%p", >>> + __entry->original_skbaddr, __entry->clone_skbaddr) >>> +); >>> + >>> /* >>> * Tracepoint for free an sk_buff: >>> */ >>> diff --git a/net/core/skbuff.c b/net/core/skbuff.c >>> index 93c4e06..1712416 100644 >>> --- a/net/core/skbuff.c >>> +++ b/net/core/skbuff.c >>> @@ -649,6 +649,7 @@ struct sk_buff *skb_clone(struct sk_buff *skb, gfp_t gfp_mask) >>> kmemcheck_annotate_bitfield(n, flags2); >>> n->fclone = SKB_FCLONE_UNAVAILABLE; >>> } >>> + trace_skb_clone(skb, n); >>> >>> return __skb_clone(n, skb); >>> } >>> diff --git a/net/ipv4/ip_fragment.c b/net/ipv4/ip_fragment.c >>> index 86964b3..c7e683c 100644 >>> --- a/net/ipv4/ip_fragment.c >>> +++ b/net/ipv4/ip_fragment.c >>> @@ -42,6 +42,7 @@ >>> #include >>> #include >>> #include >>> +#include >>> >>> /* NOTE. Logic of IP defragmentation is parallel to corresponding IPv6 >>> * code now. If you change something here, _PLEASE_ update ipv6/reassembly.c >>> @@ -428,6 +429,7 @@ static int ip_frag_queue(struct ipq *qp, struct sk_buff *skb) >>> >>> /* Insert this fragment in the chain of fragments. */ >>> skb->next = next; >>> + trace_ip_frag_queue(skb, prev); >>> if (prev) >>> prev->next = skb; >>> else >>> @@ -492,6 +494,7 @@ static int ip_frag_reasm(struct ipq *qp, struct sk_buff *prev, >>> >>> WARN_ON(head == NULL); >>> WARN_ON(FRAG_CB(head)->offset != 0); >>> + trace_ip_frag_reasm(head); >>> >>> /* Allocate a new buffer for the datagram. */ >>> ihlen = ip_hdrlen(head); >>> diff --git a/net/ipv4/ip_input.c b/net/ipv4/ip_input.c >>> index c29de98..6fbbd34 100644 >>> --- a/net/ipv4/ip_input.c >>> +++ b/net/ipv4/ip_input.c >>> @@ -144,6 +144,8 @@ >>> #include >>> #include >>> >>> +#include >>> + >>> /* >>> * Process Router Attention IP option >>> */ >>> @@ -383,6 +385,7 @@ int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, >>> /* When the interface is in promisc. mode, drop all the crap >>> * that it receives, do not try to analyse it. >>> */ >>> + trace_ip_rcv(skb); >>> if (skb->pkt_type == PACKET_OTHERHOST) >>> goto drop; >>> >>> diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c >>> index 3451799..3dac18c 100644 >>> --- a/net/ipv4/ip_output.c >>> +++ b/net/ipv4/ip_output.c >>> @@ -80,6 +80,8 @@ >>> #include >>> #include >>> >>> +#include >>> + >>> int sysctl_ip_default_ttl __read_mostly = IPDEFTTL; >>> >>> /* Generate a checksum for an outgoing IP datagram. */ >>> @@ -300,6 +302,7 @@ int ip_output(struct sk_buff *skb) >>> { >>> struct net_device *dev = skb_dst(skb)->dev; >>> >>> + trace_ip_output(skb); >>> IP_UPD_PO_STATS(dev_net(dev), IPSTATS_MIB_OUT, skb->len); >>> >>> skb->dev = dev; >>> @@ -378,6 +381,7 @@ packet_routed: >>> iph->saddr = rt->rt_src; >>> iph->daddr = rt->rt_dst; >>> /* Transport layer set skb->h.foo itself. */ >>> + trace_ip_queue_xmit(skb); >>> >>> if (opt&& opt->optlen) { >>> iph->ihl += opt->optlen>> 2; >>> @@ -991,6 +995,7 @@ alloc_new_skb: >>> /* >>> * Put the packet on the pending queue. >>> */ >>> + trace_senddata_copy_skb(sk, skb, copy); >>> __skb_queue_tail(&sk->sk_write_queue, skb); >>> continue; >>> } >>> @@ -1008,6 +1013,7 @@ alloc_new_skb: >>> err = -EFAULT; >>> goto error; >>> } >>> + trace_senddata_copy_skb(sk, skb, copy); >>> } else { >>> int i = skb_shinfo(skb)->nr_frags; >>> skb_frag_t *frag =&skb_shinfo(skb)->frags[i-1]; >>> @@ -1054,6 +1060,7 @@ alloc_new_skb: >>> skb->data_len += copy; >>> skb->truesize += copy; >>> atomic_add(copy,&sk->sk_wmem_alloc); >>> + trace_senddata_copy_skb(sk, skb, copy); >>> } >>> offset += copy; >>> length -= copy; >>> @@ -1171,6 +1178,7 @@ ssize_t ip_append_page(struct sock *sk, struct page *page, >>> /* >>> * Put the packet on the pending queue. >>> */ >>> + trace_senddata_copy_skb(sk, skb, len); >>> __skb_queue_tail(&sk->sk_write_queue, skb); >>> continue; >>> } >>> @@ -1200,6 +1208,7 @@ ssize_t ip_append_page(struct sock *sk, struct page *page, >>> atomic_add(len,&sk->sk_wmem_alloc); >>> offset += len; >>> size -= len; >>> + trace_senddata_copy_skb(sk, skb, len); >>> } >>> return 0; >>> >>> @@ -1291,6 +1300,8 @@ int ip_push_pending_frames(struct sock *sk) >>> iph->saddr = rt->rt_src; >>> iph->daddr = rt->rt_dst; >>> >>> + trace_ip_push_pending_frames(skb); >>> + >>> skb->priority = sk->sk_priority; >>> skb->mark = sk->sk_mark; >>> /* >>> >>> -- >>> To unsubscribe from this list: send the line "unsubscribe netdev" in >>> the body of a message to majordomo@vger.kernel.org >>> More majordomo info at http://vger.kernel.org/majordomo-info.html >>> >>> >> >> > >