From: Jeff LaBundy <jeff@labundy.com>
To: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Cc: linux-input@vger.kernel.org,
Benjamin Tissoires <bentiss@kernel.org>,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH v2 6/7] Input: preallocate memory to hold event values
Date: Sun, 7 Jul 2024 14:56:44 -0500 [thread overview]
Message-ID: <Zory/JLaf/Y4/YGD@nixie71> (raw)
In-Reply-To: <20240703213756.3375978-7-dmitry.torokhov@gmail.com>
Hi Dmitry,
On Wed, Jul 03, 2024 at 02:37:53PM -0700, Dmitry Torokhov wrote:
> 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 <dmitry.torokhov@gmail.com>
Reviewed-by: Jeff LaBundy <jeff@labundy.com>
> ---
> drivers/input/input.c | 61 +++++++++++++++++++++++++++++++------------
> 1 file changed, 44 insertions(+), 17 deletions(-)
>
> diff --git a/drivers/input/input.c b/drivers/input/input.c
> index 9981fdfaee9f..4e12fa79883e 100644
> --- a/drivers/input/input.c
> +++ b/drivers/input/input.c
> @@ -323,9 +323,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;
>
> @@ -1985,6 +1982,18 @@ struct input_dev *input_allocate_device(void)
> 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);
> @@ -2344,6 +2353,35 @@ 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);
> +
> + /* Because of swap() above, this frees the old vals memory */
> + kfree(vals);
> +
> + return 0;
> +}
> +
> /**
> * input_register_device - register device with input core
> * @dev: device to be registered
> @@ -2371,7 +2409,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;
>
> @@ -2399,16 +2436,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
> @@ -2428,7 +2458,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",
> @@ -2458,9 +2488,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;
> --
> 2.45.2.803.g4e1b14247a-goog
>
Kind regards,
Jeff LaBundy
next prev parent reply other threads:[~2024-07-07 19:56 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-07-03 21:37 [PATCH v2 0/7] Simplify event handling logic in input core Dmitry Torokhov
2024-07-03 21:37 ` [PATCH v2 1/7] Input: evdev - remove ->event() method Dmitry Torokhov
2024-07-07 19:53 ` Jeff LaBundy
2024-07-03 21:37 ` [PATCH v2 2/7] Input: make sure input handlers define only one processing method Dmitry Torokhov
2024-07-07 19:53 ` Jeff LaBundy
2024-07-03 21:37 ` [PATCH v2 3/7] Input: make events() method return number of events processed Dmitry Torokhov
2024-07-07 19:54 ` Jeff LaBundy
2024-07-03 21:37 ` [PATCH v2 4/7] Input: simplify event handling logic Dmitry Torokhov
2024-07-07 19:55 ` Jeff LaBundy
2024-07-03 21:37 ` [PATCH v2 5/7] Input: rearrange input_alloc_device() to prepare for preallocating of vals Dmitry Torokhov
2024-07-07 19:56 ` Jeff LaBundy
2024-07-03 21:37 ` [PATCH v2 6/7] Input: preallocate memory to hold event values Dmitry Torokhov
2024-07-07 19:56 ` Jeff LaBundy [this message]
2024-07-03 21:37 ` [PATCH v2 7/7] Input: do not check number of events in input_pass_values() Dmitry Torokhov
2024-07-07 19:57 ` Jeff LaBundy
2024-07-04 6:44 ` [PATCH v2 0/7] Simplify event handling logic in input core Benjamin Tissoires
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=Zory/JLaf/Y4/YGD@nixie71 \
--to=jeff@labundy.com \
--cc=bentiss@kernel.org \
--cc=dmitry.torokhov@gmail.com \
--cc=linux-input@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
/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