Commit 56dee46f authored by Ming Lei's avatar Ming Lei Committed by Jens Axboe
Browse files

block: move ELEVATOR_FLAG_DISABLE_WBT a request queue flag



ELEVATOR_FLAG_DISABLE_WBT is only used by BFQ to disallow wbt when BFQ is
in use. The flag is set in BFQ's init(), and cleared in BFQ's exit().

Making it as request queue flag, so that we can avoid to deal with elevator
switch race. Also it isn't graceful to checking one scheduler flag in
wbt_enable_default().

Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarNilay Shroff <nilay@linux.ibm.com>
Reviewed-by: default avatarHannes Reinecke <hare@suse.de>
Signed-off-by: default avatarMing Lei <ming.lei@redhat.com>
Link: https://lore.kernel.org/r/20250505141805.2751237-3-ming.lei@redhat.com


Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent f24d47ed
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -7210,7 +7210,7 @@ static void bfq_exit_queue(struct elevator_queue *e)
#endif

	blk_stat_disable_accounting(bfqd->queue);
	clear_bit(ELEVATOR_FLAG_DISABLE_WBT, &e->flags);
	blk_queue_flag_clear(QUEUE_FLAG_DISABLE_WBT_DEF, bfqd->queue);
	wbt_enable_default(bfqd->queue->disk);

	kfree(bfqd);
@@ -7397,7 +7397,7 @@ static int bfq_init_queue(struct request_queue *q, struct elevator_type *e)
	/* We dispatch from request queue wide instead of hw queue */
	blk_queue_flag_set(QUEUE_FLAG_SQ_SCHED, q);

	set_bit(ELEVATOR_FLAG_DISABLE_WBT, &eq->flags);
	blk_queue_flag_set(QUEUE_FLAG_DISABLE_WBT_DEF, q);
	wbt_disable_default(q->disk);
	blk_stat_enable_accounting(q);

+1 −0
Original line number Diff line number Diff line
@@ -93,6 +93,7 @@ static const char *const blk_queue_flag_name[] = {
	QUEUE_FLAG_NAME(RQ_ALLOC_TIME),
	QUEUE_FLAG_NAME(HCTX_ACTIVE),
	QUEUE_FLAG_NAME(SQ_SCHED),
	QUEUE_FLAG_NAME(DISABLE_WBT_DEF),
};
#undef QUEUE_FLAG_NAME

+1 −2
Original line number Diff line number Diff line
@@ -704,8 +704,7 @@ void wbt_enable_default(struct gendisk *disk)
	struct rq_qos *rqos;
	bool enable = IS_ENABLED(CONFIG_BLK_WBT_MQ);

	if (q->elevator &&
	    test_bit(ELEVATOR_FLAG_DISABLE_WBT, &q->elevator->flags))
	if (blk_queue_disable_wbt(q))
		enable = false;

	/* Throttling already enabled? */
+0 −1
Original line number Diff line number Diff line
@@ -121,7 +121,6 @@ struct elevator_queue
};

#define ELEVATOR_FLAG_REGISTERED	0
#define ELEVATOR_FLAG_DISABLE_WBT	1

/*
 * block elevator interface
+3 −0
Original line number Diff line number Diff line
@@ -641,6 +641,7 @@ enum {
	QUEUE_FLAG_RQ_ALLOC_TIME,	/* record rq->alloc_time_ns */
	QUEUE_FLAG_HCTX_ACTIVE,		/* at least one blk-mq hctx is active */
	QUEUE_FLAG_SQ_SCHED,		/* single queue style io dispatch */
	QUEUE_FLAG_DISABLE_WBT_DEF,	/* for sched to disable/enable wbt */
	QUEUE_FLAG_MAX
};

@@ -676,6 +677,8 @@ void blk_queue_flag_clear(unsigned int flag, struct request_queue *q);
#define blk_queue_sq_sched(q)	test_bit(QUEUE_FLAG_SQ_SCHED, &(q)->queue_flags)
#define blk_queue_skip_tagset_quiesce(q) \
	((q)->limits.features & BLK_FEAT_SKIP_TAGSET_QUIESCE)
#define blk_queue_disable_wbt(q)	\
	test_bit(QUEUE_FLAG_DISABLE_WBT_DEF, &(q)->queue_flags)

extern void blk_set_pm_only(struct request_queue *q);
extern void blk_clear_pm_only(struct request_queue *q);