Commit 08823e89 authored by Ming Lei's avatar Ming Lei Committed by Jens Axboe
Browse files

block: Remove elevator_lock usage from blkg_conf frozen operations

Remove the acquisition and release of q->elevator_lock in the
blkg_conf_open_bdev_frozen() and blkg_conf_exit_frozen() functions. The
elevator lock is no longer needed in these code paths since commit
78c27134 ("block: move wbt_enable_default() out of queue freezing
from sched ->exit()") which introduces `disk->rqos_state_mutex` for
protecting wbt state change, and not necessary to abuse elevator_lock
for this purpose.

This change helps to solve the lockdep warning reported from Yu Kuai[1].

Pass blktests/throtl with lockdep enabled.

Links: https://lore.kernel.org/linux-block/e5e7ac3f-2063-473a-aafb-4d8d43e5576e@yukuai.org.cn/

 [1]
Fixes: commit 78c27134 ("block: move wbt_enable_default() out of queue freezing from sched ->exit()")
Signed-off-by: default avatarMing Lei <ming.lei@redhat.com>
Reviewed-by: default avatarNilay Shroff <nilay@linux.ibm.com>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent dc96cefe
Loading
Loading
Loading
Loading
+4 −9
Original line number Diff line number Diff line
@@ -812,8 +812,7 @@ int blkg_conf_open_bdev(struct blkg_conf_ctx *ctx)
}
/*
 * Similar to blkg_conf_open_bdev, but additionally freezes the queue,
 * acquires q->elevator_lock, and ensures the correct locking order
 * between q->elevator_lock and q->rq_qos_mutex.
 * ensures the correct locking order between freeze queue and q->rq_qos_mutex.
 *
 * This function returns negative error on failure. On success it returns
 * memflags which must be saved and later passed to blkg_conf_exit_frozen
@@ -834,13 +833,11 @@ unsigned long __must_check blkg_conf_open_bdev_frozen(struct blkg_conf_ctx *ctx)
	 * At this point, we haven’t started protecting anything related to QoS,
	 * so we release q->rq_qos_mutex here, which was first acquired in blkg_
	 * conf_open_bdev. Later, we re-acquire q->rq_qos_mutex after freezing
	 * the queue and acquiring q->elevator_lock to maintain the correct
	 * locking order.
	 * the queue to maintain the correct locking order.
	 */
	mutex_unlock(&ctx->bdev->bd_queue->rq_qos_mutex);

	memflags = blk_mq_freeze_queue(ctx->bdev->bd_queue);
	mutex_lock(&ctx->bdev->bd_queue->elevator_lock);
	mutex_lock(&ctx->bdev->bd_queue->rq_qos_mutex);

	return memflags;
@@ -995,9 +992,8 @@ void blkg_conf_exit(struct blkg_conf_ctx *ctx)
EXPORT_SYMBOL_GPL(blkg_conf_exit);

/*
 * Similar to blkg_conf_exit, but also unfreezes the queue and releases
 * q->elevator_lock. Should be used when blkg_conf_open_bdev_frozen
 * is used to open the bdev.
 * Similar to blkg_conf_exit, but also unfreezes the queue. Should be used
 * when blkg_conf_open_bdev_frozen is used to open the bdev.
 */
void blkg_conf_exit_frozen(struct blkg_conf_ctx *ctx, unsigned long memflags)
{
@@ -1005,7 +1001,6 @@ void blkg_conf_exit_frozen(struct blkg_conf_ctx *ctx, unsigned long memflags)
		struct request_queue *q = ctx->bdev->bd_queue;

		blkg_conf_exit(ctx);
		mutex_unlock(&q->elevator_lock);
		blk_mq_unfreeze_queue(q, memflags);
	}
}