|  | // SPDX-License-Identifier: GPL-2.0 | 
|  | #include <test_progs.h> | 
|  | #include <network_helpers.h> | 
|  |  | 
|  | 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); | 
|  | } |