]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
ublk: use vmalloc for ublk_device's __queues
authorCaleb Sander Mateos <csander@purestorage.com>
Fri, 20 Jun 2025 15:09:55 +0000 (09:09 -0600)
committerJens Axboe <axboe@kernel.dk>
Mon, 30 Jun 2025 21:50:53 +0000 (15:50 -0600)
struct ublk_device's __queues points to an allocation with up to
UBLK_MAX_NR_QUEUES (4096) queues, each of which have:
- struct ublk_queue (48 bytes)
- Tail array of up to UBLK_MAX_QUEUE_DEPTH (4096) struct ublk_io's,
  32 bytes each
This means the full allocation can exceed 512 MB, which may well be
impossible to service with contiguous physical pages. Switch to
kvcalloc() and kvfree(), since there is no need for physically
contiguous memory.

Signed-off-by: Caleb Sander Mateos <csander@purestorage.com>
Fixes: 71f28f3136af ("ublk_drv: add io_uring based userspace block driver")
Reviewed-by: Ming Lei <ming.lei@redhat.com>
Link: https://lore.kernel.org/r/20250620151008.3976463-2-csander@purestorage.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/block/ublk_drv.c

index c3e3c3b65a6d4d3990822897845c5ce438a7c111..9e48e0c1b0ccac4f68cc834487722712d05359a1 100644 (file)
@@ -2512,7 +2512,7 @@ static void ublk_deinit_queues(struct ublk_device *ub)
 
        for (i = 0; i < nr_queues; i++)
                ublk_deinit_queue(ub, i);
-       kfree(ub->__queues);
+       kvfree(ub->__queues);
 }
 
 static int ublk_init_queues(struct ublk_device *ub)
@@ -2523,7 +2523,7 @@ static int ublk_init_queues(struct ublk_device *ub)
        int i, ret = -ENOMEM;
 
        ub->queue_size = ubq_size;
-       ub->__queues = kcalloc(nr_queues, ubq_size, GFP_KERNEL);
+       ub->__queues = kvcalloc(nr_queues, ubq_size, GFP_KERNEL);
        if (!ub->__queues)
                return ret;