linux/tools/testing/selftests/bpf/prog_tests/signal_pending.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2#include <test_progs.h>
   3#include <network_helpers.h>
   4
   5static void sigalrm_handler(int s) {}
   6static struct sigaction sigalrm_action = {
   7        .sa_handler = sigalrm_handler,
   8};
   9
  10static void test_signal_pending_by_type(enum bpf_prog_type prog_type)
  11{
  12        struct bpf_insn prog[4096];
  13        struct itimerval timeo = {
  14                .it_value.tv_usec = 100000, /* 100ms */
  15        };
  16        int prog_fd;
  17        int err;
  18        int i;
  19        LIBBPF_OPTS(bpf_test_run_opts, topts,
  20                .data_in = &pkt_v4,
  21                .data_size_in = sizeof(pkt_v4),
  22                .repeat = 0xffffffff,
  23        );
  24
  25        for (i = 0; i < ARRAY_SIZE(prog); i++)
  26                prog[i] = BPF_ALU64_IMM(BPF_MOV, BPF_REG_0, 0);
  27        prog[ARRAY_SIZE(prog) - 1] = BPF_EXIT_INSN();
  28
  29        prog_fd = bpf_test_load_program(prog_type, prog, ARRAY_SIZE(prog),
  30                                   "GPL", 0, NULL, 0);
  31        ASSERT_GE(prog_fd, 0, "test-run load");
  32
  33        err = sigaction(SIGALRM, &sigalrm_action, NULL);
  34        ASSERT_OK(err, "test-run-signal-sigaction");
  35
  36        err = setitimer(ITIMER_REAL, &timeo, NULL);
  37        ASSERT_OK(err, "test-run-signal-timer");
  38
  39        err = bpf_prog_test_run_opts(prog_fd, &topts);
  40        ASSERT_LE(topts.duration, 500000000 /* 500ms */,
  41                  "test-run-signal-duration");
  42
  43        signal(SIGALRM, SIG_DFL);
  44}
  45
  46void test_signal_pending(void)
  47{
  48        test_signal_pending_by_type(BPF_PROG_TYPE_SOCKET_FILTER);
  49        test_signal_pending_by_type(BPF_PROG_TYPE_FLOW_DISSECTOR);
  50}
  51