]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
HID: samples: convert the 2 HID-BPF samples into struct_ops
authorBenjamin Tissoires <bentiss@kernel.org>
Sat, 8 Jun 2024 09:01:17 +0000 (11:01 +0200)
committerBenjamin Tissoires <bentiss@kernel.org>
Fri, 14 Jun 2024 09:20:20 +0000 (11:20 +0200)
This is mostly mechanical: attach_prog is dropped, and
the SEC are converted into struct_ops.

Link: https://lore.kernel.org/r/20240608-hid_bpf_struct_ops-v3-5-6ac6ade58329@kernel.org
Signed-off-by: Benjamin Tissoires <bentiss@kernel.org>
samples/hid/Makefile
samples/hid/hid_bpf_attach.bpf.c [deleted file]
samples/hid/hid_bpf_attach.h [deleted file]
samples/hid/hid_mouse.bpf.c
samples/hid/hid_mouse.c
samples/hid/hid_surface_dial.bpf.c
samples/hid/hid_surface_dial.c

index c128ccd499745f6b7f5daf1c87fccad57770b042..8ea59e9631a33486d31f726eb26135d34b277c2f 100644 (file)
@@ -16,7 +16,6 @@ LIBBPF_DESTDIR = $(LIBBPF_OUTPUT)
 LIBBPF_INCLUDE = $(LIBBPF_DESTDIR)/include
 LIBBPF = $(LIBBPF_OUTPUT)/libbpf.a
 
-EXTRA_HEADERS := hid_bpf_attach.h
 EXTRA_BPF_HEADERS := hid_bpf_helpers.h
 
 hid_mouse-objs := hid_mouse.o
@@ -207,8 +206,8 @@ $(obj)/%.bpf.o: $(src)/%.bpf.c $(EXTRA_BPF_HEADERS_SRC) $(obj)/vmlinux.h
 LINKED_SKELS := hid_mouse.skel.h hid_surface_dial.skel.h
 clean-files += $(LINKED_SKELS)
 
-hid_mouse.skel.h-deps := hid_mouse.bpf.o hid_bpf_attach.bpf.o
-hid_surface_dial.skel.h-deps := hid_surface_dial.bpf.o hid_bpf_attach.bpf.o
+hid_mouse.skel.h-deps := hid_mouse.bpf.o
+hid_surface_dial.skel.h-deps := hid_surface_dial.bpf.o
 
 LINKED_BPF_SRCS := $(patsubst %.bpf.o,%.bpf.c,$(foreach skel,$(LINKED_SKELS),$($(skel)-deps)))
 
diff --git a/samples/hid/hid_bpf_attach.bpf.c b/samples/hid/hid_bpf_attach.bpf.c
deleted file mode 100644 (file)
index d4dce4e..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-only
-/* Copyright (c) 2022 Benjamin Tissoires
- */
-
-#include "vmlinux.h"
-#include <bpf/bpf_helpers.h>
-#include <bpf/bpf_tracing.h>
-#include "hid_bpf_attach.h"
-#include "hid_bpf_helpers.h"
-
-SEC("syscall")
-int attach_prog(struct attach_prog_args *ctx)
-{
-       ctx->retval = hid_bpf_attach_prog(ctx->hid,
-                                         ctx->prog_fd,
-                                         0);
-       return 0;
-}
diff --git a/samples/hid/hid_bpf_attach.h b/samples/hid/hid_bpf_attach.h
deleted file mode 100644 (file)
index 35bb28b..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0-only */
-/* Copyright (c) 2022 Benjamin Tissoires
- */
-
-#ifndef __HID_BPF_ATTACH_H
-#define __HID_BPF_ATTACH_H
-
-struct attach_prog_args {
-       int prog_fd;
-       unsigned int hid;
-       int retval;
-};
-
-#endif /* __HID_BPF_ATTACH_H */
index 7c8b453ccb16ee501e46300000bb0ca6295701e9..bd901fa855c93b56196ccfaf11ebadf9348c4c1d 100644 (file)
@@ -5,8 +5,7 @@
 #include <bpf/bpf_tracing.h>
 #include "hid_bpf_helpers.h"
 
-SEC("fmod_ret/hid_bpf_device_event")
-int BPF_PROG(hid_y_event, struct hid_bpf_ctx *hctx)
+static int hid_y_event(struct hid_bpf_ctx *hctx)
 {
        s16 y;
        __u8 *data = hid_bpf_get_data(hctx, 0 /* offset */, 9 /* size */);
@@ -51,8 +50,7 @@ int BPF_PROG(hid_y_event, struct hid_bpf_ctx *hctx)
        return 0;
 }
 
