]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
selftests/bpf: Add stress test for timer async cancel
authorMykyta Yatsenko <yatsenko@meta.com>
Sun, 1 Feb 2026 02:53:59 +0000 (18:53 -0800)
committerAndrii Nakryiko <andrii@kernel.org>
Wed, 4 Feb 2026 00:58:47 +0000 (16:58 -0800)
Extend BPF timer selftest to run stress test for async cancel.

Signed-off-by: Mykyta Yatsenko <yatsenko@meta.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/bpf/20260201025403.66625-6-alexei.starovoitov@gmail.com
tools/testing/selftests/bpf/prog_tests/timer.c
tools/testing/selftests/bpf/progs/timer.c

index 4d853d1bd2a71b3d0f1ba0daa7a699945b4457fe..a157a2a699e638c9f21712b1e7194fc4b6382e71 100644 (file)
@@ -23,13 +23,14 @@ static void *spin_lock_thread(void *arg)
 }
 
 
-static int timer_stress(struct timer *timer_skel)
+static int timer_stress_runner(struct timer *timer_skel, bool async_cancel)
 {
        int i, err = 1, prog_fd;
        LIBBPF_OPTS(bpf_test_run_opts, topts);
        pthread_t thread_id[NUM_THR];
        void *ret;
 
+       timer_skel->bss->async_cancel = async_cancel;
        prog_fd = bpf_program__fd(timer_skel->progs.race);
        for (i = 0; i < NUM_THR; i++) {
                err = pthread_create(&thread_id[i], NULL,
@@ -46,6 +47,16 @@ static int timer_stress(struct timer *timer_skel)
        return err;
 }
 
+static int timer_stress(struct timer *timer_skel)
+{
+       return timer_stress_runner(timer_skel, false);
+}
+
+static int timer_stress_async_cancel(struct timer *timer_skel)
+{
+       return timer_stress_runner(timer_skel, true);
+}
+
 static int timer(struct timer *timer_skel)
 {
        int err, prog_fd;
@@ -118,6 +129,11 @@ void serial_test_timer_stress(void)
        test_timer(timer_stress);
 }
 
+void serial_test_timer_stress_async_cancel(void)
+{
+       test_timer(timer_stress_async_cancel);
+}
+
 void test_timer_interrupt(void)
 {
        struct timer_interrupt *skel = NULL;
index 4c677c001258a4c05cd570ec52363d49d8eea169..a81413514e4b07ef745f27eade71454234e731e8 100644 (file)
@@ -1,13 +1,17 @@
 // SPDX-License-Identifier: GPL-2.0
 /* Copyright (c) 2021 Facebook */
-#include <linux/bpf.h>
-#include <time.h>
+
+#include <vmlinux.h>
 #include <stdbool.h>
 #include <errno.h>
 #include <bpf/bpf_helpers.h>
 #include <bpf/bpf_tracing.h>
 
+#define CLOCK_MONOTONIC 1
+#define CLOCK_BOOTTIME 7
+
 char _license[] SEC("license") = "GPL";
+
 struct hmap_elem {
        int counter;
        struct bpf_timer timer;
@@ -63,6 +67,7 @@ __u64 callback_check = 52;
 __u64 callback2_check = 52;
 __u64 pinned_callback_check;
 __s32 pinned_cpu;
+bool async_cancel = 0;
 
 #define ARRAY 1
 #define HTAB 2
@@ -419,7 +424,10 @@ int race(void *ctx)
 
        bpf_timer_set_callback(timer, race_timer_callback);
        bpf_timer_start(timer, 0, 0);
-       bpf_timer_cancel(timer);
+       if (async_cancel)
+               bpf_timer_cancel_async(timer);
+       else
+               bpf_timer_cancel(timer);
 
        return 0;
 }