Skip to content

Commit

Permalink
HID: samples: convert the 2 HID-BPF samples into struct_ops
Browse files Browse the repository at this point in the history
This is mostly mechanical: attach_prog is dropped, and
the SEC are converted into struct_ops.

Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Benjamin Tissoires <[email protected]>
  • Loading branch information
Benjamin Tissoires committed Jun 14, 2024
1 parent d769673 commit e342d6f
Show file tree
Hide file tree
Showing 7 changed files with 57 additions and 108 deletions.
5 changes: 2 additions & 3 deletions samples/hid/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)))

Expand Down
18 changes: 0 additions & 18 deletions samples/hid/hid_bpf_attach.bpf.c

This file was deleted.

14 changes: 0 additions & 14 deletions samples/hid/hid_bpf_attach.h

This file was deleted.

26 changes: 21 additions & 5 deletions samples/hid/hid_mouse.bpf.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 */);
Expand Down Expand Up @@ -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 */);
Expand All @@ -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 */);
Expand Down Expand Up @@ -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";
39 changes: 11 additions & 28 deletions samples/hid/hid_mouse.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@
#include <bpf/libbpf.h>

#include "hid_mouse.skel.h"
#include "hid_bpf_attach.h"

static bool running = true;

Expand Down Expand Up @@ -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) {
Expand All @@ -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;
Expand All @@ -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);
Expand Down
10 changes: 8 additions & 2 deletions samples/hid/hid_surface_dial.bpf.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 */);
Expand Down Expand Up @@ -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 */);
Expand Down Expand Up @@ -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;
53 changes: 15 additions & 38 deletions samples/hid/hid_surface_dial.c
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@
#include <bpf/libbpf.h>

#include "hid_surface_dial.skel.h"
#include "hid_bpf_attach.h"

static bool running = true;

Expand Down Expand Up @@ -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 = {
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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;
Expand All @@ -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);
Expand Down

0 comments on commit e342d6f

Please sign in to comment.