selftests: hid: attach/detach 2 bpf programs, not just one
authorBenjamin Tissoires <benjamin.tissoires@redhat.com>
Fri, 13 Jan 2023 09:09:29 +0000 (10:09 +0100)
committerJiri Kosina <jkosina@suse.cz>
Wed, 18 Jan 2023 21:08:38 +0000 (22:08 +0100)
Add a second BPF program to attach to the device, as the development of
this feature showed that we also need to ensure we can detach multiple
programs to a device (hid_bpf_link->hid_table_index was actually not set
initially, and this lead to any BPF program not being released except for
the first one).

Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
tools/testing/selftests/hid/hid_bpf.c
tools/testing/selftests/hid/progs/hid.c

index 6615c26fb5dd4412cee316888c87f588c4c10f1c..d215bb492eb492a51de9975f76d5f39001d74763 100644 (file)
@@ -616,6 +616,7 @@ TEST_F(hid_bpf, test_attach_detach)
 {
        const struct test_program progs[] = {
                { .name = "hid_first_event" },
+               { .name = "hid_second_event" },
        };
        __u8 buf[10] = {0};
        int err;
@@ -634,7 +635,10 @@ TEST_F(hid_bpf, test_attach_detach)
        ASSERT_EQ(buf[0], 1);
        ASSERT_EQ(buf[2], 47);
 
-       /* pin the program and immediately unpin it */
+       /* make sure both programs are run */
+       ASSERT_EQ(buf[3], 52);
+
+       /* pin the first program and immediately unpin it */
 #define PIN_PATH "/sys/fs/bpf/hid_first_event"
        bpf_program__pin(self->skel->progs.hid_first_event, PIN_PATH);
        remove(PIN_PATH);
@@ -660,6 +664,7 @@ TEST_F(hid_bpf, test_attach_detach)
        ASSERT_EQ(buf[0], 1);
        ASSERT_EQ(buf[1], 47);
        ASSERT_EQ(buf[2], 0);
+       ASSERT_EQ(buf[3], 0);
 
        /* re-attach our program */
 
@@ -677,6 +682,7 @@ TEST_F(hid_bpf, test_attach_detach)
        ASSERT_EQ(err, 6) TH_LOG("read_hidraw");
        ASSERT_EQ(buf[0], 1);
        ASSERT_EQ(buf[2], 47);
+       ASSERT_EQ(buf[3], 52);
 }
 
 /*
index 6a86af0aa5450cf30903498a6be76eb1c6d7209e..88c593f753b529b1d2e8367890c4405230677c15 100644 (file)
@@ -32,6 +32,19 @@ int BPF_PROG(hid_first_event, struct hid_bpf_ctx *hid_ctx)
        return hid_ctx->size;
 }
 
+SEC("?fmod_ret/hid_bpf_device_event")
+int BPF_PROG(hid_second_event, struct hid_bpf_ctx *hid_ctx)
+{
+       __u8 *rw_data = hid_bpf_get_data(hid_ctx, 0 /* offset */, 4 /* size */);
+
+       if (!rw_data)
+               return 0; /* EPERM check */
+
+       rw_data[3] = rw_data[2] + 5;
+
+       return hid_ctx->size;
+}
+
 SEC("?fmod_ret/hid_bpf_device_event")
 int BPF_PROG(hid_change_report_id, struct hid_bpf_ctx *hid_ctx)
 {