diff mbox series

loop: Only freeze block queue when needed.

Message ID 20200310130654.92205-1-maco@android.com (mailing list archive)
State New, archived
Headers show
Series loop: Only freeze block queue when needed. | expand

Commit Message

Martijn Coenen March 10, 2020, 1:06 p.m. UTC
__loop_update_dio() can be called as a part of loop_set_fd(), when the
block queue is not yet up and running; avoid freezing the block queue in
that case, since that is an expensive operation.

Signed-off-by: Martijn Coenen <maco@android.com>
---
 drivers/block/loop.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

Comments

Christoph Hellwig March 10, 2020, 5:47 p.m. UTC | #1
On Tue, Mar 10, 2020 at 02:06:54PM +0100, Martijn Coenen wrote:
> __loop_update_dio() can be called as a part of loop_set_fd(), when the
> block queue is not yet up and running; avoid freezing the block queue in
> that case, since that is an expensive operation.
> 
> Signed-off-by: Martijn Coenen <maco@android.com>

Looks good,

Reviewed-by: Christoph Hellwig <hch@lst.de>
Chaitanya Kulkarni March 10, 2020, 8:06 p.m. UTC | #2
Looks good to me.

Reviewed-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>

On 03/10/2020 06:07 AM, Martijn Coenen wrote:
> __loop_update_dio() can be called as a part of loop_set_fd(), when the
> block queue is not yet up and running; avoid freezing the block queue in
> that case, since that is an expensive operation.
>
> Signed-off-by: Martijn Coenen<maco@android.com>
Jens Axboe March 10, 2020, 8:11 p.m. UTC | #3
On 3/10/20 7:06 AM, Martijn Coenen wrote:
> __loop_update_dio() can be called as a part of loop_set_fd(), when the
> block queue is not yet up and running; avoid freezing the block queue in
> that case, since that is an expensive operation.

Applied, thanks.
diff mbox series

Patch

diff --git a/drivers/block/loop.c b/drivers/block/loop.c
index 739b372a5112..c1c844ad6b1a 100644
--- a/drivers/block/loop.c
+++ b/drivers/block/loop.c
@@ -214,7 +214,8 @@  static void __loop_update_dio(struct loop_device *lo, bool dio)
 	 * LO_FLAGS_READ_ONLY, both are set from kernel, and losetup
 	 * will get updated by ioctl(LOOP_GET_STATUS)
 	 */
-	blk_mq_freeze_queue(lo->lo_queue);
+	if (lo->lo_state == Lo_bound)
+		blk_mq_freeze_queue(lo->lo_queue);
 	lo->use_dio = use_dio;
 	if (use_dio) {
 		blk_queue_flag_clear(QUEUE_FLAG_NOMERGES, lo->lo_queue);
@@ -223,7 +224,8 @@  static void __loop_update_dio(struct loop_device *lo, bool dio)
 		blk_queue_flag_set(QUEUE_FLAG_NOMERGES, lo->lo_queue);
 		lo->lo_flags &= ~LO_FLAGS_DIRECT_IO;
 	}
-	blk_mq_unfreeze_queue(lo->lo_queue);
+	if (lo->lo_state == Lo_bound)
+		blk_mq_unfreeze_queue(lo->lo_queue);
 }
 
 static int