summaryrefslogtreecommitdiffstats
path: root/tools/testing/selftests/hid
diff options
context:
space:
mode:
authorBenjamin Tissoires <benjamin.tissoires@redhat.com>2023-01-13 10:09:29 +0100
committerJiri Kosina <jkosina@suse.cz>2023-01-18 22:08:38 +0100
commitcea6c4d969bb104d2847e1f4ed708ae0126d6f42 (patch)
treed36189beb19b76448ebdbd71c0173b4b79916e19 /tools/testing/selftests/hid
parent633ba3be76426056a047b2a355082d94afa9230d (diff)
downloadlinux-stable-cea6c4d969bb104d2847e1f4ed708ae0126d6f42.tar.gz
linux-stable-cea6c4d969bb104d2847e1f4ed708ae0126d6f42.tar.bz2
linux-stable-cea6c4d969bb104d2847e1f4ed708ae0126d6f42.zip
selftests: hid: attach/detach 2 bpf programs, not just one
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>
Diffstat (limited to 'tools/testing/selftests/hid')
-rw-r--r--tools/testing/selftests/hid/hid_bpf.c8
-rw-r--r--tools/testing/selftests/hid/progs/hid.c13
2 files changed, 20 insertions, 1 deletions
diff --git a/tools/testing/selftests/hid/hid_bpf.c b/tools/testing/selftests/hid/hid_bpf.c
index 6615c26fb5dd..d215bb492eb4 100644
--- a/tools/testing/selftests/hid/hid_bpf.c
+++ b/tools/testing/selftests/hid/hid_bpf.c
@@ -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);
}
/*
diff --git a/tools/testing/selftests/hid/progs/hid.c b/tools/testing/selftests/hid/progs/hid.c
index 6a86af0aa545..88c593f753b5 100644
--- a/tools/testing/selftests/hid/progs/hid.c
+++ b/tools/testing/selftests/hid/progs/hid.c
@@ -33,6 +33,19 @@ int BPF_PROG(hid_first_event, struct hid_bpf_ctx *hid_ctx)
}
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)
{
__u8 *rw_data = hid_bpf_get_data(hid_ctx, 0 /* offset */, 3 /* size */);