-SEC("fmod_ret/hid_bpf_device_event")
-int BPF_PROG(hid_x_event, struct hid_bpf_ctx *hctx)
+static int hid_x_event(struct hid_bpf_ctx *hctx)
 {
        s16 x;
        __u8 *data = hid_bpf_get_data(hctx, 0 /* offset */, 9 /* size */);
@@ -69,7 +67,19 @@ int BPF_PROG(hid_x_event, struct hid_bpf_ctx *hctx)
        return 0;
 }
 
-SEC("fmod_ret/hid_bpf_rdesc_fixup")
+SEC("struct_ops/device_event")
+int BPF_PROG(hid_event, struct hid_bpf_ctx *hctx, enum hid_report_type type)
+{
+       int ret = hid_y_event(hctx);
+
+       if (ret)
+               return ret;
+
+       return hid_x_event(hctx);
+}
+
+
+SEC("struct_ops/rdesc_fixup")
 int BPF_PROG(hid_rdesc_fixup, struct hid_bpf_ctx *hctx)
 {
        __u8 *data = hid_bpf_get_data(hctx, 0 /* offset */, 4096 /* size */);
@@ -109,4 +119,10 @@ int BPF_PROG(hid_rdesc_fixup, struct hid_bpf_ctx *hctx)
        return 0;
 }
 
+SEC(".struct_ops.link")
+struct hid_bpf_ops mouse_invert = {
+       .rdesc_fixup = (void *)hid_rdesc_fixup,
+       .device_event = (void *)hid_event,
+};
+
 char _license[] SEC("license") = "GPL";
index 018f1185f203b5b032cf602fade04ee8066a6abe..4b80d4e4c1542de79c65802094bd8d931969bf87 100644 (file)
@@ -29,7 +29,6 @@
 #include <bpf/libbpf.h>
 
 #include "hid_mouse.skel.h"
-#include "hid_bpf_attach.h"
 
 static bool running = true;
 
