From patchwork Wed Feb 14 17:18:36 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Benjamin Tissoires X-Patchwork-Id: 201061 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7300:bc8a:b0:106:860b:bbdd with SMTP id dn10csp1372650dyb; Wed, 14 Feb 2024 09:24:21 -0800 (PST) X-Forwarded-Encrypted: i=3; AJvYcCWqstLxq3y8BeXt9LCPU6feXMt6J+rZpeH+iNxhuwipS+/5EoQuy6rNdS/XwrpbT57+kc0eFCfjNphOCo0XRp0+4EHqiw== X-Google-Smtp-Source: AGHT+IHzVk1jfHdYuoK0mkoPM0t6CvFwtexGi3wVJ2rWNMBS4hTA8Faqt6dDxo51B7WCBNgsHVCP X-Received: by 2002:a05:6a00:10c4:b0:6e0:4b8a:7ab7 with SMTP id d4-20020a056a0010c400b006e04b8a7ab7mr3402820pfu.21.1707931461158; Wed, 14 Feb 2024 09:24:21 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1707931461; cv=pass; d=google.com; s=arc-20160816; b=bghKA+kCCzpdr86AjsEkQX0CUDFfQO4ZuJbftlqJj935iuIYMIS8LkLWvbekDL81Kn 0eWwLdqQHd4r2YH4SSKDS72eWnGGODOG8wppOCyMEf3Y13NzgEms1WY5HS6ezxZ8zBr2 IbZJNuDAkVNwG0YAYvH4teYEqWr642Xea2Iw57N3R1RoddOQzBLbEe87xEghdUwmjm7/ LAZrgDJmZ2Dj7OOzacyuyDHjOQmuAvMdVaSaHjTHDXX7nHocpaHxHgxc/GAzRMv3h1em njGdNeMigXUcUg0A5h8Zg9K0pIWf3Mx0iQgH1bqjj4k0dAAs4Sku3pwGxGHI/sOkV4KM Pb/w== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:list-unsubscribe:list-subscribe:list-id:precedence :subject:date:from:dkim-signature; bh=O+DKMbL72Lr/atMAqah+aNJPLbCQ5KsP8qCtCuX8JQQ=; fh=PWWiX/ypFtRpBJmIB+F+kg0+f+0YwqmgG96dIadx2ho=; b=mBhfrwdwdcOijdKpthe0UKQgIw4V2G8axcQC1oz75GKNTEO+Vd1IOc6yFx83CxGNPo rtbD39/AsX8P4QQcvmRUZR4Ji76mO8eGZSWpVqZaRMkTeYj1KckDEDLjSbKTlPLRcImh q2/lqAaQz50RM74ihSb5jjcDkMPqHzAbfcPA+UVz9r21XhxQxeRPHYgUaE+BFVHzHrI2 5KvNVuI9AIxl+Yv0r+Vt8B8kbwMxQCtDChLbtTG44cF9VRrXqynnKwcoGY4VmorKdEyX TuGC/PzuO3eFUoviDWRESJKAd19XwDcw/YvXGz8JXcCbsGjh1iReViWRNxaJ6fEeJy3M l0Yg==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=tV2C0zJw; arc=pass (i=1 dkim=pass dkdomain=kernel.org); spf=pass (google.com: domain of linux-kernel+bounces-65645-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-65645-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org X-Forwarded-Encrypted: i=2; AJvYcCUzc+k0X5mgjweqM6jDF8QXrdoeJXEEXBaEZEwn4hNTN9j9/Xjd4qOZAV/gNAHjRPZ30bETuIsK+fnjasWXS4oePCy1+w== Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [2604:1380:45e3:2400::1]) by mx.google.com with ESMTPS id x7-20020a656aa7000000b005dc962cfb59si1058645pgu.350.2024.02.14.09.24.21 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 14 Feb 2024 09:24:21 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-65645-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) client-ip=2604:1380:45e3:2400::1; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=tV2C0zJw; arc=pass (i=1 dkim=pass dkdomain=kernel.org); spf=pass (google.com: domain of linux-kernel+bounces-65645-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-65645-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sv.mirrors.kernel.org (Postfix) with ESMTPS id 269C1290A14 for ; Wed, 14 Feb 2024 17:22:09 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 38763126F06; Wed, 14 Feb 2024 17:19:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="tV2C0zJw" Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4EE957C6C9; Wed, 14 Feb 2024 17:19:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1707931172; cv=none; b=ZSOQqQa+qaRzBepbepLi/rMt05TULqC+wRON8HCJSIYqNtgpkaDBGRqBWwGZgX/WguN74q52H0u5K49hCHPfjjuNev1ExEoq8Qkc4tzKjsXNUnc+VKHEdV+MbocfGJf19U+3YJflGB57+AGhZZdW0utw96lWOmcRvqp31m6vJXw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1707931172; c=relaxed/simple; bh=115krBgQOqzJZjZdyNNKcB5U5M5YB6JFsKKfrcL2Tvk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=YfIjtd26p2DcINGL7Nn+YDqGf86UbIp0KfCA5JqOaQKQJ4FiAahq88wOh40jxupMaNOJ+/TB5BeafMsb8dJgpGf2zTA3af+kxhuGakuOAWkbQmSwt9/SLlR8Muw8m2ihx4dx9fvOeTYGnuLQQIsDMxvwW+PDmNFj/h5lH0GLeZs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=tV2C0zJw; arc=none smtp.client-ip=10.30.226.201 Received: by smtp.kernel.org (Postfix) with ESMTPSA id C93A6C433B2; Wed, 14 Feb 2024 17:19:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1707931170; bh=115krBgQOqzJZjZdyNNKcB5U5M5YB6JFsKKfrcL2Tvk=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=tV2C0zJwTuTSLaaG+ibFTQEDbUerBwpdbMCakLK4kbhIKY9skMvvrh8rMYRE28X/g /TLbNt+/B5WuExuxiest5LVVW55VcISiGfB/MlJkxTbd7yce1NSXYfrVmPOsF2GHx0 AuwSNdEyKDbYtpbHYBpXmlfz/ZudSiTrTrFbAcvuw2OiBm5SzYF7ugrNRmW9F9ztkP LgwCphHsFwUeePAxMvBLFeYb7K4yF6ZvBZLrFHhF9l/h/MH3VwDmKjuPVUbhuT3N71 vgW/NdOpf+UJ+OOiLZvLG3KpVWlZL9TtNWxsvjfeOgu9P15wc726409Evv8opz15N+ 0ONM4l8iMKB/A== From: Benjamin Tissoires Date: Wed, 14 Feb 2024 18:18:36 +0100 Subject: [PATCH RFC bpf-next v2 07/10] HID: bpf: allow to inject HID event from BPF Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20240214-hid-bpf-sleepable-v2-7-5756b054724d@kernel.org> References: <20240214-hid-bpf-sleepable-v2-0-5756b054724d@kernel.org> In-Reply-To: <20240214-hid-bpf-sleepable-v2-0-5756b054724d@kernel.org> To: Alexei Starovoitov , Daniel Borkmann , John Fastabend , Andrii Nakryiko , Martin KaFai Lau , Eduard Zingerman , Song Liu , Yonghong Song , KP Singh , Stanislav Fomichev , Hao Luo , Jiri Olsa , Jiri Kosina , Benjamin Tissoires , Jonathan Corbet , Shuah Khan Cc: bpf@vger.kernel.org, linux-kernel@vger.kernel.org, linux-input@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, Benjamin Tissoires X-Mailer: b4 0.12.4 X-Developer-Signature: v=1; a=ed25519-sha256; t=1707931135; l=4122; i=bentiss@kernel.org; s=20230215; h=from:subject:message-id; bh=115krBgQOqzJZjZdyNNKcB5U5M5YB6JFsKKfrcL2Tvk=; b=HVw4zRUildvxD5pMQxd9fTMjiDfEZoxXyNhUOD6ObQFqlvkdTsNZ/7ssEzYTAyrIovRtJtIlS XmdTpzLivhHAl+AFVwkn15Dy3zT92gNxx4JgV95moDIY7d2x49M6Vhd X-Developer-Key: i=bentiss@kernel.org; a=ed25519; pk=7D1DyAVh6ajCkuUTudt/chMuXWIJHlv2qCsRkIizvFw= X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1790895939951683349 X-GMAIL-MSGID: 1790895939951683349 It can be interesting to inject events from BPF as if the event were to come from the device. For example, some multitouch devices do not all the time send a proximity out event, and we might want to send it for the physical device. Compared to uhid, we can now inject events on any physical device, not just uhid virtual ones. Signed-off-by: Benjamin Tissoires --- no changes in v2 --- Documentation/hid/hid-bpf.rst | 2 +- drivers/hid/bpf/hid_bpf_dispatch.c | 29 +++++++++++++++++++++++++++++ drivers/hid/hid-core.c | 1 + include/linux/hid_bpf.h | 2 ++ 4 files changed, 33 insertions(+), 1 deletion(-) diff --git a/Documentation/hid/hid-bpf.rst b/Documentation/hid/hid-bpf.rst index a575004d9025..0765b3298ecf 100644 --- a/Documentation/hid/hid-bpf.rst +++ b/Documentation/hid/hid-bpf.rst @@ -179,7 +179,7 @@ Available API that can be used in syscall HID-BPF programs: ----------------------------------------------------------- .. kernel-doc:: drivers/hid/bpf/hid_bpf_dispatch.c - :functions: hid_bpf_attach_prog hid_bpf_hw_request hid_bpf_hw_output_report hid_bpf_allocate_context hid_bpf_release_context + :functions: hid_bpf_attach_prog hid_bpf_hw_request hid_bpf_hw_output_report hid_bpf_input_report hid_bpf_allocate_context hid_bpf_release_context General overview of a HID-BPF program ===================================== diff --git a/drivers/hid/bpf/hid_bpf_dispatch.c b/drivers/hid/bpf/hid_bpf_dispatch.c index a5b88b491b80..e1a650f4a626 100644 --- a/drivers/hid/bpf/hid_bpf_dispatch.c +++ b/drivers/hid/bpf/hid_bpf_dispatch.c @@ -508,6 +508,34 @@ hid_bpf_hw_output_report(struct hid_bpf_ctx *ctx, __u8 *buf, size_t buf__sz) kfree(dma_data); return ret; } + +/** + * hid_bpf_input_report - Inject a HID report in the kernel from a HID device + * + * @ctx: the HID-BPF context previously allocated in hid_bpf_allocate_context() + * @type: the type of the report (%HID_INPUT_REPORT, %HID_FEATURE_REPORT, %HID_OUTPUT_REPORT) + * @buf: a %PTR_TO_MEM buffer + * @buf__sz: the size of the data to transfer + * + * @returns %0 on success, a negative error code otherwise. + */ +__bpf_kfunc int +hid_bpf_input_report(struct hid_bpf_ctx *ctx, enum hid_report_type type, u8 *buf, + const size_t buf__sz) +{ + struct hid_device *hdev; + size_t size = buf__sz; + int ret; + + /* check arguments */ + ret = __hid_bpf_hw_check_params(ctx, buf, &size, type); + if (ret) + return ret; + + hdev = (struct hid_device *)ctx->hid; /* discard const */ + + return hid_input_report(hdev, type, buf, size, 0); +} __bpf_kfunc_end_defs(); /* @@ -542,6 +570,7 @@ BTF_ID_FLAGS(func, hid_bpf_allocate_context, KF_ACQUIRE | KF_RET_NULL) BTF_ID_FLAGS(func, hid_bpf_release_context, KF_RELEASE) BTF_ID_FLAGS(func, hid_bpf_hw_request) BTF_ID_FLAGS(func, hid_bpf_hw_output_report) +BTF_ID_FLAGS(func, hid_bpf_input_report) BTF_KFUNCS_END(hid_bpf_syscall_kfunc_ids) static const struct btf_kfunc_id_set hid_bpf_syscall_kfunc_set = { diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c index 1243595890ba..b1fa0378e8f4 100644 --- a/drivers/hid/hid-core.c +++ b/drivers/hid/hid-core.c @@ -2975,6 +2975,7 @@ static struct hid_bpf_ops hid_ops = { .hid_get_report = hid_get_report, .hid_hw_raw_request = hid_hw_raw_request, .hid_hw_output_report = hid_hw_output_report, + .hid_input_report = hid_input_report, .owner = THIS_MODULE, .bus_type = &hid_bus_type, }; diff --git a/include/linux/hid_bpf.h b/include/linux/hid_bpf.h index 5c7ff93dc73e..17b08f500098 100644 --- a/include/linux/hid_bpf.h +++ b/include/linux/hid_bpf.h @@ -104,6 +104,8 @@ struct hid_bpf_ops { size_t len, enum hid_report_type rtype, enum hid_class_request reqtype); int (*hid_hw_output_report)(struct hid_device *hdev, __u8 *buf, size_t len); + int (*hid_input_report)(struct hid_device *hid, enum hid_report_type type, + u8 *data, u32 size, int interrupt); struct module *owner; const struct bus_type *bus_type; };