Hi,
On 2/27/2025 10:26 PM, Jiayuan Chen wrote:
BPF CI has failed 3 times in the last 24 hours. Add retry for ENOMEM. It's similar to the optimization plan: commit 2f553b032cad ("selftsets/bpf: Retry map update for non-preallocated per-cpu map")
Failed CI: https://github.com/kernel-patches/bpf/actions/runs/13549227497/job/378689263... https://github.com/kernel-patches/bpf/actions/runs/13548089029/job/378658120... https://github.com/kernel-patches/bpf/actions/runs/13553536268/job/378833292...
Er, it is suspicious that the allocation of htab_elem failed, because the size of key and value is small in these cases. It usually means that there is something wrong with bpf mem allocator or the slub, therefore, I think it is a bad idea to retry for ENOMEM in this case. Will try to reproduce the problem first when get some time.
selftests/bpf: Fixes for test_maps test Fork 100 tasks to 'test_update_delete' Fork 100 tasks to 'test_update_delete' Fork 100 tasks to 'test_update_delete' Fork 100 tasks to 'test_update_delete' ...... test_task_storage_map_stress_lookup:PASS test_maps: OK, 0 SKIPPED
Signed-off-by: Jiayuan Chen jiayuan.chen@linux.dev
tools/testing/selftests/bpf/test_maps.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/tools/testing/selftests/bpf/test_maps.c b/tools/testing/selftests/bpf/test_maps.c index 8b40e9496af1..986ce32b113a 100644 --- a/tools/testing/selftests/bpf/test_maps.c +++ b/tools/testing/selftests/bpf/test_maps.c @@ -1396,9 +1396,10 @@ static void test_map_stress(void) #define MAX_DELAY_US 50000 #define MIN_DELAY_RANGE_US 5000 -static bool retry_for_again_or_busy(int err) +static bool can_retry(int err) {
- return (err == EAGAIN || err == EBUSY);
- return (err == EAGAIN || err == EBUSY ||
(err == ENOMEM && map_opts.map_flags == BPF_F_NO_PREALLOC));
} int map_update_retriable(int map_fd, const void *key, const void *value, int flags, int attempts, @@ -1451,12 +1452,12 @@ static void test_update_delete(unsigned int fn, void *data) if (do_update) { err = map_update_retriable(fd, &key, &value, BPF_NOEXIST, MAP_RETRIES,
retry_for_again_or_busy);
can_retry); if (err) printf("error %d %d\n", err, errno); assert(err == 0); err = map_update_retriable(fd, &key, &value, BPF_EXIST, MAP_RETRIES,
retry_for_again_or_busy);
can_retry); if (err) printf("error %d %d\n", err, errno); assert(err == 0);