Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

samples/bpf: Fix map iteration in xdp1_user

BPF map iteration in xdp1_user results in endless loop without any
output, because the return value of bpf_map_get_next_key() is checked
against the wrong value.

Other call locations of bpf_map_get_next_key() check for equal 0 for
continuing the iteration. xdp1_user checks against unequal -1. This is
wrong for a function which can return arbitrary negative errno values,
because a return value of e.g. -2 results in an endless loop.

With this fix xdp1_user is printing statistics again:
proto 0: 1 pkt/s
proto 0: 1 pkt/s
proto 17: 107383 pkt/s
proto 17: 881655 pkt/s
proto 17: 882083 pkt/s
proto 17: 881758 pkt/s

Fixes: bd054102a8c7 ("libbpf: enforce strict libbpf 1.0 behaviors")
Signed-off-by: Gerhard Engleder <gerhard@engleder-embedded.com>
Acked-by: Song Liu <song@kernel.org>
Link: https://lore.kernel.org/r/20221013200922.17167-1-gerhard@engleder-embedded.com
Signed-off-by: Martin KaFai Lau <martin.lau@kernel.org>

authored by

Gerhard Engleder and committed by
Martin KaFai Lau
05ee658c a526a3cc

+1 -1
+1 -1
samples/bpf/xdp1_user.c
··· 51 51 52 52 sleep(interval); 53 53 54 - while (bpf_map_get_next_key(map_fd, &key, &key) != -1) { 54 + while (bpf_map_get_next_key(map_fd, &key, &key) == 0) { 55 55 __u64 sum = 0; 56 56 57 57 assert(bpf_map_lookup_elem(map_fd, &key, values) == 0);