Commit e342d6f6 authored by Benjamin Tissoires's avatar Benjamin Tissoires
Browse files

HID: samples: convert the 2 HID-BPF samples into struct_ops

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: default avatarBenjamin Tissoires <bentiss@kernel.org>
parent d7696738
Loading
Loading
Loading
Loading
+2 −3
Original line number Diff line number Diff line
@@ -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)))

samples/hid/hid_bpf_attach.bpf.c

deleted100644 → 0
+0 −18
Original line number Diff line number Diff line
// 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;
}

samples/hid/hid_bpf_attach.h

deleted100644 → 0
+0 −14
Original line number Diff line number Diff line
/* 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 */
+21 −5
Original line number Diff line number Diff line
@@ -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";
+11 −28
Original line number Diff line number Diff line
@@ -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,28 +112,19 @@ 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);
	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);
	signal(SIGTERM, int_exit);
Loading