* [PATCH HID 0/4] HID: selftest fixes after merge into 6.11-rc0 tree
@ 2024-07-23 16:21 Benjamin Tissoires
2024-07-23 16:21 ` [PATCH HID 1/4] selftests/hid: fix bpf_wq new API Benjamin Tissoires
` (5 more replies)
0 siblings, 6 replies; 7+ messages in thread
From: Benjamin Tissoires @ 2024-07-23 16:21 UTC (permalink / raw)
To: Jiri Kosina, Shuah Khan
Cc: linux-input, linux-kselftest, linux-kernel, bpf,
Benjamin Tissoires
After HID-BPF struct_ops was merged into 6.11-rc0, there are a few
mishaps:
- the bpf_wq API changed and needs to be updated here
- libbpf now auto-attach all the struct_ops it sees in the bpf object,
leading to attempting at attaching them multiple times
Fix the selftests but also prevent the same struct_ops to be attached
more than once as this enters various locks, confusions, and kernel
oopses.
Signed-off-by: Benjamin Tissoires <bentiss@kernel.org>
---
Benjamin Tissoires (4):
selftests/hid: fix bpf_wq new API
selftests/hid: disable struct_ops auto-attach
HID: bpf: prevent the same struct_ops to be attached more than once
selftests/hid: add test for attaching multiple time the same struct_ops
drivers/hid/bpf/hid_bpf_struct_ops.c | 5 +++++
tools/testing/selftests/hid/hid_bpf.c | 26 ++++++++++++++++++++++
tools/testing/selftests/hid/progs/hid.c | 2 +-
.../testing/selftests/hid/progs/hid_bpf_helpers.h | 2 +-
4 files changed, 33 insertions(+), 2 deletions(-)
---
base-commit: 6e504d2c61244a01226c5100c835e44fb9b85ca8
change-id: 20240723-fix-6-11-bpf-cfa63dcda5bc
Best regards,
--
Benjamin Tissoires <bentiss@kernel.org>
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH HID 1/4] selftests/hid: fix bpf_wq new API
2024-07-23 16:21 [PATCH HID 0/4] HID: selftest fixes after merge into 6.11-rc0 tree Benjamin Tissoires
@ 2024-07-23 16:21 ` Benjamin Tissoires
2024-07-23 16:21 ` [PATCH HID 2/4] selftests/hid: disable struct_ops auto-attach Benjamin Tissoires
` (4 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Benjamin Tissoires @ 2024-07-23 16:21 UTC (permalink / raw)
To: Jiri Kosina, Shuah Khan
Cc: linux-input, linux-kselftest, linux-kernel, bpf,
Benjamin Tissoires
Since commit f56f4d541eab ("bpf: helpers: fix bpf_wq_set_callback_impl
signature"), the API for bpf_wq changed a bit.
We need to update the selftests/hid code to reflect that or the
bpf program will not load.
Signed-off-by: Benjamin Tissoires <bentiss@kernel.org>
---
tools/testing/selftests/hid/progs/hid.c | 2 +-
tools/testing/selftests/hid/progs/hid_bpf_helpers.h | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/tools/testing/selftests/hid/progs/hid.c b/tools/testing/selftests/hid/progs/hid.c
index ee9bbbcf751b..5ecc845ef792 100644
--- a/tools/testing/selftests/hid/progs/hid.c
+++ b/tools/testing/selftests/hid/progs/hid.c
@@ -455,7 +455,7 @@ struct {
__type(value, struct elem);
} hmap SEC(".maps");
-static int wq_cb_sleepable(void *map, int *key, struct bpf_wq *work)
+static int wq_cb_sleepable(void *map, int *key, void *work)
{
__u8 buf[9] = {2, 3, 4, 5, 6, 7, 8, 9, 10};
struct hid_bpf_ctx *hid_ctx;
diff --git a/tools/testing/selftests/hid/progs/hid_bpf_helpers.h b/tools/testing/selftests/hid/progs/hid_bpf_helpers.h
index cfe37f491906..e5db897586bb 100644
--- a/tools/testing/selftests/hid/progs/hid_bpf_helpers.h
+++ b/tools/testing/selftests/hid/progs/hid_bpf_helpers.h
@@ -114,7 +114,7 @@ extern int hid_bpf_try_input_report(struct hid_bpf_ctx *ctx,
extern int bpf_wq_init(struct bpf_wq *wq, void *p__map, unsigned int flags) __weak __ksym;
extern int bpf_wq_start(struct bpf_wq *wq, unsigned int flags) __weak __ksym;
extern int bpf_wq_set_callback_impl(struct bpf_wq *wq,
- int (callback_fn)(void *map, int *key, struct bpf_wq *wq),
+ int (callback_fn)(void *map, int *key, void *wq),
unsigned int flags__k, void *aux__ign) __ksym;
#define bpf_wq_set_callback(timer, cb, flags) \
bpf_wq_set_callback_impl(timer, cb, flags, NULL)
--
2.44.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH HID 2/4] selftests/hid: disable struct_ops auto-attach
2024-07-23 16:21 [PATCH HID 0/4] HID: selftest fixes after merge into 6.11-rc0 tree Benjamin Tissoires
2024-07-23 16:21 ` [PATCH HID 1/4] selftests/hid: fix bpf_wq new API Benjamin Tissoires
@ 2024-07-23 16:21 ` Benjamin Tissoires
2024-07-23 16:21 ` [PATCH HID 3/4] HID: bpf: prevent the same struct_ops to be attached more than once Benjamin Tissoires
` (3 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Benjamin Tissoires @ 2024-07-23 16:21 UTC (permalink / raw)
To: Jiri Kosina, Shuah Khan
Cc: linux-input, linux-kselftest, linux-kernel, bpf,
Benjamin Tissoires
Since commit 08ac454e258e ("libbpf: Auto-attach struct_ops BPF maps in
BPF skeleton"), libbpf automatically calls bpf_map__attach_struct_ops()
on every struct_ops it sees in the bpf object. The problem is that
our test bpf object has many of them but only one should be manually
loaded at a time, or we end up locking the syscall.
Signed-off-by: Benjamin Tissoires <bentiss@kernel.org>
---
tools/testing/selftests/hid/hid_bpf.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/tools/testing/selftests/hid/hid_bpf.c b/tools/testing/selftests/hid/hid_bpf.c
index dc0408a831d0..9c935fd0dffc 100644
--- a/tools/testing/selftests/hid/hid_bpf.c
+++ b/tools/testing/selftests/hid/hid_bpf.c
@@ -532,6 +532,7 @@ static void load_programs(const struct test_program programs[],
FIXTURE_DATA(hid_bpf) * self,
const FIXTURE_VARIANT(hid_bpf) * variant)
{
+ struct bpf_map *iter_map;
int err = -EINVAL;
ASSERT_LE(progs_count, ARRAY_SIZE(self->hid_links))
@@ -564,6 +565,13 @@ static void load_programs(const struct test_program programs[],
*ops_hid_id = self->hid_id;
}
+ /* we disable the auto-attach feature of all maps because we
+ * only want the tested one to be manually attached in the next
+ * call to bpf_map__attach_struct_ops()
+ */
+ bpf_object__for_each_map(iter_map, *self->skel->skeleton->obj)
+ bpf_map__set_autoattach(iter_map, false);
+
err = hid__load(self->skel);
ASSERT_OK(err) TH_LOG("hid_skel_load failed: %d", err);
--
2.44.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH HID 3/4] HID: bpf: prevent the same struct_ops to be attached more than once
2024-07-23 16:21 [PATCH HID 0/4] HID: selftest fixes after merge into 6.11-rc0 tree Benjamin Tissoires
2024-07-23 16:21 ` [PATCH HID 1/4] selftests/hid: fix bpf_wq new API Benjamin Tissoires
2024-07-23 16:21 ` [PATCH HID 2/4] selftests/hid: disable struct_ops auto-attach Benjamin Tissoires
@ 2024-07-23 16:21 ` Benjamin Tissoires
2024-07-23 16:21 ` [PATCH HID 4/4] selftests/hid: add test for attaching multiple time the same struct_ops Benjamin Tissoires
` (2 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Benjamin Tissoires @ 2024-07-23 16:21 UTC (permalink / raw)
To: Jiri Kosina, Shuah Khan
Cc: linux-input, linux-kselftest, linux-kernel, bpf,
Benjamin Tissoires
If the struct_ops is already attached, we should bail out or we will
end up in various locks and pointer issues while unregistering.
Signed-off-by: Benjamin Tissoires <bentiss@kernel.org>
---
drivers/hid/bpf/hid_bpf_struct_ops.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/drivers/hid/bpf/hid_bpf_struct_ops.c b/drivers/hid/bpf/hid_bpf_struct_ops.c
index f59cce6e437f..cd696c59ba0f 100644
--- a/drivers/hid/bpf/hid_bpf_struct_ops.c
+++ b/drivers/hid/bpf/hid_bpf_struct_ops.c
@@ -183,6 +183,10 @@ static int hid_bpf_reg(void *kdata, struct bpf_link *link)
struct hid_device *hdev;
int count, err = 0;
+ /* prevent multiple attach of the same struct_ops */
+ if (ops->hdev)
+ return -EINVAL;
+
hdev = hid_get_device(ops->hid_id);
if (IS_ERR(hdev))
return PTR_ERR(hdev);
@@ -248,6 +252,7 @@ static void hid_bpf_unreg(void *kdata, struct bpf_link *link)
list_del_rcu(&ops->list);
synchronize_srcu(&hdev->bpf.srcu);
+ ops->hdev = NULL;
reconnect = hdev->bpf.rdesc_ops == ops;
if (reconnect)
--
2.44.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH HID 4/4] selftests/hid: add test for attaching multiple time the same struct_ops
2024-07-23 16:21 [PATCH HID 0/4] HID: selftest fixes after merge into 6.11-rc0 tree Benjamin Tissoires
` (2 preceding siblings ...)
2024-07-23 16:21 ` [PATCH HID 3/4] HID: bpf: prevent the same struct_ops to be attached more than once Benjamin Tissoires
@ 2024-07-23 16:21 ` Benjamin Tissoires
2024-07-24 16:31 ` [PATCH HID 0/4] HID: selftest fixes after merge into 6.11-rc0 tree Benjamin Tissoires
2024-07-25 15:29 ` Jiri Kosina
5 siblings, 0 replies; 7+ messages in thread
From: Benjamin Tissoires @ 2024-07-23 16:21 UTC (permalink / raw)
To: Jiri Kosina, Shuah Khan
Cc: linux-input, linux-kselftest, linux-kernel, bpf,
Benjamin Tissoires
Turns out that we would en up in a bad state if we attempt to attach
twice the same HID-BPF struct_ops, so have a test for it.
Signed-off-by: Benjamin Tissoires <bentiss@kernel.org>
---
tools/testing/selftests/hid/hid_bpf.c | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
diff --git a/tools/testing/selftests/hid/hid_bpf.c b/tools/testing/selftests/hid/hid_bpf.c
index 9c935fd0dffc..75b7b4ef6cfa 100644
--- a/tools/testing/selftests/hid/hid_bpf.c
+++ b/tools/testing/selftests/hid/hid_bpf.c
@@ -694,6 +694,24 @@ TEST_F(hid_bpf, subprog_raw_event)
ASSERT_EQ(buf[2], 52);
}
+/*
+ * Attach hid_first_event to the given uhid device,
+ * attempt at re-attaching it, we should not lock and
+ * return an invalid struct bpf_link
+ */
+TEST_F(hid_bpf, multiple_attach)
+{
+ const struct test_program progs[] = {
+ { .name = "hid_first_event" },
+ };
+ struct bpf_link *link;
+
+ LOAD_PROGRAMS(progs);
+
+ link = bpf_map__attach_struct_ops(self->skel->maps.first_event);
+ ASSERT_NULL(link) TH_LOG("unexpected return value when re-attaching the struct_ops");
+}
+
/*
* Ensures that we can attach/detach programs
*/
--
2.44.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH HID 0/4] HID: selftest fixes after merge into 6.11-rc0 tree
2024-07-23 16:21 [PATCH HID 0/4] HID: selftest fixes after merge into 6.11-rc0 tree Benjamin Tissoires
` (3 preceding siblings ...)
2024-07-23 16:21 ` [PATCH HID 4/4] selftests/hid: add test for attaching multiple time the same struct_ops Benjamin Tissoires
@ 2024-07-24 16:31 ` Benjamin Tissoires
2024-07-25 15:29 ` Jiri Kosina
5 siblings, 0 replies; 7+ messages in thread
From: Benjamin Tissoires @ 2024-07-24 16:31 UTC (permalink / raw)
To: Jiri Kosina, Shuah Khan, Benjamin Tissoires
Cc: linux-input, linux-kselftest, linux-kernel, bpf
On Tue, 23 Jul 2024 18:21:50 +0200, Benjamin Tissoires wrote:
> After HID-BPF struct_ops was merged into 6.11-rc0, there are a few
> mishaps:
> - the bpf_wq API changed and needs to be updated here
> - libbpf now auto-attach all the struct_ops it sees in the bpf object,
> leading to attempting at attaching them multiple times
>
> Fix the selftests but also prevent the same struct_ops to be attached
> more than once as this enters various locks, confusions, and kernel
> oopses.
>
> [...]
Applied to hid/hid.git (for-6.11/upstream-fixes), thanks!
[1/4] selftests/hid: fix bpf_wq new API
https://git.kernel.org/hid/hid/c/ff9fbcafbaf1
[2/4] selftests/hid: disable struct_ops auto-attach
https://git.kernel.org/hid/hid/c/f64c1a459339
[3/4] HID: bpf: prevent the same struct_ops to be attached more than once
https://git.kernel.org/hid/hid/c/acd34cfc48b3
[4/4] selftests/hid: add test for attaching multiple time the same struct_ops
https://git.kernel.org/hid/hid/c/facdbdfe0e62
Cheers,
--
Benjamin Tissoires <bentiss@kernel.org>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH HID 0/4] HID: selftest fixes after merge into 6.11-rc0 tree
2024-07-23 16:21 [PATCH HID 0/4] HID: selftest fixes after merge into 6.11-rc0 tree Benjamin Tissoires
` (4 preceding siblings ...)
2024-07-24 16:31 ` [PATCH HID 0/4] HID: selftest fixes after merge into 6.11-rc0 tree Benjamin Tissoires
@ 2024-07-25 15:29 ` Jiri Kosina
5 siblings, 0 replies; 7+ messages in thread
From: Jiri Kosina @ 2024-07-25 15:29 UTC (permalink / raw)
To: Benjamin Tissoires
Cc: Shuah Khan, linux-input, linux-kselftest, linux-kernel, bpf
On Tue, 23 Jul 2024, Benjamin Tissoires wrote:
> After HID-BPF struct_ops was merged into 6.11-rc0, there are a few
> mishaps:
> - the bpf_wq API changed and needs to be updated here
> - libbpf now auto-attach all the struct_ops it sees in the bpf object,
> leading to attempting at attaching them multiple times
>
> Fix the selftests but also prevent the same struct_ops to be attached
> more than once as this enters various locks, confusions, and kernel
> oopses.
>
> Signed-off-by: Benjamin Tissoires <bentiss@kernel.org>
> ---
> Benjamin Tissoires (4):
> selftests/hid: fix bpf_wq new API
> selftests/hid: disable struct_ops auto-attach
> HID: bpf: prevent the same struct_ops to be attached more than once
> selftests/hid: add test for attaching multiple time the same struct_ops
Benjamin,
for the series
Acked-by: Jiri Kosina <jkosina@suse.com>
Let's get this fixed ASAP. Thanks,
--
Jiri Kosina
SUSE Labs
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2024-07-25 15:29 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-07-23 16:21 [PATCH HID 0/4] HID: selftest fixes after merge into 6.11-rc0 tree Benjamin Tissoires
2024-07-23 16:21 ` [PATCH HID 1/4] selftests/hid: fix bpf_wq new API Benjamin Tissoires
2024-07-23 16:21 ` [PATCH HID 2/4] selftests/hid: disable struct_ops auto-attach Benjamin Tissoires
2024-07-23 16:21 ` [PATCH HID 3/4] HID: bpf: prevent the same struct_ops to be attached more than once Benjamin Tissoires
2024-07-23 16:21 ` [PATCH HID 4/4] selftests/hid: add test for attaching multiple time the same struct_ops Benjamin Tissoires
2024-07-24 16:31 ` [PATCH HID 0/4] HID: selftest fixes after merge into 6.11-rc0 tree Benjamin Tissoires
2024-07-25 15:29 ` Jiri Kosina
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).