Input: mt - make use of __free() cleanup facility
authorDmitry Torokhov <dmitry.torokhov@gmail.com>
Thu, 7 Nov 2024 07:15:33 +0000 (23:15 -0800)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Tue, 24 Dec 2024 06:53:57 +0000 (22:53 -0800)
Annotate allocated memory with __free(kfree) to simplify the code and
make sure memory is released appropriately.

Link: https://lore.kernel.org/r/20241107071538.195340-7-dmitry.torokhov@gmail.com
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
drivers/input/input-mt.c

index 45e41fc9059cad0e08f7fe1c5f5c02641fa66e59..337006dd9dcf72ef2eeb8580e4dd83babf8100be 100644 (file)
@@ -39,20 +39,20 @@ static void copy_abs(struct input_dev *dev, unsigned int dst, unsigned int src)
 int input_mt_init_slots(struct input_dev *dev, unsigned int num_slots,
                        unsigned int flags)
 {
-       struct input_mt *mt = dev->mt;
-       int i;
-
        if (!num_slots)
                return 0;
-       if (mt)
-               return mt->num_slots != num_slots ? -EINVAL : 0;
+
+       if (dev->mt)
+               return dev->mt->num_slots != num_slots ? -EINVAL : 0;
+
        /* Arbitrary limit for avoiding too large memory allocation. */
        if (num_slots > 1024)
                return -EINVAL;
 
-       mt = kzalloc(struct_size(mt, slots, num_slots), GFP_KERNEL);
+       struct input_mt *mt __free(kfree) =
+                       kzalloc(struct_size(mt, slots, num_slots), GFP_KERNEL);
        if (!mt)
-               goto err_mem;
+               return -ENOMEM;
 
        mt->num_slots = num_slots;
        mt->flags = flags;
@@ -86,21 +86,18 @@ int input_mt_init_slots(struct input_dev *dev, unsigned int num_slots,
                unsigned int n2 = num_slots * num_slots;
                mt->red = kcalloc(n2, sizeof(*mt->red), GFP_KERNEL);
                if (!mt->red)
-                       goto err_mem;
+                       return -ENOMEM;
        }
 
        /* Mark slots as 'inactive' */
-       for (i = 0; i < num_slots; i++)
+       for (unsigned int i = 0; i < num_slots; i++)
                input_mt_set_value(&mt->slots[i], ABS_MT_TRACKING_ID, -1);
 
        /* Mark slots as 'unused' */
        mt->frame = 1;
 
-       dev->mt = mt;
+       dev->mt = no_free_ptr(mt);
        return 0;
-err_mem:
-       kfree(mt);
-       return -ENOMEM;
 }
 EXPORT_SYMBOL(input_mt_init_slots);