xdp/trace: extend tracepoint in devmap with an err
authorJesper Dangaard Brouer <brouer@redhat.com>
Thu, 24 May 2018 14:46:17 +0000 (16:46 +0200)
committerAlexei Starovoitov <ast@kernel.org>
Fri, 25 May 2018 01:36:15 +0000 (18:36 -0700)
Extending tracepoint xdp:xdp_devmap_xmit in devmap with an err code
allow people to easier identify the reason behind the ndo_xdp_xmit
call to a given driver is failing.

Signed-off-by: Jesper Dangaard Brouer <brouer@redhat.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
include/trace/events/xdp.h
kernel/bpf/devmap.c

index 2e9ef0650144eaf2d636a792977c9d0d99e08c6e..1ecf4c67fcf7590ce820217234eb17c1a06350ab 100644 (file)
@@ -234,9 +234,9 @@ TRACE_EVENT(xdp_devmap_xmit,
        TP_PROTO(const struct bpf_map *map, u32 map_index,
                 int sent, int drops,
                 const struct net_device *from_dev,
-                const struct net_device *to_dev),
+                const struct net_device *to_dev, int err),
 
-       TP_ARGS(map, map_index, sent, drops, from_dev, to_dev),
+       TP_ARGS(map, map_index, sent, drops, from_dev, to_dev, err),
 
        TP_STRUCT__entry(
                __field(int, map_id)
@@ -246,6 +246,7 @@ TRACE_EVENT(xdp_devmap_xmit,
                __field(int, sent)
                __field(int, from_ifindex)
                __field(int, to_ifindex)
+               __field(int, err)
        ),
 
        TP_fast_assign(
@@ -256,16 +257,17 @@ TRACE_EVENT(xdp_devmap_xmit,
                __entry->sent           = sent;
                __entry->from_ifindex   = from_dev->ifindex;
                __entry->to_ifindex     = to_dev->ifindex;
+               __entry->err            = err;
        ),
 
        TP_printk("ndo_xdp_xmit"
                  " map_id=%d map_index=%d action=%s"
                  " sent=%d drops=%d"
-                 " from_ifindex=%d to_ifindex=%d",
+                 " from_ifindex=%d to_ifindex=%d err=%d",
                  __entry->map_id, __entry->map_index,
                  __print_symbolic(__entry->act, __XDP_ACT_SYM_TAB),
                  __entry->sent, __entry->drops,
-                 __entry->from_ifindex, __entry->to_ifindex)
+                 __entry->from_ifindex, __entry->to_ifindex, __entry->err)
 );
 
 #endif /* _TRACE_XDP_H */
index 77908311ec98314ac82554b4e69c1b7b7d0069f2..ae16d0c373efb0271deaa1ec8b231582d48dd9fa 100644 (file)
@@ -220,7 +220,7 @@ static int bq_xmit_all(struct bpf_dtab_netdev *obj,
                         struct xdp_bulk_queue *bq)
 {
        struct net_device *dev = obj->dev;
-       int sent = 0, drops = 0;
+       int sent = 0, drops = 0, err = 0;
        int i;
 
        if (unlikely(!bq->count))
@@ -234,6 +234,7 @@ static int bq_xmit_all(struct bpf_dtab_netdev *obj,
 
        sent = dev->netdev_ops->ndo_xdp_xmit(dev, bq->count, bq->q);
        if (sent < 0) {
+               err = sent;
                sent = 0;
                goto error;
        }
@@ -242,7 +243,7 @@ out:
        bq->count = 0;
 
        trace_xdp_devmap_xmit(&obj->dtab->map, obj->bit,
-                             sent, drops, bq->dev_rx, dev);
+                             sent, drops, bq->dev_rx, dev, err);
        bq->dev_rx = NULL;
        return 0;
 error: