]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
selftests/bpf: Fix expired UDP LRU entries in XDP LB benchmark
authorPuranjay Mohan <puranjay@kernel.org>
Wed, 20 May 2026 13:33:31 +0000 (06:33 -0700)
committerAlexei Starovoitov <ast@kernel.org>
Wed, 20 May 2026 16:25:46 +0000 (09:25 -0700)
populate_lru() zero-initializes atime:

    struct real_pos_lru lru = { .pos = real_idx };

connection_table_lookup() treats UDP entries with
cur_time - atime > 30s as expired, so every pre-populated entry
expires immediately.  Calibration masks this on the CPU it runs on,
but if validation migrates to another CPU:

    [udp-v4-lru-hit] COUNTER FAIL: LRU misses=1, expected 0

Initialize atime from CLOCK_MONOTONIC for UDP flows.

Fixes: a4b5ba8187cb ("selftests/bpf: Add XDP load-balancer benchmark driver")
Signed-off-by: Puranjay Mohan <puranjay@kernel.org>
Link: https://lore.kernel.org/r/20260520133338.3392667-3-puranjay@kernel.org
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
tools/testing/selftests/bpf/benchs/bench_xdp_lb.c

index 0b6709a2b03c66b37a25acf7ce94cf33847dd99b..8e25bccbde92b7cb6f4aca4bc80b134967f99399 100644 (file)
@@ -563,12 +563,23 @@ static void create_per_cpu_lru_maps(struct xdp_lb_bench *skel)
        nr_inner_maps = nr_cpus;
 }
 
+static __u64 ktime_get_ns(void)
+{
+       struct timespec ts;
+
+       clock_gettime(CLOCK_MONOTONIC, &ts);
+       return (__u64)ts.tv_sec * 1000000000ULL + ts.tv_nsec;
+}
+
 static void populate_lru(const struct test_scenario *sc, __u32 real_idx)
 {
        struct real_pos_lru lru = { .pos = real_idx };
        struct flow_key fk;
        int i, err;
 
+       if (sc->ip_proto == IPPROTO_UDP)
+               lru.atime = ktime_get_ns();
+
        build_flow_key(&fk, sc);
 
        /* Insert into every per-CPU inner LRU so the entry is found