• Menglong Dong's avatar
    net: skb: export skb drop reaons to user by TRACE_DEFINE_ENUM · 9cb252c4
    Menglong Dong authored
    As Eric reported, the 'reason' field is not presented when trace the
    kfree_skb event by perf:
    
    $ perf record -e skb:kfree_skb -a sleep 10
    $ perf script
      ip_defrag 14605 [021]   221.614303:   skb:kfree_skb:
      skbaddr=0xffff9d2851242700 protocol=34525 location=0xffffffffa39346b1
      reason:
    
    The cause seems to be passing kernel address directly to TP_printk(),
    which is not right. As the enum 'skb_drop_reason' is not exported to
    user space through TRACE_DEFINE_ENUM(), perf can't get the drop reason
    string from the 'reason' field, which is a number.
    
    Therefore, we introduce the macro DEFINE_DROP_REASON(), which is used
    to define the trace enum by TRACE_DEFINE_ENUM(). With the help of
    DEFINE_DROP_REASON(), now we can remove the auto-generate that we
    introduced in the commit ec43908d
    ("net: skb: use auto-generation to convert skb drop reason to string"),
    and define the string array 'drop_reasons'.
    
    Hmmmm...now we come back to the situation that have to maintain drop
    reasons in both enum skb_drop_reason and DEFINE_DROP_REASON. But they
    are both in dropreason.h, which makes it easier.
    
    After this commit, now the format of kfree_skb is like this:
    
    $ cat /tracing/events/skb/kfree_skb/format
    name: kfree_skb
    ID: 1524
    format:
            field:unsigned short common_type;       offset:0;       size:2; signed:0;
            field:unsigned char common_flags;       offset:2;       size:1; signed:0;
            field:unsigned char common_preempt_count;       offset:3;       size:1; signed:0;
            field:int common_pid;   offset:4;       size:4; signed:1;
    
            field:void * skbaddr;   offset:8;       size:8; signed:0;
            field:void * location;  offset:16;      size:8; signed:0;
            field:unsigned short protocol;  offset:24;      size:2; signed:0;
            field:enum skb_drop_reason reason;      offset:28;      size:4; signed:0;
    
    print fmt: "skbaddr=%p protocol=%u location=%p reason: %s", REC->skbaddr, REC->protocol, REC->location, __print_symbolic(REC->reason, { 1, "NOT_SPECIFIED" }, { 2, "NO_SOCKET" } ......
    
    Fixes: ec43908d ("net: skb: use auto-generation to convert skb drop reason to string")
    Link: https://lore.kernel.org/netdev/CANn89i+bx0ybvE55iMYf5GJM48WwV1HNpdm9Q6t-HaEstqpCSA@mail.gmail.com/Reported-by: default avatarEric Dumazet <edumazet@google.com>
    Signed-off-by: default avatarMenglong Dong <imagedong@tencent.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    9cb252c4
skbuff.c 163 KB