+++ /dev/null
-From 2112f5c1330a671fa852051d85cb9eadc05d7eb7 Mon Sep 17 00:00:00 2001
-From: Bart Van Assche <bvanassche@acm.org>
-Date: Thu, 5 Aug 2021 10:42:00 -0700
-Subject: loop: Select I/O scheduler 'none' from inside add_disk()
-
-From: Bart Van Assche <bvanassche@acm.org>
-
-commit 2112f5c1330a671fa852051d85cb9eadc05d7eb7 upstream.
-
-We noticed that the user interface of Android devices becomes very slow
-under memory pressure. This is because Android uses the zram driver on top
-of the loop driver for swapping, because under memory pressure the swap
-code alternates reads and writes quickly, because mq-deadline is the
-default scheduler for loop devices and because mq-deadline delays writes by
-five seconds for such a workload with default settings. Fix this by making
-the kernel select I/O scheduler 'none' from inside add_disk() for loop
-devices. This default can be overridden at any time from user space,
-e.g. via a udev rule. This approach has an advantage compared to changing
-the I/O scheduler from userspace from 'mq-deadline' into 'none', namely
-that synchronize_rcu() does not get called.
-
-This patch changes the default I/O scheduler for loop devices from
-'mq-deadline' into 'none'.
-
-Additionally, this patch reduces the Android boot time on my test setup
-with 0.5 seconds compared to configuring the loop I/O scheduler from user
-space.
-
-Cc: Christoph Hellwig <hch@lst.de>
-Cc: Ming Lei <ming.lei@redhat.com>
-Cc: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
-Cc: Martijn Coenen <maco@android.com>
-Cc: Jaegeuk Kim <jaegeuk@kernel.org>
-Signed-off-by: Bart Van Assche <bvanassche@acm.org>
-Link: https://lore.kernel.org/r/20210805174200.3250718-3-bvanassche@acm.org
-Signed-off-by: Jens Axboe <axboe@kernel.dk>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
----
- drivers/block/loop.c | 3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
-
---- a/drivers/block/loop.c
-+++ b/drivers/block/loop.c
-@@ -1846,7 +1846,8 @@ static int loop_add(struct loop_device *
- 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_SG_MERGE;
-+ lo->tag_set.flags = BLK_MQ_F_SHOULD_MERGE | BLK_MQ_F_SG_MERGE |
-+ BLK_MQ_F_NO_SCHED_BY_DEFAULT;
- lo->tag_set.driver_data = lo;
-
- err = blk_mq_alloc_tag_set(&lo->tag_set);