Re: [PATCH 1/2] loop: Prevent that an I/O scheduler is assigned
From: Bart Van Assche <bvanassche@acm.org>
Date: 2021-08-03 05:24:02
On 8/2/21 6:54 PM, Ming Lei wrote:
On Mon, Aug 02, 2021 at 05:01:59PM -0700, Bart Van Assche wrote:quoted
Loop devices have a single hardware queue. Hence, the block layer function elevator_get_default() selects the mq-deadline scheduler for loop devices. Using the mq-deadline scheduler or any other I/O scheduler for loop devices incurs unnecessary overhead. Make the loop driver pass the flag BLK_MQ_F_NOSCHED to the block layer core such that no I/O scheduler can be associated with block devices. This approach has an advantage compared to letting udevd change the loop I/O scheduler to none, namely that synchronize_rcu() does not get called. It is intentional that the flag BLK_MQ_F_SHOULD_MERGE is preserved. This patch reduces the Android boot time on my test setup with 0.5 seconds.Can you investigate why none reduces Android boot time? Or reproduce & understand it by a fio simulation on your setting?
Hi Ming, The software process called apexd creates multiple loop devices while the device is booting. Using BLK_MQ_F_NO_SCHED is faster than letting apexd change the I/O scheduler from mq-deadline into 'none' since the latter involves calling synchronize_rcu() once per loop device.
quoted
diff --git a/drivers/block/loop.c b/drivers/block/loop.c index f8486d9b75a4..9fca3ab3988d 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c@@ -2333,7 +2333,8 @@ static int loop_add(int i) lo->tag_set.queue_depth = 128; lo->tag_set.numa_node = NUMA_NO_NODE; lo->tag_set.cmd_size = sizeof(struct loop_cmd); - lo->tag_set.flags = BLK_MQ_F_SHOULD_MERGE | BLK_MQ_F_STACKING; + lo->tag_set.flags = BLK_MQ_F_SHOULD_MERGE | BLK_MQ_F_STACKING | + BLK_MQ_F_NO_SCHED;Loop directio needs io merge, so it isn't good to set NO_SCHED unconditionally, see: 40326d8a33d5 ("block/loop: allow request merge for directio mode")
Setting BLK_MQ_F_NO_SCHED only for buffered I/O mode could be tricky since the loop driver creates a request queue before the I/O mode is configured. Anyway, I will look into this. Bart.