mirror of
https://git.proxmox.com/git/mirror_ubuntu-kernels.git
synced 2026-01-28 11:18:01 +00:00
Kind of a hack, but works for now: Instead of listening for any close of eBPF program, we now decrement the refcount when we insert it in our internal map of fd progs. This is safe to do because: - we listen to any call of destructor of programs - when a program is being destroyed, we disable it by removing it from any RCU list used by any HID device (so it will never be called) - we then trigger a job to cleanup the prog fd map, but we overwrite the removal of the elements to not do anything on the programs, just remove the allocated space This is better than previously because we can remove the map of known programs and their usage count. We now rely on the refcount of bpf, which has greater chances of being accurate. Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com> Signed-off-by: Jiri Kosina <jkosina@suse.cz>
35 lines
823 B
C
35 lines
823 B
C
// SPDX-License-Identifier: GPL-2.0
|
|
/* Copyright (c) 2022 Benjamin Tissoires */
|
|
|
|
#include ".output/vmlinux.h"
|
|
#include <bpf/bpf_helpers.h>
|
|
#include <bpf/bpf_tracing.h>
|
|
|
|
#define HID_BPF_MAX_PROGS 1024
|
|
|
|
extern void call_hid_bpf_prog_put_deferred(struct work_struct *work) __ksym;
|
|
|
|
struct {
|
|
__uint(type, BPF_MAP_TYPE_PROG_ARRAY);
|
|
__uint(max_entries, HID_BPF_MAX_PROGS);
|
|
__uint(key_size, sizeof(__u32));
|
|
__uint(value_size, sizeof(__u32));
|
|
} hid_jmp_table SEC(".maps");
|
|
|
|
SEC("fmod_ret/__hid_bpf_tail_call")
|
|
int BPF_PROG(hid_tail_call, struct hid_bpf_ctx *hctx)
|
|
{
|
|
bpf_tail_call(ctx, &hid_jmp_table, hctx->index);
|
|
|
|
return 0;
|
|
}
|
|
|
|
SEC("fentry/bpf_prog_put_deferred")
|
|
int BPF_PROG(hid_bpf_prog_put_deferred, struct work_struct *work)
|
|
{
|
|
call_hid_bpf_prog_put_deferred(work);
|
|
return 0;
|
|
}
|
|
|
|
char LICENSE[] SEC("license") = "GPL";
|