From patchwork Mon Jul 1 06:05:49 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Torokhov X-Patchwork-Id: 13717573 Received: from mail-pl1-f177.google.com (mail-pl1-f177.google.com [209.85.214.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9E90142056; Mon, 1 Jul 2024 06:06:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1719813966; cv=none; b=aiuJQBXpTgVUCGWBTBrhutMxXOUfG5z4XupHIMPpetcmgeSEURNbjVR9KJ+i0WrcvrZWY/RkzBFeSIEQLjTFy7qbRR1zRV/80FjjYv72DheYotiQ2OK+f5PEDMazt+FXRTaiKfId6WRHWxWCrS6IKXX1gWD0LtVJ+ObxJRBKDm4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1719813966; c=relaxed/simple; bh=gE4srvRTq4uMOziw6LpIXybIaA+YogFBoel+P4KrXFc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=MvsE8gMBUKMro4XcBRDcU+xnaCLmrGKmZOwKijEOVdwA//y8CohUObERSh+WcSuhnYGQPh3T4HVRE6Pol5seDl0uvMe8LltDCItzMQI2QK8U8MZMG1Q0gHEpg0rpMlnhvrnx7vGeMPJaykw0TWbHBbSdJojCVxUvr6k7tVpUysM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=M+I7wuL6; arc=none smtp.client-ip=209.85.214.177 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="M+I7wuL6" Received: by mail-pl1-f177.google.com with SMTP id d9443c01a7336-1f8395a530dso9676925ad.0; Sun, 30 Jun 2024 23:06:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1719813965; x=1720418765; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=/rr5LgW7b41WmKRKWDxksz++aJz2iH/cDfPQ5g0Teqo=; b=M+I7wuL6nKLCN14sgu/IreKFlhWZhQO7UUTLvK7+3/WhpfaEtS1MWrMILhIWvtjXTV k037dTvdW91+EEMI9Nvbuc4sOzpVfIcpVcgapCkLhf7dgLCTspQdjJ2HRYKaxMR1sBGD raP4XKeN+z2IWuqKd5IZcEW3RSZobOLW56j9A3meZb63iHCvvPHPPcUnsZx3HzM825k6 0lc1L9b3SEBrfVqKeQHp+eQACgahMkYLfBt6ARnt9fmdQSV1pdurOtyfKTgdOy9bLD1m WdypHJBkMo025x9kbk8KCYigfx0w5YAUoIUWgJlcpT8qIBTXJaDrqxArSOzV9zvKrUjR qVTg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1719813965; x=1720418765; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=/rr5LgW7b41WmKRKWDxksz++aJz2iH/cDfPQ5g0Teqo=; b=W6VU6mjGcGaMbHENmGv+r3UwhaD/W8Y1JujJALmiz/P+qLtx2zRLVDHmc/Uy2IUWlI 2gZqkYX1lMUNu3S4NOjZ7nvsZGeXGUMdwK6lkPI0//lYJX+omPOPka/1usN6kWZmmCHD 4KivWPraHulvPvJ7qY0GOesC+Eqapb6mAjC/jKB50I4HBXsHHtao5IHWTqPnYfrokMV7 LFQcjN211kAkQPVQY3cWY3l0tsEaEAPW9yak3PobGe5jugpwzwdtfm25TdfrKZgxAoY0 XFb75aZ8DXUdA7V2bAoiHYHYSbL4JjLLd5rVrZtGPJFZxVMinhq43kNFr/aftzoHSwqt v6wQ== X-Forwarded-Encrypted: i=1; AJvYcCUZ3mGrNJPFug2vI8AzrLDhj8OJGCUws2J1lD9jOt5kVN5zCsGzcyvimvuXgI/KdFGlEhLCwhnAhWNonw+qa9se5RidM4uBnmgbeN5R X-Gm-Message-State: AOJu0YwYxmi/8OUHPFuHClxj2gXyzFTKO/d1uRoKwThrjOO6anWo57XD VTm8h1+iDH4KbjhnfWF5DR8CCXYycnSKETN+16RyEdEATZ0XRJ5Xr2gr6Q== X-Google-Smtp-Source: AGHT+IHKtRt0IZvPSVkDmGcYwtIXVcO+j/Q3xXny3MuW5Vse/pGTgH3D0zXcO3fLQ7oMm7lHyw/Ong== X-Received: by 2002:a17:903:32cd:b0:1f6:a606:539e with SMTP id d9443c01a7336-1fadbd0b200mr26857885ad.61.1719813964517; Sun, 30 Jun 2024 23:06:04 -0700 (PDT) Received: from dtor-ws.sjc.corp.google.com ([2620:15c:9d:2:7783:69e6:8487:f6ab]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-1fad304311csm44588205ad.31.2024.06.30.23.06.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 30 Jun 2024 23:06:03 -0700 (PDT) From: Dmitry Torokhov To: linux-input@vger.kernel.org Cc: Benjamin Tissoires , Jeff LaBundy , linux-kernel@vger.kernel.org Subject: [PATCH 1/4] Input: make sure input handlers define only one processing method Date: Sun, 30 Jun 2024 23:05:49 -0700 Message-ID: <20240701060553.869989-2-dmitry.torokhov@gmail.com> X-Mailer: git-send-email 2.45.2.803.g4e1b14247a-goog In-Reply-To: <20240701060553.869989-1-dmitry.torokhov@gmail.com> References: <20240701060553.869989-1-dmitry.torokhov@gmail.com> Precedence: bulk X-Mailing-List: linux-input@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Input core expects input handlers to be either filters, or regular handlers, but not both. Additionally, for regular handlers it does not make sense to define both single event method and batch method. Refuse registering handler if it defines more than one method. Signed-off-by: Dmitry Torokhov --- drivers/input/input.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/drivers/input/input.c b/drivers/input/input.c index fd4997ba263c..8434348faeac 100644 --- a/drivers/input/input.c +++ b/drivers/input/input.c @@ -2517,6 +2517,26 @@ void input_unregister_device(struct input_dev *dev) } EXPORT_SYMBOL(input_unregister_device); +static int input_handler_check_methods(const struct input_handler *handler) +{ + int count = 0; + + if (handler->filter) + count++; + if (handler->events) + count++; + if (handler->event) + count++; + + if (count != 1) { + pr_err("%s: only one event processing method should be defined (%s)\n", + __func__, handler->name); + return -EINVAL; + } + + return 0; +} + /** * input_register_handler - register a new input handler * @handler: handler to be registered @@ -2530,6 +2550,10 @@ int input_register_handler(struct input_handler *handler) struct input_dev *dev; int error; + error = input_handler_check_methods(handler); + if (error) + return error; + error = mutex_lock_interruptible(&input_mutex); if (error) return error; From patchwork Mon Jul 1 06:05:50 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Torokhov X-Patchwork-Id: 13717574 Received: from mail-pl1-f178.google.com (mail-pl1-f178.google.com [209.85.214.178]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9D14D4D8C0; Mon, 1 Jul 2024 06:06:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.178 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1719813967; cv=none; b=Efp8h56cX+5rCLVYLDuRA7ZpT/20Rcgdl0cpbD+iipIY+kAaKXjPjE0pWClrCighRhGLVEAEScFZXPZAVV+nJ8NH+Ok2AJnS2Dr1HIweSk2g5tqdIpI648VVWndfK07RNhbJtfSVT+h0ERG5+abCV9FtVyXBVTTIbq52e3Y6jcY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1719813967; c=relaxed/simple; bh=JgsF10WXr45ZFGxgPnan+aUzgO01DqbfpNA5QUVXiFA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=C919qED7gz8zvnhZsuc6CvurxY22XVwrVp/N+IDnvPOJwcsZoSKjfli06RLKea7Mx4CrUoGordjANarKPyef073qFKIkDVrVgii+lleCcrkN0+374Obv7Jz8Sm/+DSTfgka+qqo5RoMetF2i1KzT78UErDvID0QI+qRqpj5h/+4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=CtwDfDxJ; arc=none smtp.client-ip=209.85.214.178 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="CtwDfDxJ" Received: by mail-pl1-f178.google.com with SMTP id d9443c01a7336-1faad409ca7so22740015ad.1; Sun, 30 Jun 2024 23:06:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1719813966; x=1720418766; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=lpqmtMTRuzoNPgBgmA0S+dAHbwI2sOJM4aEZFctXUR4=; b=CtwDfDxJo+7WnTraBsS0HP4gNAvA+Tp9KfY5cRAWO/8YqfYn+nSvexFqsDuLy9jlh3 9UU4n5oasYzrooxinp4akQV14MVuHQdMt321y7Qqeg/DCR89bo79C0M3iz5mCXcfjOGh yaTcoOUcFX8+EYnVQdVt2J4ZW06NKWUma/PARkjn8Yq0tfp0JrEtjVVaGmKhCkGgxIQp GtdOWBwkWCpj+RKBnkFJ/nMUbP1ViWGa6S2OxEwAzwO7Xk/Ho7Pqt24reGhBtC48hif/ UO1UV9W0OXwA/O6UToRVHwQmPf9y3lbQOv3LezXrWYwp5aIoHiLOUf6c5FirqzH1qSyx fp5g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1719813966; x=1720418766; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=lpqmtMTRuzoNPgBgmA0S+dAHbwI2sOJM4aEZFctXUR4=; b=RQJ8YhdLtIT8JUf1+h6D+3MSMKcQ7akm/4hdfL1ODkF3bx2BGNkZ9NhDI1D3u041Uk AOYm2JmmzO9DoxgRw2N7CjwGqmvkzyjaYxIGJA+fDZH1Ir7eapFbZ4eWPcqK6IHn2AhQ DRBjIyOFyqbQWKgWz4zbArDfiCiuEjOey3YRAyusovrbSZmAJIdeulZAm9G2asaHDXAr xouYQWyDBM/OxxcN5+Tk0Z3IGQOMrzsW9Cfikmqmt5oVZoP6Esi7MnJRqy0JifdfnQpd oy8fPlCqeZYShKmNpHpyGkf8h5ABpdfP2wTK2EX1ZQ1RqUq6g2yQZ87ekdJ5+EWn01XO 9kNQ== X-Forwarded-Encrypted: i=1; AJvYcCXlgfk1Cn99atVbYUEKQXy7z5327uRm79JG+EoIKio0F7xW1fRJcqHX/Kd7hkONC7IRgJR1VcVU/sUJLmuNZrPPMdjy5kXW5qDpzsgO X-Gm-Message-State: AOJu0Yxr+YjLOfCgVFAdXPmJ1/Lgj2m15GM8iL4qHSM/YaW6yKiiVHH+ 4RK2m1onJXe0ZDU3wFoBCqdU3tQRs8jk+egBZjdEsq7rincaPf+A/DfggQ== X-Google-Smtp-Source: AGHT+IHamhi81jjbjPM5yjaBTRHjvwrq6ew03U/D6xreb1Pwhu4AwSBpH+BVADFuYBm6syMXx3YZ4g== X-Received: by 2002:a17:902:f688:b0:1f9:f6e6:5ada with SMTP id d9443c01a7336-1fac7eec818mr130491065ad.22.1719813965719; Sun, 30 Jun 2024 23:06:05 -0700 (PDT) Received: from dtor-ws.sjc.corp.google.com ([2620:15c:9d:2:7783:69e6:8487:f6ab]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-1fad304311csm44588205ad.31.2024.06.30.23.06.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 30 Jun 2024 23:06:05 -0700 (PDT) From: Dmitry Torokhov To: linux-input@vger.kernel.org Cc: Benjamin Tissoires , Jeff LaBundy , linux-kernel@vger.kernel.org Subject: [PATCH 2/4] Input: make events() method return number of events processed Date: Sun, 30 Jun 2024 23:05:50 -0700 Message-ID: <20240701060553.869989-3-dmitry.torokhov@gmail.com> X-Mailer: git-send-email 2.45.2.803.g4e1b14247a-goog In-Reply-To: <20240701060553.869989-1-dmitry.torokhov@gmail.com> References: <20240701060553.869989-1-dmitry.torokhov@gmail.com> Precedence: bulk X-Mailing-List: linux-input@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 In preparation to consolidating filtering and event processing in the input core change events() method to return number of events processed by it. Signed-off-by: Dmitry Torokhov Reviewed-by: Benjamin Tissoires --- drivers/input/evdev.c | 6 ++++-- include/linux/input.h | 7 ++++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/drivers/input/evdev.c b/drivers/input/evdev.c index 51e0c4954600..c8eca8cdb976 100644 --- a/drivers/input/evdev.c +++ b/drivers/input/evdev.c @@ -288,8 +288,8 @@ static void evdev_pass_values(struct evdev_client *client, /* * Pass incoming events to all connected clients. */ -static void evdev_events(struct input_handle *handle, - const struct input_value *vals, unsigned int count) +static unsigned int evdev_events(struct input_handle *handle, + struct input_value *vals, unsigned int count) { struct evdev *evdev = handle->private; struct evdev_client *client; @@ -306,6 +306,8 @@ static void evdev_events(struct input_handle *handle, evdev_pass_values(client, vals, count, ev_time); rcu_read_unlock(); + + return count; } /* diff --git a/include/linux/input.h b/include/linux/input.h index c22ac465254b..89a0be6ee0e2 100644 --- a/include/linux/input.h +++ b/include/linux/input.h @@ -275,7 +275,8 @@ struct input_handle; * it may not sleep * @events: event sequence handler. This method is being called by * input core with interrupts disabled and dev->event_lock - * spinlock held and so it may not sleep + * spinlock held and so it may not sleep. The method must return + * number of events passed to it. * @filter: similar to @event; separates normal event handlers from * "filters". * @match: called after comparing device's id with handler's id_table @@ -312,8 +313,8 @@ struct input_handler { void *private; void (*event)(struct input_handle *handle, unsigned int type, unsigned int code, int value); - void (*events)(struct input_handle *handle, - const struct input_value *vals, unsigned int count); + unsigned int (*events)(struct input_handle *handle, + struct input_value *vals, unsigned int count); bool (*filter)(struct input_handle *handle, unsigned int type, unsigned int code, int value); bool (*match)(struct input_handler *handler, struct input_dev *dev); int (*connect)(struct input_handler *handler, struct input_dev *dev, const struct input_device_id *id); From patchwork Mon Jul 1 06:05:51 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Torokhov X-Patchwork-Id: 13717575 Received: from mail-pf1-f181.google.com (mail-pf1-f181.google.com [209.85.210.181]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DBAAA57C8D; Mon, 1 Jul 2024 06:06:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.181 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1719813969; cv=none; b=G3FjCTYbeZ0hL4TgA9ozTBLW/znpaOwduIRq8EsQgiVc0qokIc8TruKuz3KxMu7xx069b1e0LTZvjqWAHR5NhHxngdDqVuw6V4MwGQQ8WRlDQ/2UrppEEI7b+luYKu1vZIPiHnBfFkb86BLQ3evlg2iq1toncUddE8yCSNKHtPc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1719813969; c=relaxed/simple; bh=GHguZZLZw97oK/tMyhuJnePfemI4Sonaez15KjSgGgk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=DH1q3WqBSIxpvDm+lb1e+Q2bHaSRzebzpXGRQbKYKwlVEN8nVwnGKWMEdoAtC8bOZ77buf1gaQhsZCfwMKwaHtQ052QMUXhQnQ0GhHL9WObeVP2GRMEwjUILp1o4xBmiS+MEOsH1X4YlptzBZxrotirzpAL4TV7OTs1CO8qtzww= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=SzWK0CtR; arc=none smtp.client-ip=209.85.210.181 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="SzWK0CtR" Received: by mail-pf1-f181.google.com with SMTP id d2e1a72fcca58-706627ff48dso1833879b3a.1; Sun, 30 Jun 2024 23:06:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1719813967; x=1720418767; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=0ENd3iWts9E5sWcDevFainVuokL7jAhtRNlUwZiapko=; b=SzWK0CtRtPzI77yJYA9czHjC7oKkFAK9Y3/7x37nWCPH3BLAuhH6Dj1DljTByfnuJ4 SOnhP5ddCpgHK22XPHDMWz49LJWlXzwdE8eORwczKBD2qINwQeSnK8lC1VDBEELucmkF EMncnQ8jun/6rq8JUtQDDqkxq3nfuXXdyGDBSvO3ccmCl1N+8rUYwq8f5qTEc8xmok8n eCqooYgDsTHpmWNKBAtXMnICNzMapBEOtb52hQBqi8X2LjrTdtbBI60zkSsnLpJKzxn6 bL5VMKVbNLuUDtOOcrWuXoo15w0iXzoNbRrJf8jVv1kRRxuD99JCzDxsZHXHFSl+Uieh qJSg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1719813967; x=1720418767; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=0ENd3iWts9E5sWcDevFainVuokL7jAhtRNlUwZiapko=; b=lJcQn4DgKiN3uqZRLZkh2xOZKWzEHuXOfp30teXYn+pBde49gh3uTzzMSZj5Ozxz0e w5cah0VSxwqaEajZrY2p3lH5qTgqQdS47AUFoT8YEDq5nV6j7PAuu/4m8FajKPOO8ELp 0fjxTzaA+TmeHijgHLRxgwv/Oss9LOr85PDq3vqG1uuI98E2KmuVKMf5XmMepJtKLJcu s1o2C+CKEKrMqlHgZJWtl3Q7ye6Ayw/nKOzfhjjQu/pFOm513INxtWWWqXvdWL0lyl+0 YbsLUosbm5SedG8wF2p915JkSNZijUdcLwsJ5AHGmDtIFBxLUxidDDmcagsxb7KBMUXR 5zYw== X-Forwarded-Encrypted: i=1; AJvYcCXJ9u5rp99UIKUtmjkICa91DKDZrsI9QsLS+uT1xgi9QIE4fjJam9EDROfQ/gYPBuQinSE+w1LF1sXG92eYC9Df9F0KzwC3JuFt05cz X-Gm-Message-State: AOJu0YykgsQZqqhGyY6Qo7mRRF94Sw1DV04hOB8LjVZAE6S83+8Dz13z vEprov33EC5yZF9RLTCAKNtVCoG2ON1LeTDg0cYGmpsFxe+fgVRWNoYaaQ== X-Google-Smtp-Source: AGHT+IHpxwEYtCEov+1Xu9Ejied7dJGEytl3yxzOxHkBJqgSOFzDj/Z7p09gLr2IBbXMx5H89FMlgA== X-Received: by 2002:a05:6a21:193:b0:1be:c62f:13ec with SMTP id adf61e73a8af0-1bef6109db7mr8502817637.18.1719813966748; Sun, 30 Jun 2024 23:06:06 -0700 (PDT) Received: from dtor-ws.sjc.corp.google.com ([2620:15c:9d:2:7783:69e6:8487:f6ab]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-1fad304311csm44588205ad.31.2024.06.30.23.06.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 30 Jun 2024 23:06:06 -0700 (PDT) From: Dmitry Torokhov To: linux-input@vger.kernel.org Cc: Benjamin Tissoires , Jeff LaBundy , linux-kernel@vger.kernel.org Subject: [PATCH 3/4] Input: simplify event handling logic Date: Sun, 30 Jun 2024 23:05:51 -0700 Message-ID: <20240701060553.869989-4-dmitry.torokhov@gmail.com> X-Mailer: git-send-email 2.45.2.803.g4e1b14247a-goog In-Reply-To: <20240701060553.869989-1-dmitry.torokhov@gmail.com> References: <20240701060553.869989-1-dmitry.torokhov@gmail.com> Precedence: bulk X-Mailing-List: linux-input@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Streamline event handling code by providing batch implementations for filtering and event processing and using them in place of the main event handler, as needed, instead of having complex branching logic in the middle of the event processing code. Signed-off-by: Dmitry Torokhov Reviewed-by: Benjamin Tissoires --- drivers/input/input.c | 90 ++++++++++++++++++++++++------------------- 1 file changed, 51 insertions(+), 39 deletions(-) diff --git a/drivers/input/input.c b/drivers/input/input.c index 8434348faeac..eeb755cb12e7 100644 --- a/drivers/input/input.c +++ b/drivers/input/input.c @@ -99,41 +99,6 @@ static void input_stop_autorepeat(struct input_dev *dev) del_timer(&dev->timer); } -/* - * Pass event first through all filters and then, if event has not been - * filtered out, through all open handles. This function is called with - * dev->event_lock held and interrupts disabled. - */ -static unsigned int input_to_handler(struct input_handle *handle, - struct input_value *vals, unsigned int count) -{ - struct input_handler *handler = handle->handler; - struct input_value *end = vals; - struct input_value *v; - - if (handler->filter) { - for (v = vals; v != vals + count; v++) { - if (handler->filter(handle, v->type, v->code, v->value)) - continue; - if (end != v) - *end = *v; - end++; - } - count = end - vals; - } - - if (!count) - return 0; - - if (handler->events) - handler->events(handle, vals, count); - else if (handler->event) - for (v = vals; v != vals + count; v++) - handler->event(handle, v->type, v->code, v->value); - - return count; -} - /* * Pass values first through all filters and then, if event has not been * filtered out, through all open handles. This function is called with @@ -154,11 +119,12 @@ static void input_pass_values(struct input_dev *dev, handle = rcu_dereference(dev->grab); if (handle) { - count = input_to_handler(handle, vals, count); + count = handle->handler->events(handle, vals, count); } else { list_for_each_entry_rcu(handle, &dev->h_list, d_node) if (handle->open) { - count = input_to_handler(handle, vals, count); + count = handle->handler->events(handle, vals, + count); if (!count) break; } @@ -2537,6 +2503,47 @@ static int input_handler_check_methods(const struct input_handler *handler) return 0; } +/* + * An implementation of input_handler's events() method that simply + * invokes handler->event() method for each event one by one. + */ +static unsigned int input_handler_events_default(struct input_handle *handle, + struct input_value *vals, + unsigned int count) +{ + struct input_handler *handler = handle->handler; + struct input_value *v; + + for (v = vals; v != vals + count; v++) + handler->event(handle, v->type, v->code, v->value); + + return count; +} + +/* + * An implementation of input_handler's events() method that invokes + * handler->filter() method for each event one by one and removes events + * that were filtered out from the "vals" array. + */ +static unsigned int input_handler_events_filter(struct input_handle *handle, + struct input_value *vals, + unsigned int count) +{ + struct input_handler *handler = handle->handler; + struct input_value *end = vals; + struct input_value *v; + + for (v = vals; v != vals + count; v++) { + if (handler->filter(handle, v->type, v->code, v->value)) + continue; + if (end != v) + *end = *v; + end++; + } + + return end - vals; +} + /** * input_register_handler - register a new input handler * @handler: handler to be registered @@ -2554,12 +2561,17 @@ int input_register_handler(struct input_handler *handler) if (error) return error; + INIT_LIST_HEAD(&handler->h_list); + + if (handler->filter) + handler->events = input_handler_events_filter; + else if (handler->event) + handler->events = input_handler_events_default; + error = mutex_lock_interruptible(&input_mutex); if (error) return error; - INIT_LIST_HEAD(&handler->h_list); - list_add_tail(&handler->node, &input_handler_list); list_for_each_entry(dev, &input_dev_list, node) From patchwork Mon Jul 1 06:05:52 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Torokhov X-Patchwork-Id: 13717576 Received: from mail-pl1-f171.google.com (mail-pl1-f171.google.com [209.85.214.171]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2AE8878C84; Mon, 1 Jul 2024 06:06:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1719813971; cv=none; b=etlcOIOZz1CeMYwhiLpg8iLjqUK4Wnc9qCPePr/91sKfnOG4C/YFHW8J9txKTGdsYxk1j/5WKvA/RlGCiN2M4ZtSYt3bUkrI+lGEiP7sxros2qeYiT3i37J6xksbQ7vwIjcrH5huWxgx4M2WZB+Ft8jWuQr65MabBeCOYaDBp24= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1719813971; c=relaxed/simple; bh=5Ov3xhl7a3MciO7T5L90lpaI7/f9++PrLfZIIrGutFs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=PpLflDQAsEP+csjzHdy0AnPkhTeqpLlLoPe1Xmjr4TfhyehuOH3Bet9rQxmk6Cl4rcKj2DLpi8FRaR7rQSc8r/YA1jD/Q+3eN5gbUO7GxM8eP8/HRN3j35vufMYM8zn/AXABHBmQj015gCmaoXg6Fy+eDgWpavSkpxOgfYwVSTQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=CB8AQtZ7; arc=none smtp.client-ip=209.85.214.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="CB8AQtZ7" Received: by mail-pl1-f171.google.com with SMTP id d9443c01a7336-1f9e2affc8cso14056835ad.2; Sun, 30 Jun 2024 23:06:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1719813969; x=1720418769; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=9nhPcyqnl79AzLZ7it3TCiWLlmrHTFsaC4jGYPqN0fI=; b=CB8AQtZ7DaacT18iFCeujFr1Kzbb9yYmfsyK6TjA/CViHACdXtyni6AiPPDqycoTBX jEOpotn+q9fdNPLHSM0/czM5RbqCeJesZzTfwH0ZsGfpalOgQVl5ycReZPZax62JaShE 4UPvaAG7Xsi5etXpMPCzbnI9lPx9tEuM8hJrPUiI6+h6hq7ZHmKTekZrcfCAu+K2wp/J oIVnAOzVmc5agV8MXWbrowqraYb5/Tp668bRL+hqUShl2LRVrMl1/rpaK5mNhqQyeJoS XcQP5ikQC/Dp+Jx8UbQEXGDcKtOVW+NSWGkNDdObAin/dovuPLuJIMHECD5T3VcnVmW1 vbVw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1719813969; x=1720418769; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=9nhPcyqnl79AzLZ7it3TCiWLlmrHTFsaC4jGYPqN0fI=; b=WcrcgZ8/O+pOpevpiJzdpz0aXlcJGAQ7Fe4Pda1l9ekmxiBRt4uslT5TCrU5yXqu0d UX18darEP4ZmPLt00iRG0Fl03yoR6fTSzLSXLm64Mc9PkLt6D90EEShHo380hv4E5IuU 0cyj69mWwAliWsLwFyJef3FZQnvIjEuWioVNM6mlfjEkNHWklotfEGToKYDuTN84Z0Jv 95gXAg6CPNkMlB0ghMYFztl+PBfBNq1wE7hwsoXFOYpW7DgQYwmjOqC7/l4I7gyzU5lr b61aX6RkyAFGvF4QIgbAh3QAFshCUCSo2naTWeKQw+AC5v212JF+0U7tBqNmECxWiVZq Y51Q== X-Forwarded-Encrypted: i=1; AJvYcCXSJuP3+I0tBCxy4kwbz/AUowesHYdO7Q5ZIFQDSBy31iO3PELMptPwMYRNmObybxaUKZGidmm9f01XojhB8PEK0nknANgfJ8v/T3VS X-Gm-Message-State: AOJu0YwrslSRmt1PS0ANTov8sErj3eUm0lcL2aZ1nV/76DM3hDr5uGM3 l5nltj6sEpQmjPZY12ZBmN/Mn+BkSVV8yD2TwomuSBS3auXYqU188VvtFg== X-Google-Smtp-Source: AGHT+IEBe6okwdlbG3pqvHVTbtq7wuEBMU0veXpP8lACPMnMNrQs9MPrXVEdvJadG04SABmVbObYsw== X-Received: by 2002:a17:903:1cf:b0:1f6:9122:2c2 with SMTP id d9443c01a7336-1fadbc8addfmr25666065ad.15.1719813969138; Sun, 30 Jun 2024 23:06:09 -0700 (PDT) Received: from dtor-ws.sjc.corp.google.com ([2620:15c:9d:2:7783:69e6:8487:f6ab]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-1fad304311csm44588205ad.31.2024.06.30.23.06.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 30 Jun 2024 23:06:07 -0700 (PDT) From: Dmitry Torokhov To: linux-input@vger.kernel.org Cc: Benjamin Tissoires , Jeff LaBundy , linux-kernel@vger.kernel.org Subject: [PATCH 4/4] Input: preallocate memory to hold event values Date: Sun, 30 Jun 2024 23:05:52 -0700 Message-ID: <20240701060553.869989-5-dmitry.torokhov@gmail.com> X-Mailer: git-send-email 2.45.2.803.g4e1b14247a-goog In-Reply-To: <20240701060553.869989-1-dmitry.torokhov@gmail.com> References: <20240701060553.869989-1-dmitry.torokhov@gmail.com> Precedence: bulk X-Mailing-List: linux-input@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Preallocate memory for holding event values (input_dev->vals) so that there is no need to check if it was allocated or not in the event processing code. The amount of memory will be adjusted after input device has been fully set up upon registering device with the input core. Signed-off-by: Dmitry Torokhov --- drivers/input/input.c | 98 ++++++++++++++++++++++++++++--------------- 1 file changed, 64 insertions(+), 34 deletions(-) diff --git a/drivers/input/input.c b/drivers/input/input.c index eeb755cb12e7..b65b645d9478 100644 --- a/drivers/input/input.c +++ b/drivers/input/input.c @@ -112,9 +112,6 @@ static void input_pass_values(struct input_dev *dev, lockdep_assert_held(&dev->event_lock); - if (!count) - return; - rcu_read_lock(); handle = rcu_dereference(dev->grab); @@ -320,9 +317,6 @@ static void input_event_dispose(struct input_dev *dev, int disposition, if ((disposition & INPUT_PASS_TO_DEVICE) && dev->event) dev->event(dev, type, code, value); - if (!dev->vals) - return; - if (disposition & INPUT_PASS_TO_HANDLERS) { struct input_value *v; @@ -1979,22 +1973,41 @@ struct input_dev *input_allocate_device(void) struct input_dev *dev; dev = kzalloc(sizeof(*dev), GFP_KERNEL); - if (dev) { - dev->dev.type = &input_dev_type; - dev->dev.class = &input_class; - device_initialize(&dev->dev); - mutex_init(&dev->mutex); - spin_lock_init(&dev->event_lock); - timer_setup(&dev->timer, NULL, 0); - INIT_LIST_HEAD(&dev->h_list); - INIT_LIST_HEAD(&dev->node); - - dev_set_name(&dev->dev, "input%lu", - (unsigned long)atomic_inc_return(&input_no)); - - __module_get(THIS_MODULE); + if (!dev) + return NULL; + + /* + * Start with space for SYN_REPORT + 7 EV_KEY/EV_MSC events + 2 spare, + * see input_estimate_events_per_packet(). We will tune the number + * when we register the device. + */ + dev->max_vals = 10; + dev->vals = kcalloc(dev->max_vals, sizeof(*dev->vals), GFP_KERNEL); + if (!dev->vals) { + kfree(dev); + return NULL; } + mutex_init(&dev->mutex); + spin_lock_init(&dev->event_lock); + timer_setup(&dev->timer, NULL, 0); + INIT_LIST_HEAD(&dev->h_list); + INIT_LIST_HEAD(&dev->node); + + dev->dev.type = &input_dev_type; + dev->dev.class = &input_class; + device_initialize(&dev->dev); + /* + * From this point on we can no longer simply "kfree(dev)", we need + * to use input_free_device() so that device core properly frees its + * resources associated with the input device. + */ + + dev_set_name(&dev->dev, "input%lu", + (unsigned long)atomic_inc_return(&input_no)); + + __module_get(THIS_MODULE); + return dev; } EXPORT_SYMBOL(input_allocate_device); @@ -2334,6 +2347,34 @@ bool input_device_enabled(struct input_dev *dev) } EXPORT_SYMBOL_GPL(input_device_enabled); +static int input_device_tune_vals(struct input_dev *dev) +{ + struct input_value *vals; + unsigned int packet_size; + unsigned int max_vals; + + packet_size = input_estimate_events_per_packet(dev); + if (dev->hint_events_per_packet < packet_size) + dev->hint_events_per_packet = packet_size; + + max_vals = dev->hint_events_per_packet + 2; + if (dev->max_vals >= max_vals) + return 0; + + vals = kcalloc(max_vals, sizeof(*vals), GFP_KERNEL); + if (!vals) + return -ENOMEM; + + spin_lock_irq(&dev->event_lock); + dev->max_vals = max_vals; + swap(dev->vals, vals); + spin_unlock_irq(&dev->event_lock); + + kfree(vals); + + return 0; +} + /** * input_register_device - register device with input core * @dev: device to be registered @@ -2361,7 +2402,6 @@ int input_register_device(struct input_dev *dev) { struct input_devres *devres = NULL; struct input_handler *handler; - unsigned int packet_size; const char *path; int error; @@ -2389,16 +2429,9 @@ int input_register_device(struct input_dev *dev) /* Make sure that bitmasks not mentioned in dev->evbit are clean. */ input_cleanse_bitmasks(dev); - packet_size = input_estimate_events_per_packet(dev); - if (dev->hint_events_per_packet < packet_size) - dev->hint_events_per_packet = packet_size; - - dev->max_vals = dev->hint_events_per_packet + 2; - dev->vals = kcalloc(dev->max_vals, sizeof(*dev->vals), GFP_KERNEL); - if (!dev->vals) { - error = -ENOMEM; + error = input_device_tune_vals(dev); + if (error) goto err_devres_free; - } /* * If delay and period are pre-set by the driver, then autorepeating @@ -2418,7 +2451,7 @@ int input_register_device(struct input_dev *dev) error = device_add(&dev->dev); if (error) - goto err_free_vals; + goto err_devres_free; path = kobject_get_path(&dev->dev.kobj, GFP_KERNEL); pr_info("%s as %s\n", @@ -2448,9 +2481,6 @@ int input_register_device(struct input_dev *dev) err_device_del: device_del(&dev->dev); -err_free_vals: - kfree(dev->vals); - dev->vals = NULL; err_devres_free: devres_free(devres); return error;