On Wed, Apr 12, 2023 at 11:35 AM Jesper Dangaard Brouer <brouer@xxxxxxxxxx> wrote: > > The tool xdp_hw_metadata can be used by driver developers > implementing XDP-hints metadata kfuncs. > > Remove all bpf_printk calls, as the tool already transfers all the > XDP-hints related information via metadata area to AF_XDP > userspace process. > > Add counters for providing remaining information about failure and > skipped packet events. > > Signed-off-by: Jesper Dangaard Brouer <brouer@xxxxxxxxxx> Acked-by: Stanislav Fomichev <sdf@xxxxxxxxxx> nit: maybe those ++ should be __sync_add_and_fetch instead? Then you should be able to drop volatile.. > --- > .../testing/selftests/bpf/progs/xdp_hw_metadata.c | 36 ++++++++++++-------- > tools/testing/selftests/bpf/xdp_hw_metadata.c | 4 ++ > 2 files changed, 24 insertions(+), 16 deletions(-) > > diff --git a/tools/testing/selftests/bpf/progs/xdp_hw_metadata.c b/tools/testing/selftests/bpf/progs/xdp_hw_metadata.c > index 4c55b4d79d3d..8a042343cb0c 100644 > --- a/tools/testing/selftests/bpf/progs/xdp_hw_metadata.c > +++ b/tools/testing/selftests/bpf/progs/xdp_hw_metadata.c > @@ -12,6 +12,10 @@ struct { > __type(value, __u32); > } xsk SEC(".maps"); > > +volatile __u64 pkts_skip = 0; > +volatile __u64 pkts_fail = 0; > +volatile __u64 pkts_redir = 0; > + > extern int bpf_xdp_metadata_rx_timestamp(const struct xdp_md *ctx, > __u64 *timestamp) __ksym; > extern int bpf_xdp_metadata_rx_hash(const struct xdp_md *ctx, > @@ -26,7 +30,7 @@ int rx(struct xdp_md *ctx) > struct udphdr *udp = NULL; > struct iphdr *iph = NULL; > struct xdp_meta *meta; > - int ret; > + int err; > > data = (void *)(long)ctx->data; > data_end = (void *)(long)ctx->data_end; > @@ -46,17 +50,20 @@ int rx(struct xdp_md *ctx) > udp = NULL; > } > > - if (!udp) > + if (!udp) { > + pkts_skip++; > return XDP_PASS; > + } > > - if (udp->dest != bpf_htons(9091)) > + /* Forwarding UDP:9091 to AF_XDP */ > + if (udp->dest != bpf_htons(9091)) { > + pkts_skip++; > return XDP_PASS; > + } > > - bpf_printk("forwarding UDP:9091 to AF_XDP"); > - > - ret = bpf_xdp_adjust_meta(ctx, -(int)sizeof(struct xdp_meta)); > - if (ret != 0) { > - bpf_printk("bpf_xdp_adjust_meta returned %d", ret); > + err = bpf_xdp_adjust_meta(ctx, -(int)sizeof(struct xdp_meta)); > + if (err) { > + pkts_fail++; > return XDP_PASS; > } > > @@ -65,20 +72,19 @@ int rx(struct xdp_md *ctx) > meta = data_meta; > > if (meta + 1 > data) { > - bpf_printk("bpf_xdp_adjust_meta doesn't appear to work"); > + pkts_fail++; > return XDP_PASS; > } > > - if (!bpf_xdp_metadata_rx_timestamp(ctx, &meta->rx_timestamp)) > - bpf_printk("populated rx_timestamp with %llu", meta->rx_timestamp); > - else > + err = bpf_xdp_metadata_rx_timestamp(ctx, &meta->rx_timestamp); > + if (err) > meta->rx_timestamp = 0; /* Used by AF_XDP as not avail signal */ > > - if (!bpf_xdp_metadata_rx_hash(ctx, &meta->rx_hash)) > - bpf_printk("populated rx_hash with %u", meta->rx_hash); > - else > + err = bpf_xdp_metadata_rx_hash(ctx, &meta->rx_hash); > + if (err) > meta->rx_hash = 0; /* Used by AF_XDP as not avail signal */ > > + pkts_redir++; > return bpf_redirect_map(&xsk, ctx->rx_queue_index, XDP_PASS); > } > > diff --git a/tools/testing/selftests/bpf/xdp_hw_metadata.c b/tools/testing/selftests/bpf/xdp_hw_metadata.c > index 1c8acb68b977..3b942ef7297b 100644 > --- a/tools/testing/selftests/bpf/xdp_hw_metadata.c > +++ b/tools/testing/selftests/bpf/xdp_hw_metadata.c > @@ -212,7 +212,9 @@ static int verify_metadata(struct xsk *rx_xsk, int rxq, int server_fd) > while (true) { > errno = 0; > ret = poll(fds, rxq + 1, 1000); > - printf("poll: %d (%d)\n", ret, errno); > + printf("poll: %d (%d) skip=%llu fail=%llu redir=%llu\n", > + ret, errno, bpf_obj->bss->pkts_skip, > + bpf_obj->bss->pkts_fail, bpf_obj->bss->pkts_redir); > if (ret < 0) > break; > if (ret == 0) > >