Commit 764ad6b0 authored by Benjamin Tissoires's avatar Benjamin Tissoires

HID: bpf: use __bpf_kfunc instead of noinline

Follow the docs at Documentation/bpf/kfuncs.rst:
- declare the function with `__bpf_kfunc`
- disables missing prototype warnings, which allows to remove them from
  include/linux/hid-bpf.h

Removing the prototypes is not an issue because we currently have to
redeclare them when writing the BPF program. They will eventually be
generated by bpftool directly AFAIU.

Link: https://lore.kernel.org/r/20240124-b4-hid-bpf-fixes-v2-3-052520b1e5e6@kernel.orgSigned-off-by: default avatarBenjamin Tissoires <bentiss@kernel.org>
parent 89be8aa5
...@@ -143,6 +143,9 @@ u8 *call_hid_bpf_rdesc_fixup(struct hid_device *hdev, u8 *rdesc, unsigned int *s ...@@ -143,6 +143,9 @@ u8 *call_hid_bpf_rdesc_fixup(struct hid_device *hdev, u8 *rdesc, unsigned int *s
} }
EXPORT_SYMBOL_GPL(call_hid_bpf_rdesc_fixup); EXPORT_SYMBOL_GPL(call_hid_bpf_rdesc_fixup);
/* Disables missing prototype warnings */
__bpf_kfunc_start_defs();
/** /**
* hid_bpf_get_data - Get the kernel memory pointer associated with the context @ctx * hid_bpf_get_data - Get the kernel memory pointer associated with the context @ctx
* *
...@@ -152,7 +155,7 @@ EXPORT_SYMBOL_GPL(call_hid_bpf_rdesc_fixup); ...@@ -152,7 +155,7 @@ EXPORT_SYMBOL_GPL(call_hid_bpf_rdesc_fixup);
* *
* @returns %NULL on error, an %__u8 memory pointer on success * @returns %NULL on error, an %__u8 memory pointer on success
*/ */
noinline __u8 * __bpf_kfunc __u8 *
hid_bpf_get_data(struct hid_bpf_ctx *ctx, unsigned int offset, const size_t rdwr_buf_size) hid_bpf_get_data(struct hid_bpf_ctx *ctx, unsigned int offset, const size_t rdwr_buf_size)
{ {
struct hid_bpf_ctx_kern *ctx_kern; struct hid_bpf_ctx_kern *ctx_kern;
...@@ -167,6 +170,7 @@ hid_bpf_get_data(struct hid_bpf_ctx *ctx, unsigned int offset, const size_t rdwr ...@@ -167,6 +170,7 @@ hid_bpf_get_data(struct hid_bpf_ctx *ctx, unsigned int offset, const size_t rdwr
return ctx_kern->data + offset; return ctx_kern->data + offset;
} }
__bpf_kfunc_end_defs();
/* /*
* The following set contains all functions we agree BPF programs * The following set contains all functions we agree BPF programs
...@@ -274,6 +278,9 @@ static int do_hid_bpf_attach_prog(struct hid_device *hdev, int prog_fd, struct b ...@@ -274,6 +278,9 @@ static int do_hid_bpf_attach_prog(struct hid_device *hdev, int prog_fd, struct b
return fd; return fd;
} }
/* Disables missing prototype warnings */
__bpf_kfunc_start_defs();
/** /**
* hid_bpf_attach_prog - Attach the given @prog_fd to the given HID device * hid_bpf_attach_prog - Attach the given @prog_fd to the given HID device
* *
...@@ -286,7 +293,7 @@ static int do_hid_bpf_attach_prog(struct hid_device *hdev, int prog_fd, struct b ...@@ -286,7 +293,7 @@ static int do_hid_bpf_attach_prog(struct hid_device *hdev, int prog_fd, struct b
* is pinned to the BPF file system). * is pinned to the BPF file system).
*/ */
/* called from syscall */ /* called from syscall */
noinline int __bpf_kfunc int
hid_bpf_attach_prog(unsigned int hid_id, int prog_fd, __u32 flags) hid_bpf_attach_prog(unsigned int hid_id, int prog_fd, __u32 flags)
{ {
struct hid_device *hdev; struct hid_device *hdev;
...@@ -338,7 +345,7 @@ hid_bpf_attach_prog(unsigned int hid_id, int prog_fd, __u32 flags) ...@@ -338,7 +345,7 @@ hid_bpf_attach_prog(unsigned int hid_id, int prog_fd, __u32 flags)
* *
* @returns A pointer to &struct hid_bpf_ctx on success, %NULL on error. * @returns A pointer to &struct hid_bpf_ctx on success, %NULL on error.
*/ */
noinline struct hid_bpf_ctx * __bpf_kfunc struct hid_bpf_ctx *
hid_bpf_allocate_context(unsigned int hid_id) hid_bpf_allocate_context(unsigned int hid_id)
{ {
struct hid_device *hdev; struct hid_device *hdev;
...@@ -371,7 +378,7 @@ hid_bpf_allocate_context(unsigned int hid_id) ...@@ -371,7 +378,7 @@ hid_bpf_allocate_context(unsigned int hid_id)
* @ctx: the HID-BPF context to release * @ctx: the HID-BPF context to release
* *
*/ */
noinline void __bpf_kfunc void
hid_bpf_release_context(struct hid_bpf_ctx *ctx) hid_bpf_release_context(struct hid_bpf_ctx *ctx)
{ {
struct hid_bpf_ctx_kern *ctx_kern; struct hid_bpf_ctx_kern *ctx_kern;
...@@ -397,7 +404,7 @@ hid_bpf_release_context(struct hid_bpf_ctx *ctx) ...@@ -397,7 +404,7 @@ hid_bpf_release_context(struct hid_bpf_ctx *ctx)
* *
* @returns %0 on success, a negative error code otherwise. * @returns %0 on success, a negative error code otherwise.
*/ */
noinline int __bpf_kfunc int
hid_bpf_hw_request(struct hid_bpf_ctx *ctx, __u8 *buf, size_t buf__sz, hid_bpf_hw_request(struct hid_bpf_ctx *ctx, __u8 *buf, size_t buf__sz,
enum hid_report_type rtype, enum hid_class_request reqtype) enum hid_report_type rtype, enum hid_class_request reqtype)
{ {
...@@ -465,6 +472,7 @@ hid_bpf_hw_request(struct hid_bpf_ctx *ctx, __u8 *buf, size_t buf__sz, ...@@ -465,6 +472,7 @@ hid_bpf_hw_request(struct hid_bpf_ctx *ctx, __u8 *buf, size_t buf__sz,
kfree(dma_data); kfree(dma_data);
return ret; return ret;
} }
__bpf_kfunc_end_defs();
/* our HID-BPF entrypoints */ /* our HID-BPF entrypoints */
BTF_SET8_START(hid_bpf_fmodret_ids) BTF_SET8_START(hid_bpf_fmodret_ids)
......
...@@ -77,17 +77,6 @@ enum hid_bpf_attach_flags { ...@@ -77,17 +77,6 @@ enum hid_bpf_attach_flags {
int hid_bpf_device_event(struct hid_bpf_ctx *ctx); int hid_bpf_device_event(struct hid_bpf_ctx *ctx);
int hid_bpf_rdesc_fixup(struct hid_bpf_ctx *ctx); int hid_bpf_rdesc_fixup(struct hid_bpf_ctx *ctx);
/* Following functions are kfunc that we export to BPF programs */
/* available everywhere in HID-BPF */
__u8 *hid_bpf_get_data(struct hid_bpf_ctx *ctx, unsigned int offset, const size_t __sz);
/* only available in syscall */
int hid_bpf_attach_prog(unsigned int hid_id, int prog_fd, __u32 flags);
int hid_bpf_hw_request(struct hid_bpf_ctx *ctx, __u8 *buf, size_t buf__sz,
enum hid_report_type rtype, enum hid_class_request reqtype);
struct hid_bpf_ctx *hid_bpf_allocate_context(unsigned int hid_id);
void hid_bpf_release_context(struct hid_bpf_ctx *ctx);
/* /*
* Below is HID internal * Below is HID internal
*/ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment