diff options
| author | Benjamin Tissoires <bentiss@kernel.org> | 2024-06-26 15:46:24 +0200 |
|---|---|---|
| committer | Benjamin Tissoires <bentiss@kernel.org> | 2024-06-27 10:58:22 +0200 |
| commit | 6cd735f0e57a6c8510ad92f5b63837a8d0cff3a7 (patch) | |
| tree | dcd4c66314d7a4fedf3438f199f34ddc24bcf3db /drivers/hid/bpf/hid_bpf_struct_ops.c | |
| parent | 67eccf151d76a9939ad8a50c6db5cb486b01df24 (diff) | |
HID: bpf: protect HID-BPF prog_list access by a SRCU
We want to add sleepable callbacks for hid_hw_raw_request() and
hid_hw_output_report(), but we can not use a plain RCU for those.
Prepare for a SRCU so we can extend HID-BPF.
This changes a little bit how hid_bpf_device_init() behaves, as it may
now fail, so there is a tiny hid-core.c change to accommodate for this.
Link: https://patch.msgid.link/20240626-hid_hw_req_bpf-v2-3-cfd60fb6c79f@kernel.org
Acked-by: Jiri Kosina <jkosina@suse.com>
Signed-off-by: Benjamin Tissoires <bentiss@kernel.org>
Diffstat (limited to 'drivers/hid/bpf/hid_bpf_struct_ops.c')
| -rw-r--r-- | drivers/hid/bpf/hid_bpf_struct_ops.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/drivers/hid/bpf/hid_bpf_struct_ops.c b/drivers/hid/bpf/hid_bpf_struct_ops.c index 8063db1c8d62..d34731a1b457 100644 --- a/drivers/hid/bpf/hid_bpf_struct_ops.c +++ b/drivers/hid/bpf/hid_bpf_struct_ops.c @@ -214,6 +214,7 @@ static int hid_bpf_reg(void *kdata) list_add_rcu(&ops->list, &hdev->bpf.prog_list); else list_add_tail_rcu(&ops->list, &hdev->bpf.prog_list); + synchronize_srcu(&hdev->bpf.srcu); out_unlock: mutex_unlock(&hdev->bpf.prog_list_lock); @@ -244,6 +245,7 @@ static void hid_bpf_unreg(void *kdata) mutex_lock(&hdev->bpf.prog_list_lock); list_del_rcu(&ops->list); + synchronize_srcu(&hdev->bpf.srcu); reconnect = hdev->bpf.rdesc_ops == ops; if (reconnect) |
