On Wed, 15 Jan 2020 23:11:21 +0100 Toke Høiland-Jørgensen <toke@xxxxxxxxxx> wrote: > Jesper Dangaard Brouer <brouer@xxxxxxxxxx> writes: > > > On Mon, 13 Jan 2020 19:10:55 +0100 > > Toke Høiland-Jørgensen <toke@xxxxxxxxxx> wrote: > > > >> diff --git a/kernel/bpf/devmap.c b/kernel/bpf/devmap.c > >> index da9c832fc5c8..030d125c3839 100644 > >> --- a/kernel/bpf/devmap.c > >> +++ b/kernel/bpf/devmap.c > > [...] > >> @@ -346,8 +340,7 @@ static int bq_xmit_all(struct xdp_bulk_queue *bq, u32 flags) > >> out: > >> bq->count = 0; > >> > >> - trace_xdp_devmap_xmit(&obj->dtab->map, obj->idx, > >> - sent, drops, bq->dev_rx, dev, err); > >> + trace_xdp_devmap_xmit(NULL, 0, sent, drops, bq->dev_rx, dev, err); > > > > Hmm ... I don't like that we lose the map_id and map_index identifier. > > This is part of our troubleshooting interface. > > Hmm, I guess I can take another look at whether there's a way to avoid > that. Any ideas? Looking at the code and the other tracepoints... I will actually suggest to remove these two arguments, because the trace_xdp_redirect_map tracepoint also contains the ifindex'es, and to troubleshoot people can record both tracepoints and do the correlation themselves. When changing the tracepoint I would like to keep member 'drops' and 'sent' at the same struct offsets. As our xdp_monitor example reads these and I hope we can kept it working this way. I've coded it up, and tested it. The new xdp_monitor will work on older kernels, but the old xdp_monitor will fail attaching on newer kernels. I think this is fair enough, as we are backwards compatible. [PATCH] devmap: adjust tracepoing after Tokes changes From: Jesper Dangaard Brouer <brouer@xxxxxxxxxx> Signed-off-by: Jesper Dangaard Brouer <brouer@xxxxxxxxxx> --- include/trace/events/xdp.h | 29 ++++++++++++----------------- kernel/bpf/devmap.c | 2 +- samples/bpf/xdp_monitor_kern.c | 8 +++----- 3 files changed, 16 insertions(+), 23 deletions(-) diff --git a/include/trace/events/xdp.h b/include/trace/events/xdp.h index cf568a38f852..f1e64689ce94 100644 --- a/include/trace/events/xdp.h +++ b/include/trace/events/xdp.h @@ -247,43 +247,38 @@ TRACE_EVENT(xdp_cpumap_enqueue, 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, int err), + TP_PROTO(const struct net_device *from_dev, + const struct net_device *to_dev, + int sent, int drops, int err), - TP_ARGS(map, map_index, sent, drops, from_dev, to_dev, err), + TP_ARGS(from_dev, to_dev, sent, drops, err), TP_STRUCT__entry( - __field(int, map_id) + __field(int, from_ifindex) __field(u32, act) - __field(u32, map_index) + __field(int, to_ifindex) __field(int, drops) __field(int, sent) - __field(int, from_ifindex) - __field(int, to_ifindex) __field(int, err) ), TP_fast_assign( - __entry->map_id = map ? map->id : 0; + __entry->from_ifindex = from_dev->ifindex; __entry->act = XDP_REDIRECT; - __entry->map_index = map_index; + __entry->to_ifindex = to_dev->ifindex; __entry->drops = drops; __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" + " from_ifindex=%d to_ifindex=%d action=%s" " sent=%d drops=%d" - " from_ifindex=%d to_ifindex=%d err=%d", - __entry->map_id, __entry->map_index, + " err=%d", + __entry->from_ifindex, __entry->to_ifindex, __print_symbolic(__entry->act, __XDP_ACT_SYM_TAB), __entry->sent, __entry->drops, - __entry->from_ifindex, __entry->to_ifindex, __entry->err) + __entry->err) ); /* Expect users already include <net/xdp.h>, but not xdp_priv.h */ diff --git a/kernel/bpf/devmap.c b/kernel/bpf/devmap.c index db32272c4f77..1b4bfe4e06d6 100644 --- a/kernel/bpf/devmap.c +++ b/kernel/bpf/devmap.c @@ -340,7 +340,7 @@ static int bq_xmit_all(struct xdp_dev_bulk_queue *bq, u32 flags) out: bq->count = 0; - trace_xdp_devmap_xmit(NULL, 0, sent, drops, bq->dev_rx, dev, err); + trace_xdp_devmap_xmit(bq->dev_rx, dev, sent, drops, err); bq->dev_rx = NULL; __list_del_clearprev(&bq->flush_node); return 0; diff --git a/samples/bpf/xdp_monitor_kern.c b/samples/bpf/xdp_monitor_kern.c index ad10fe700d7d..39458a44472e 100644 --- a/samples/bpf/xdp_monitor_kern.c +++ b/samples/bpf/xdp_monitor_kern.c @@ -222,14 +222,12 @@ struct bpf_map_def SEC("maps") devmap_xmit_cnt = { */ struct devmap_xmit_ctx { u64 __pad; // First 8 bytes are not accessible by bpf code - int map_id; // offset:8; size:4; signed:1; + int from_ifindex; // offset:8; size:4; signed:1; u32 act; // offset:12; size:4; signed:0; - u32 map_index; // offset:16; size:4; signed:0; + int to_ifindex; // offset:16; size:4; signed:1; int drops; // offset:20; size:4; signed:1; int sent; // offset:24; size:4; signed:1; - int from_ifindex; // offset:28; size:4; signed:1; - int to_ifindex; // offset:32; size:4; signed:1; - int err; // offset:36; size:4; signed:1; + int err; // offset:28; size:4; signed:1; }; SEC("tracepoint/xdp/xdp_devmap_xmit")