summaryrefslogtreecommitdiff
path: root/drivers/hid/bpf/entrypoints/entrypoints.bpf.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/hid/bpf/entrypoints/entrypoints.bpf.c')
-rw-r--r--drivers/hid/bpf/entrypoints/entrypoints.bpf.c40
1 files changed, 4 insertions, 36 deletions
diff --git a/drivers/hid/bpf/entrypoints/entrypoints.bpf.c b/drivers/hid/bpf/entrypoints/entrypoints.bpf.c
index 41dd66d5fc7a..7c1895d9e5c0 100644
--- a/drivers/hid/bpf/entrypoints/entrypoints.bpf.c
+++ b/drivers/hid/bpf/entrypoints/entrypoints.bpf.c
@@ -7,7 +7,7 @@
#define HID_BPF_MAX_PROGS 1024
-extern bool call_hid_bpf_prog_release(u64 prog, int table_cnt) __ksym;
+extern void call_hid_bpf_prog_put_deferred(struct work_struct *work) __ksym;
struct {
__uint(type, BPF_MAP_TYPE_PROG_ARRAY);
@@ -16,13 +16,6 @@ struct {
__uint(value_size, sizeof(__u32));
} hid_jmp_table SEC(".maps");
-struct {
- __uint(type, BPF_MAP_TYPE_HASH);
- __uint(max_entries, HID_BPF_MAX_PROGS * HID_BPF_PROG_TYPE_MAX);
- __type(key, void *);
- __type(value, __u8);
-} progs_map SEC(".maps");
-
SEC("fmod_ret/__hid_bpf_tail_call")
int BPF_PROG(hid_tail_call, struct hid_bpf_ctx *hctx)
{
@@ -31,35 +24,10 @@ int BPF_PROG(hid_tail_call, struct hid_bpf_ctx *hctx)
return 0;
}
-static void release_prog(u64 prog)
-{
- u8 *value;
-
- value = bpf_map_lookup_elem(&progs_map, &prog);
- if (!value)
- return;
-
- if (call_hid_bpf_prog_release(prog, *value))
- bpf_map_delete_elem(&progs_map, &prog);
-}
-
-SEC("fexit/bpf_prog_release")
-int BPF_PROG(hid_prog_release, struct inode *inode, struct file *filp)
+SEC("fentry/bpf_prog_put_deferred")
+int BPF_PROG(hid_bpf_prog_put_deferred, struct work_struct *work)
{
- u64 prog = (u64)filp->private_data;
-
- release_prog(prog);
-
- return 0;
-}
-
-SEC("fexit/bpf_free_inode")
-int BPF_PROG(hid_free_inode, struct inode *inode)
-{
- u64 prog = (u64)inode->i_private;
-
- release_prog(prog);
-
+ call_hid_bpf_prog_put_deferred(work);
return 0;
}