diff options
author | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2024-07-03 23:37:52 +0200 |
---|---|---|
committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2024-07-09 01:22:49 +0200 |
commit | 3544cf574a577d92111f0b29e6d649b7ea3210ed (patch) | |
tree | 2bf40e3f4338ca3c9cad7d6613de43aca1ae9ec8 /drivers/input/input.c | |
parent | Input: simplify event handling logic (diff) | |
download | linux-3544cf574a577d92111f0b29e6d649b7ea3210ed.tar.xz linux-3544cf574a577d92111f0b29e6d649b7ea3210ed.zip |
Input: rearrange input_alloc_device() to prepare for preallocating of vals
In preparation to have dev->vals memory pre-allocated rearrange
code in input_alloc_device() so that it allows handling multiple
points of failure.
Reviewed-by: Jeff LaBundy <jeff@labundy.com>
Reviewed-by: Benjamin Tissoires <bentiss@kernel.org>
Link: https://lore.kernel.org/r/20240703213756.3375978-6-dmitry.torokhov@gmail.com
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Diffstat (limited to 'drivers/input/input.c')
-rw-r--r-- | drivers/input/input.c | 37 |
1 files changed, 22 insertions, 15 deletions
diff --git a/drivers/input/input.c b/drivers/input/input.c index 40a04154f99d..9981fdfaee9f 100644 --- a/drivers/input/input.c +++ b/drivers/input/input.c @@ -1982,21 +1982,28 @@ 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; + + 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; } |