--- /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
+@@ -1991,7 +1991,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;
+ lo->tag_set.driver_data = lo;
+
+ err = blk_mq_alloc_tag_set(&lo->tag_set);