gpiolib: cdev: allocate linereq using kvzalloc()
authorKent Gibson <warthog618@gmail.com>
Thu, 21 Dec 2023 01:20:38 +0000 (09:20 +0800)
committerBartosz Golaszewski <bartosz.golaszewski@linaro.org>
Wed, 27 Dec 2023 14:43:56 +0000 (15:43 +0100)
The size of struct linereq may exceed a page, so allocate space for
it using kvzalloc() instead of kzalloc() to handle the case where
memory is heavily fragmented and kzalloc() cannot find a sufficient
contiguous region.

Signed-off-by: Kent Gibson <warthog618@gmail.com>
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
drivers/gpio/gpiolib-cdev.c

index 942fe115b7265fb4c6c9c58b98fc3889bcc6217f..5424c878627efdaf778667eb922ff8d4b5d1a241 100644 (file)
@@ -1723,7 +1723,7 @@ static void linereq_free(struct linereq *lr)
        kfifo_free(&lr->events);
        kfree(lr->label);
        gpio_device_put(lr->gdev);
-       kfree(lr);
+       kvfree(lr);
 }
 
 static int linereq_release(struct inode *inode, struct file *file)
@@ -1788,7 +1788,7 @@ static int linereq_create(struct gpio_device *gdev, void __user *ip)
        if (ret)
                return ret;
 
-       lr = kzalloc(struct_size(lr, lines, ulr.num_lines), GFP_KERNEL);
+       lr = kvzalloc(struct_size(lr, lines, ulr.num_lines), GFP_KERNEL);
        if (!lr)
                return -ENOMEM;
        lr->num_lines = ulr.num_lines;