From: Tero Kristo <tero.kristo@linux.intel.com>
To: Benjamin Tissoires <benjamin.tissoires@redhat.com>,
Greg KH <gregkh@linuxfoundation.org>,
Jiri Kosina <jikos@kernel.org>,
Alexei Starovoitov <ast@kernel.org>,
Daniel Borkmann <daniel@iogearbox.net>,
Andrii Nakryiko <andrii@kernel.org>,
Martin KaFai Lau <kafai@fb.com>, Song Liu <songliubraving@fb.com>,
Yonghong Song <yhs@fb.com>,
John Fastabend <john.fastabend@gmail.com>,
KP Singh <kpsingh@kernel.org>, Shuah Khan <shuah@kernel.org>,
Dave Marchevsky <davemarchevsky@fb.com>,
Joe Stringer <joe@cilium.io>
Cc: linux-kernel@vger.kernel.org, linux-input@vger.kernel.org,
netdev@vger.kernel.org, bpf@vger.kernel.org,
linux-kselftest@vger.kernel.org
Subject: Re: [PATCH bpf-next v2 14/28] selftests/bpf: add tests for hid_{get|set}_data helpers
Date: Tue, 15 Mar 2022 18:49:20 +0200 [thread overview]
Message-ID: <e1acd50f-fe67-14a8-846f-66b52e77abc0@linux.intel.com> (raw)
In-Reply-To: <20220304172852.274126-15-benjamin.tissoires@redhat.com>
Hi Benjamin,
On 04/03/2022 19:28, Benjamin Tissoires wrote:
> Simple test added here, with one use of each helper.
>
> Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
>
> ---
>
> changes in v2:
> - split the patch with libbpf left outside.
> ---
> tools/testing/selftests/bpf/prog_tests/hid.c | 65 ++++++++++++++++++++
> tools/testing/selftests/bpf/progs/hid.c | 45 ++++++++++++++
> 2 files changed, 110 insertions(+)
>
> diff --git a/tools/testing/selftests/bpf/prog_tests/hid.c b/tools/testing/selftests/bpf/prog_tests/hid.c
> index 91543b8078ca..74426523dd6f 100644
> --- a/tools/testing/selftests/bpf/prog_tests/hid.c
> +++ b/tools/testing/selftests/bpf/prog_tests/hid.c
> @@ -297,6 +297,68 @@ static int test_hid_raw_event(struct hid *hid_skel, int uhid_fd, int sysfs_fd)
> return ret;
> }
>
> +/*
> + * Attach hid_set_get_data to the given uhid device,
> + * retrieve and open the matching hidraw node,
> + * inject one event in the uhid device,
> + * check that the program makes correct use of bpf_hid_{set|get}_data.
> + */
> +static int test_hid_set_get_data(struct hid *hid_skel, int uhid_fd, int sysfs_fd)
> +{
> + int err, hidraw_ino, hidraw_fd = -1;
> + char hidraw_path[64] = {0};
> + u8 buf[10] = {0};
> + int ret = -1;
> +
> + /* attach hid_set_get_data program */
> + hid_skel->links.hid_set_get_data =
> + bpf_program__attach_hid(hid_skel->progs.hid_set_get_data, sysfs_fd);
> + if (!ASSERT_OK_PTR(hid_skel->links.hid_set_get_data,
> + "attach_hid(hid_set_get_data)"))
> + return PTR_ERR(hid_skel->links.hid_set_get_data);
> +
> + hidraw_ino = get_hidraw(hid_skel->links.hid_set_get_data);
> + if (!ASSERT_GE(hidraw_ino, 0, "get_hidraw"))
> + goto cleanup;
> +
> + /* open hidraw node to check the other side of the pipe */
> + sprintf(hidraw_path, "/dev/hidraw%d", hidraw_ino);
> + hidraw_fd = open(hidraw_path, O_RDWR | O_NONBLOCK);
> +
> + if (!ASSERT_GE(hidraw_fd, 0, "open_hidraw"))
> + goto cleanup;
> +
> + /* inject one event */
> + buf[0] = 1;
> + buf[1] = 42;
> + send_event(uhid_fd, buf, 6);
> +
> + /* read the data from hidraw */
> + memset(buf, 0, sizeof(buf));
> + err = read(hidraw_fd, buf, sizeof(buf));
> + if (!ASSERT_EQ(err, 6, "read_hidraw"))
> + goto cleanup;
> +
> + if (!ASSERT_EQ(buf[2], (42 >> 2), "hid_set_get_data"))
> + goto cleanup;
> +
> + if (!ASSERT_EQ(buf[3], 1, "hid_set_get_data"))
> + goto cleanup;
> +
> + if (!ASSERT_EQ(buf[4], 42, "hid_set_get_data"))
> + goto cleanup;
> +
> + ret = 0;
> +
> +cleanup:
> + if (hidraw_fd >= 0)
> + close(hidraw_fd);
> +
> + hid__detach(hid_skel);
> +
> + return ret;
> +}
> +
> /*
> * Attach hid_rdesc_fixup to the given uhid device,
> * retrieve and open the matching hidraw node,
> @@ -395,6 +457,9 @@ void serial_test_hid_bpf(void)
> err = test_hid_raw_event(hid_skel, uhid_fd, sysfs_fd);
> ASSERT_OK(err, "hid");
>
> + err = test_hid_set_get_data(hid_skel, uhid_fd, sysfs_fd);
> + ASSERT_OK(err, "hid_set_get_data");
> +
> err = test_rdesc_fixup(hid_skel, uhid_fd, sysfs_fd);
> ASSERT_OK(err, "hid_rdesc_fixup");
>
> diff --git a/tools/testing/selftests/bpf/progs/hid.c b/tools/testing/selftests/bpf/progs/hid.c
> index 2270448d0d3f..de6668471940 100644
> --- a/tools/testing/selftests/bpf/progs/hid.c
> +++ b/tools/testing/selftests/bpf/progs/hid.c
> @@ -66,3 +66,48 @@ int hid_rdesc_fixup(struct hid_bpf_ctx *ctx)
>
> return 0;
> }
> +
> +SEC("hid/device_event")
> +int hid_set_get_data(struct hid_bpf_ctx *ctx)
> +{
> + int ret;
> + __u8 *buf;
> +
> + buf = bpf_ringbuf_reserve(&ringbuf, 8, 0);
Ordering of patches is probably wrong, it seems the ringbuf is defined
in patch #21 but used here.
Also, this usage of ringbuf leads into running out of available memory
in the buffer if used for long time, it is not evident from the test
case written here but I spent a couple of hours debugging my own BPF
program that used ringbuf in similar way as what is done here. Basically
the producer idx is increased with the bpf_ringbuf_reserve / discard,
but the consumer index is not if you don't have a consumer in place.
I ended up using a global statically allocated buffer for the purpose
for now.
-Tero
> + if (!buf)
> + return -12; /* -ENOMEM */
> +
> + /* first try read/write with n > 32 */
> + ret = bpf_hid_get_data(ctx, 0, 64, buf, 8);
> + if (ret < 0)
> + goto discard;
> +
> + /* reinject it */
> + ret = bpf_hid_set_data(ctx, 24, 64, buf, 8);
> + if (ret < 0)
> + goto discard;
> +
> + /* extract data at bit offset 10 of size 4 (half a byte) */
> + ret = bpf_hid_get_data(ctx, 10, 4, buf, 8); /* expected to fail */
> + if (ret > 0) {
> + ret = -1;
> + goto discard;
> + }
> +
> + ret = bpf_hid_get_data(ctx, 10, 4, buf, 4);
> + if (ret < 0)
> + goto discard;
> +
> + /* reinject it */
> + ret = bpf_hid_set_data(ctx, 16, 4, buf, 4);
> + if (ret < 0)
> + goto discard;
> +
> + ret = 0;
> +
> + discard:
> +
> + bpf_ringbuf_discard(buf, 0);
> +
> + return ret;
> +}
next prev parent reply other threads:[~2022-03-15 16:50 UTC|newest]
Thread overview: 73+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-03-04 17:28 [PATCH bpf-next v2 00/28] Introduce eBPF support for HID devices Benjamin Tissoires
2022-03-04 17:28 ` [PATCH bpf-next v2 01/28] bpf: add new is_sys_admin_prog_type() helper Benjamin Tissoires
2022-03-04 23:12 ` Song Liu
2022-03-05 10:07 ` Benjamin Tissoires
2022-03-05 16:58 ` Sean Young
2022-03-07 18:26 ` Song Liu
2022-03-07 18:23 ` Song Liu
2022-03-09 8:27 ` Sean Young
2022-03-04 17:28 ` [PATCH bpf-next v2 02/28] bpf: introduce hid program type Benjamin Tissoires
2022-03-04 18:21 ` Greg KH
2022-03-07 17:57 ` Benjamin Tissoires
2022-03-05 0:02 ` Song Liu
2022-03-07 18:39 ` Benjamin Tissoires
2022-03-08 0:56 ` Song Liu
2022-03-08 9:20 ` Benjamin Tissoires
2022-03-11 17:16 ` Benjamin Tissoires
2022-03-05 0:20 ` Song Liu
2022-03-04 17:28 ` [PATCH bpf-next v2 03/28] HID: hook up with bpf Benjamin Tissoires
2022-03-04 18:24 ` Greg KH
2022-03-05 0:23 ` Song Liu
2022-03-15 16:29 ` Tero Kristo
2022-03-04 17:28 ` [PATCH bpf-next v2 04/28] libbpf: add HID program type and API Benjamin Tissoires
2022-03-05 0:31 ` Song Liu
2022-03-08 1:30 ` Andrii Nakryiko
2022-03-08 1:38 ` Song Liu
2022-03-08 5:52 ` Andrii Nakryiko
2022-03-04 17:28 ` [PATCH bpf-next v2 05/28] selftests/bpf: add tests for the HID-bpf initial implementation Benjamin Tissoires
2022-03-05 0:41 ` Song Liu
2022-03-05 10:10 ` Benjamin Tissoires
2022-03-04 17:28 ` [PATCH bpf-next v2 06/28] samples/bpf: add new hid_mouse example Benjamin Tissoires
2022-03-04 18:26 ` Greg KH
2022-03-04 17:28 ` [PATCH bpf-next v2 07/28] bpf/hid: add a new attach type to change the report descriptor Benjamin Tissoires
2022-03-04 18:32 ` Greg KH
2022-03-04 17:28 ` [PATCH bpf-next v2 08/28] HID: allow to change the report descriptor from an eBPF program Benjamin Tissoires
2022-03-04 18:32 ` Greg KH
2022-03-04 17:28 ` [PATCH bpf-next v2 09/28] libbpf: add new attach type BPF_HID_RDESC_FIXUP Benjamin Tissoires
2022-03-04 17:28 ` [PATCH bpf-next v2 10/28] selftests/bpf: add report descriptor fixup tests Benjamin Tissoires
2022-03-04 18:34 ` Greg KH
2022-03-04 17:28 ` [PATCH bpf-next v2 11/28] samples/bpf: add a report descriptor fixup Benjamin Tissoires
2022-03-04 18:36 ` Greg KH
2022-03-04 17:28 ` [PATCH bpf-next v2 12/28] bpf/hid: add hid_{get|set}_data helpers Benjamin Tissoires
2022-03-04 18:37 ` Greg KH
2022-03-04 18:41 ` Greg KH
2022-03-05 10:33 ` Benjamin Tissoires
2022-03-05 10:47 ` Greg KH
2022-03-11 0:40 ` Song Liu
2022-03-11 15:08 ` Benjamin Tissoires
2022-03-04 17:28 ` [PATCH bpf-next v2 13/28] HID: bpf: implement hid_bpf_get|set_data Benjamin Tissoires
2022-03-04 18:39 ` Greg KH
2022-03-04 17:28 ` [PATCH bpf-next v2 14/28] selftests/bpf: add tests for hid_{get|set}_data helpers Benjamin Tissoires
2022-03-15 16:49 ` Tero Kristo [this message]
2022-03-15 17:02 ` Benjamin Tissoires
2022-03-04 17:28 ` [PATCH bpf-next v2 15/28] bpf/hid: add new BPF type to trigger commands from userspace Benjamin Tissoires
2022-03-11 0:46 ` Song Liu
2022-03-04 17:28 ` [PATCH bpf-next v2 16/28] libbpf: add new attach type BPF_HID_USER_EVENT Benjamin Tissoires
2022-03-04 17:28 ` [PATCH bpf-next v2 17/28] selftests/bpf: add test for user call of HID bpf programs Benjamin Tissoires
2022-03-04 17:28 ` [PATCH bpf-next v2 18/28] selftests/bpf: hid: rely on uhid event to know if a test device is ready Benjamin Tissoires
2022-03-04 17:28 ` [PATCH bpf-next v2 19/28] bpf/hid: add bpf_hid_raw_request helper function Benjamin Tissoires
2022-03-11 0:50 ` Song Liu
2022-03-04 17:28 ` [PATCH bpf-next v2 20/28] HID: add implementation of bpf_hid_raw_request Benjamin Tissoires
2022-03-04 17:28 ` [PATCH bpf-next v2 21/28] selftests/bpf: add tests for bpf_hid_hw_request Benjamin Tissoires
2022-03-04 17:28 ` [PATCH bpf-next v2 22/28] bpf/verifier: prevent non GPL programs to be loaded against HID Benjamin Tissoires
2022-03-04 17:28 ` [PATCH bpf-next v2 23/28] HID: bpf: compute only the required buffer size for the device Benjamin Tissoires
2022-03-04 17:28 ` [PATCH bpf-next v2 24/28] HID: bpf: only call hid_bpf_raw_event() if a ctx is available Benjamin Tissoires
2022-03-04 17:28 ` [PATCH bpf-next v2 25/28] bpf/hid: Add a flag to add the program at the beginning of the list Benjamin Tissoires
2022-03-04 17:28 ` [PATCH bpf-next v2 26/28] libbpf: add handling for BPF_F_INSERT_HEAD in HID programs Benjamin Tissoires
2022-03-04 17:28 ` [PATCH bpf-next v2 27/28] selftests/bpf: Add a test for BPF_F_INSERT_HEAD Benjamin Tissoires
2022-03-04 17:28 ` [PATCH bpf-next v2 28/28] samples/bpf: fix bpf_program__attach_hid() api change Benjamin Tissoires
2022-03-05 1:13 ` [PATCH bpf-next v2 00/28] Introduce eBPF support for HID devices Song Liu
2022-03-05 10:23 ` Benjamin Tissoires
2022-03-07 18:11 ` Song Liu
2022-03-08 13:37 ` Benjamin Tissoires
2022-03-15 17:04 ` Tero Kristo
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=e1acd50f-fe67-14a8-846f-66b52e77abc0@linux.intel.com \
--to=tero.kristo@linux.intel.com \
--cc=andrii@kernel.org \
--cc=ast@kernel.org \
--cc=benjamin.tissoires@redhat.com \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=davemarchevsky@fb.com \
--cc=gregkh@linuxfoundation.org \
--cc=jikos@kernel.org \
--cc=joe@cilium.io \
--cc=john.fastabend@gmail.com \
--cc=kafai@fb.com \
--cc=kpsingh@kernel.org \
--cc=linux-input@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=shuah@kernel.org \
--cc=songliubraving@fb.com \
--cc=yhs@fb.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).