]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
ublk: reorder tag_set initialization before queue allocation
authorMing Lei <ming.lei@redhat.com>
Sat, 1 Nov 2025 13:31:16 +0000 (21:31 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 17 Jan 2026 15:35:15 +0000 (16:35 +0100)
commit 011af85ccd871526df36988c7ff20ca375fb804d upstream.

Move ublk_add_tag_set() before ublk_init_queues() in the device
initialization path. This allows us to use the blk-mq CPU-to-queue
mapping established by the tag_set to determine the appropriate
NUMA node for each queue allocation.

The error handling paths are also reordered accordingly.

Reviewed-by: Caleb Sander Mateos <csander@purestorage.com>
Signed-off-by: Ming Lei <ming.lei@redhat.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
[ Upstream commit 529d4d632788 ("ublk: implement NUMA-aware memory allocation")
  is ported to linux-6.18.y, but it depends on commit 011af85ccd87 ("ublk:
  reorder tag_set initialization before queue allocation"). kernel panic is
  reported on 6.18.y: https://github.com/ublk-org/ublksrv/issues/174 ]
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/block/ublk_drv.c

index 23aba73d24dc2d2ee30b704cc88f668fd15d3fe5..babb58d2dcaf7dc2a79ee05c15ecc05b9f39403c 100644 (file)
@@ -3280,17 +3280,17 @@ static int ublk_ctrl_add_dev(const struct ublksrv_ctrl_cmd *header)
                        ub->dev_info.nr_hw_queues, nr_cpu_ids);
        ublk_align_max_io_size(ub);
 
-       ret = ublk_init_queues(ub);
+       ret = ublk_add_tag_set(ub);
        if (ret)
                goto out_free_dev_number;
 
-       ret = ublk_add_tag_set(ub);
+       ret = ublk_init_queues(ub);
        if (ret)
-               goto out_deinit_queues;
+               goto out_free_tag_set;
 
        ret = -EFAULT;
        if (copy_to_user(argp, &ub->dev_info, sizeof(info)))
-               goto out_free_tag_set;
+               goto out_deinit_queues;
 
        /*
         * Add the char dev so that ublksrv daemon can be setup.
@@ -3299,10 +3299,10 @@ static int ublk_ctrl_add_dev(const struct ublksrv_ctrl_cmd *header)
        ret = ublk_add_chdev(ub);
        goto out_unlock;
 
-out_free_tag_set:
-       blk_mq_free_tag_set(&ub->tag_set);
 out_deinit_queues:
        ublk_deinit_queues(ub);
+out_free_tag_set:
+       blk_mq_free_tag_set(&ub->tag_set);
 out_free_dev_number:
        ublk_free_dev_number(ub);
 out_free_ub: