mirror of https://github.com/torvalds/linux.git
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 commit78c271344b("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: commit78c271344b("block: move wbt_enable_default() out of queue freezing from sched ->exit()") Signed-off-by: Ming Lei <ming.lei@redhat.com> Reviewed-by: Nilay Shroff <nilay@linux.ibm.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
dc96cefef0
commit
08823e89e3
|
|
@ -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,
|
* Similar to blkg_conf_open_bdev, but additionally freezes the queue,
|
||||||
* acquires q->elevator_lock, and ensures the correct locking order
|
* ensures the correct locking order between freeze queue and q->rq_qos_mutex.
|
||||||
* between q->elevator_lock and q->rq_qos_mutex.
|
|
||||||
*
|
*
|
||||||
* This function returns negative error on failure. On success it returns
|
* This function returns negative error on failure. On success it returns
|
||||||
* memflags which must be saved and later passed to blkg_conf_exit_frozen
|
* 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,
|
* 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_
|
* 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
|
* conf_open_bdev. Later, we re-acquire q->rq_qos_mutex after freezing
|
||||||
* the queue and acquiring q->elevator_lock to maintain the correct
|
* the queue to maintain the correct locking order.
|
||||||
* locking order.
|
|
||||||
*/
|
*/
|
||||||
mutex_unlock(&ctx->bdev->bd_queue->rq_qos_mutex);
|
mutex_unlock(&ctx->bdev->bd_queue->rq_qos_mutex);
|
||||||
|
|
||||||
memflags = blk_mq_freeze_queue(ctx->bdev->bd_queue);
|
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);
|
mutex_lock(&ctx->bdev->bd_queue->rq_qos_mutex);
|
||||||
|
|
||||||
return memflags;
|
return memflags;
|
||||||
|
|
@ -995,9 +992,8 @@ void blkg_conf_exit(struct blkg_conf_ctx *ctx)
|
||||||
EXPORT_SYMBOL_GPL(blkg_conf_exit);
|
EXPORT_SYMBOL_GPL(blkg_conf_exit);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Similar to blkg_conf_exit, but also unfreezes the queue and releases
|
* Similar to blkg_conf_exit, but also unfreezes the queue. Should be used
|
||||||
* q->elevator_lock. Should be used when blkg_conf_open_bdev_frozen
|
* when blkg_conf_open_bdev_frozen is used to open the bdev.
|
||||||
* is used to open the bdev.
|
|
||||||
*/
|
*/
|
||||||
void blkg_conf_exit_frozen(struct blkg_conf_ctx *ctx, unsigned long memflags)
|
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;
|
struct request_queue *q = ctx->bdev->bd_queue;
|
||||||
|
|
||||||
blkg_conf_exit(ctx);
|
blkg_conf_exit(ctx);
|
||||||
mutex_unlock(&q->elevator_lock);
|
|
||||||
blk_mq_unfreeze_queue(q, memflags);
|
blk_mq_unfreeze_queue(q, memflags);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue