// SPDX-License-Identifier: GPL-2.0 #include static void sigalrm_handler(int s) {} static struct sigaction sigalrm_action = { .sa_handler = sigalrm_handler, }; static void test_signal_pending_by_type(enum bpf_prog_type prog_type) { struct bpf_insn prog[4096]; struct itimerval timeo = { .it_value.tv_usec = 100000, /* 100ms */ }; __u32 duration = 0, retval; int prog_fd; int err; int i; for (i = 0; i < ARRAY_SIZE(prog); i++) prog[i] = BPF_ALU64_IMM(BPF_MOV, BPF_REG_0, 0); prog[ARRAY_SIZE(prog) - 1] = BPF_EXIT_INSN(); prog_fd = bpf_load_program(prog_type, prog, ARRAY_SIZE(prog), "GPL", 0, NULL, 0); CHECK(prog_fd < 0, "test-run", "errno %d\n", errno); err = sigaction(SIGALRM, &sigalrm_action, NULL); CHECK(err, "test-run-signal-sigaction", "errno %d\n", errno); err = setitimer(ITIMER_REAL, &timeo, NULL); CHECK(err, "test-run-signal-timer", "errno %d\n", errno); err = bpf_prog_test_run(prog_fd, 0xffffffff, &pkt_v4, sizeof(pkt_v4), NULL, NULL, &retval, &duration); CHECK(duration > 500000000, /* 500ms */ "test-run-signal-duration", "duration %dns > 500ms\n", duration); signal(SIGALRM, SIG_DFL); } void test_signal_pending(enum bpf_prog_type prog_type) { test_signal_pending_by_type(BPF_PROG_TYPE_SOCKET_FILTER); test_signal_pending_by_type(BPF_PROG_TYPE_FLOW_DISSECTOR); }