From 2b8ee88f18d410cfcda0380ad45a0b67b11dec03 Mon Sep 17 00:00:00 2001 From: Qiliang Yuan Date: Thu, 1 Oct 2026 11:10:40 +0800 Subject: [PATCH] ublk: don't use an I/O scheduler by default Requests of a ublk device are handed to the ublk server through io_uring, and the server does its own queueing and ordering, so an I/O scheduler in front of the device only adds overhead. A single-queue ublk device still gets mq-deadline by default, which costs throughput on every I/O and an elevator setup on every START_DEV. Set BLK_MQ_F_NO_SCHED_BY_DEFAULT so that add_disk() selects "none", as loop does since commit 2112f5c1330a ("loop: Select I/O scheduler 'none' from inside add_disk()"). Doing it in the kernel also avoids switching the scheduler from user space after the device has been added, which waits for RCU grace periods. A scheduler can still be selected through sysfs. Zoned ublk devices don't need mq-deadline either, zone write plugging serializes writes per zone in the block layer since commit fde02699c242 ("block: mq-deadline: Remove support for zone write locking"). ublk null target, single-queue devices with depth 16, fio io_uring 4k randread at iodepth=16, 16 vCPU KVM guest: mq-deadline none 1 device 111K IOPS 342K IOPS 4 devices 286K IOPS 1070K IOPS START_DEV p50 (1000 devices) 8.53ms 0.36ms Signed-off-by: Qiliang Yuan Reviewed-by: Ming Lei Link: https://patch.msgid.link/20261001-bug-ublk-no-sched-by-default-v1-1-0bc91b6f075e@gmail.com Signed-off-by: Jens Axboe --- drivers/block/ublk_drv.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/block/ublk_drv.c b/drivers/block/ublk_drv.c index c387fb589c57..522bd45005ac 100644 --- a/drivers/block/ublk_drv.c +++ b/drivers/block/ublk_drv.c @@ -4388,6 +4388,7 @@ static int ublk_add_tag_set(struct ublk_device *ub) ub->tag_set.nr_hw_queues = ub->dev_info.nr_hw_queues; ub->tag_set.queue_depth = ub->dev_info.queue_depth; ub->tag_set.numa_node = NUMA_NO_NODE; + ub->tag_set.flags = BLK_MQ_F_NO_SCHED_BY_DEFAULT; ub->tag_set.driver_data = ub; return blk_mq_alloc_tag_set(&ub->tag_set); }