@@ -76,18 +75,11 @@ static int get_hid_id(const char *path)
 int main(int argc, char **argv)
 {
        struct hid_mouse *skel;
-       struct bpf_program *prog;
+       struct bpf_link *link;
        int err;
        const char *optstr = "";
        const char *sysfs_path;
-       int opt, hid_id, attach_fd;
-       struct attach_prog_args args = {
-               .retval = -1,
-       };
-       DECLARE_LIBBPF_OPTS(bpf_test_run_opts, tattr,
-                           .ctx_in = &args,
-                           .ctx_size_in = sizeof(args),
-       );
+       int opt, hid_id;
 
        while ((opt = getopt(argc, argv, optstr)) != -1) {
                switch (opt) {
@@ -108,7 +100,7 @@ int main(int argc, char **argv)
                return 1;
        }
 
-       skel = hid_mouse__open_and_load();
+       skel = hid_mouse__open();
        if (!skel) {
                fprintf(stderr, "%s  %s:%d", __func__, __FILE__, __LINE__);
                return -1;
@@ -120,27 +112,18 @@ int main(int argc, char **argv)
                fprintf(stderr, "can not open HID device: %m\n");
                return 1;
        }
-       args.hid = hid_id;
+       skel->struct_ops.mouse_invert->hid_id = hid_id;
 
-       attach_fd = bpf_program__fd(skel->progs.attach_prog);
-       if (attach_fd < 0) {
-               fprintf(stderr, "can't locate attach prog: %m\n");
+       err = hid_mouse__load(skel);
+       if (err < 0) {
+               fprintf(stderr, "can not load HID-BPF program: %m\n");
                return 1;
        }
 
-       bpf_object__for_each_program(prog, *skel->skeleton->obj) {
-               /* ignore syscalls */
-               if (bpf_program__get_type(prog) != BPF_PROG_TYPE_TRACING)
-                       continue;
-
-               args.retval = -1;
-               args.prog_fd = bpf_program__fd(prog);
-               err = bpf_prog_test_run_opts(attach_fd, &tattr);
-               if (err) {
-                       fprintf(stderr, "can't attach prog to hid device %d: %m (err: %d)\n",
-                               hid_id, err);
-                       return 1;
-               }
+       link = bpf_map__attach_struct_ops(skel->maps.mouse_invert);
+       if (!link) {
+               fprintf(stderr, "can not attach HID-BPF program: %m\n");
+               return 1;
        }
 
        signal(SIGINT, int_exit);
index 1f80478c0918d6253094e310c8e6a7ec4a703bd9..d8d0fb07391faadac600c37a3e87d9ed0ab8c97f 100644 (file)
@@ -10,7 +10,7 @@
 #define HID_UP_BUTTON          0x0009
 #define HID_GD_WHEEL           0x0038
 
-SEC("fmod_ret/hid_bpf_device_event")
+SEC("struct_ops/device_event")
 int BPF_PROG(hid_event, struct hid_bpf_ctx *hctx)
 {
        __u8 *data = hid_bpf_get_data(hctx, 0 /* offset */, 9 /* size */);
@@ -101,7 +101,7 @@ int set_haptic(struct haptic_syscall_args *args)
 }
 
 /* Convert REL_DIAL into REL_WHEEL */
-SEC("fmod_ret/hid_bpf_rdesc_fixup")
+SEC("struct_ops/rdesc_fixup")
 int BPF_PROG(hid_rdesc_fixup, struct hid_bpf_ctx *hctx)
 {
        __u8 *data = hid_bpf_get_data(hctx, 0 /* offset */, 4096 /* size */);
@@ -130,5 +130,11 @@ int BPF_PROG(hid_rdesc_fixup, struct hid_bpf_ctx *hctx)
        return 0;
 }
 
+SEC(".struct_ops.link")
+struct hid_bpf_ops surface_dial = {
+       .rdesc_fixup = (void *)hid_rdesc_fixup,
+       .device_event = (void *)hid_event,
+};
+
 char _license[] SEC("license") = "GPL";
 u32 _version SEC("version") = 1;
index 4bc97373a7083b1487f7267b9a2c996ac330d7ff..9dd363845a85046ad30f48ceca05e9576e691194 100644 (file)
@@ -31,7 +31,6 @@
 #include <bpf/libbpf.h>
 
 #include "hid_surface_dial.skel.h"
-#include "hid_bpf_attach.h"
 
 static bool running = true;
 
@@ -86,34 +85,6 @@ static int get_hid_id(const char *path)
        return (int)strtol(str_id, NULL, 16);
 }
 
-static int attach_prog(struct hid_surface_dial *skel, struct bpf_program *prog, int hid_id)
-{
-       struct attach_prog_args args = {
-               .hid = hid_id,
-               .retval = -1,
-       };
-       int attach_fd, err;
-       DECLARE_LIBBPF_OPTS(bpf_test_run_opts, tattr,
-                           .ctx_in = &args,
-                           .ctx_size_in = sizeof(args),
-       );
-
-       attach_fd = bpf_program__fd(skel->progs.attach_prog);
-       if (attach_fd < 0) {
-               fprintf(stderr, "can't locate attach prog: %m\n");
-               return 1;
-       }
-
-       args.prog_fd = bpf_program__fd(prog);
-       err = bpf_prog_test_run_opts(attach_fd, &tattr);
-       if (err) {
-               fprintf(stderr, "can't attach prog to hid device %d: %m (err: %d)\n",
-                       hid_id, err);
-               return 1;
-       }
-       return 0;
-}
-
 static int set_haptic(struct hid_surface_dial *skel, int hid_id)
 {
        struct haptic_syscall_args args = {
@@ -144,10 +115,10 @@ static int set_haptic(struct hid_surface_dial *skel, int hid_id)
 int main(int argc, char **argv)
 {
        struct hid_surface_dial *skel;
-       struct bpf_program *prog;
        const char *optstr = "r:";
+       struct bpf_link *link;
        const char *sysfs_path;
-       int opt, hid_id, resolution = 72;
+       int err, opt, hid_id, resolution = 72;
 
        while ((opt = getopt(argc, argv, optstr)) != -1) {
                switch (opt) {
@@ -189,7 +160,7 @@ int main(int argc, char **argv)
                return 1;
        }
 
-       skel = hid_surface_dial__open_and_load();
+       skel = hid_surface_dial__open();
        if (!skel) {
                fprintf(stderr, "%s  %s:%d", __func__, __FILE__, __LINE__);
                return -1;
@@ -201,15 +172,21 @@ int main(int argc, char **argv)
                return 1;
        }
 
+       skel->struct_ops.surface_dial->hid_id = hid_id;
+
+       err = hid_surface_dial__load(skel);
+       if (err < 0) {
+               fprintf(stderr, "can not load HID-BPF program: %m\n");
+               return 1;
+       }
+
        skel->data->resolution = resolution;
        skel->data->physical = (int)(resolution / 72);
 
-       bpf_object__for_each_program(prog, *skel->skeleton->obj) {
-               /* ignore syscalls */
-               if (bpf_program__get_type(prog) != BPF_PROG_TYPE_TRACING)
-                       continue;
-
-               attach_prog(skel, prog, hid_id);
+       link = bpf_map__attach_struct_ops(skel->maps.surface_dial);
+       if (!link) {
+               fprintf(stderr, "can not attach HID-BPF program: %m\n");
+               return 1;
        }
 
        signal(SIGINT, int_exit);