Re: [PATCH 1/2] loop: Prevent that an I/O scheduler is assigned

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 8/2/21 6:54 PM, Ming Lei wrote:
> On Mon, Aug 02, 2021 at 05:01:59PM -0700, Bart Van Assche wrote:
>> 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.

>> 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.



[Index of Archives]     [Linux RAID]     [Linux SCSI]     [Linux ATA RAID]     [IDE]     [Linux Wireless]     [Linux Kernel]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Device Mapper]

  Powered by Linux