Input: rearrange input_alloc_device() to prepare for preallocating of vals
authorDmitry Torokhov <dmitry.torokhov@gmail.com>
Wed, 3 Jul 2024 21:37:52 +0000 (14:37 -0700)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Mon, 8 Jul 2024 23:22:49 +0000 (16:22 -0700)
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>
drivers/input/input.c

index 40a04154f99db972d9e22872ada62a7baae6f960..9981fdfaee9f7f06af8e6ad5fbcfc7055216d951 100644 (file)
@@ -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;
 }