Skip to content

Commit

Permalink
block: make the fair sharing of tag configurable
Browse files Browse the repository at this point in the history
Add a new queue flag QUEUE_FLAG_FAIR_TAG_SHARING to make the fair tag
sharing configurable.

Signed-off-by: Ed Tsai <ed.tsai@mediatek.com>
  • Loading branch information
Ed Tsai authored and intel-lab-lkp committed May 9, 2023
1 parent b2e48bd commit b108102
Show file tree
Hide file tree
Showing 4 changed files with 9 additions and 2 deletions.
1 change: 1 addition & 0 deletions block/blk-mq-debugfs.c
Expand Up @@ -103,6 +103,7 @@ static const char *const blk_queue_flag_name[] = {
QUEUE_FLAG_NAME(RQ_ALLOC_TIME),
QUEUE_FLAG_NAME(HCTX_ACTIVE),
QUEUE_FLAG_NAME(NOWAIT),
QUEUE_FLAG_NAME(FAIR_TAG_SHARING),
};
#undef QUEUE_FLAG_NAME

Expand Down
1 change: 1 addition & 0 deletions block/blk-mq-tag.c
Expand Up @@ -97,6 +97,7 @@ static int __blk_mq_get_tag(struct blk_mq_alloc_data *data,
struct sbitmap_queue *bt)
{
if (!data->q->elevator && !(data->flags & BLK_MQ_REQ_RESERVED) &&
blk_queue_fair_tag_sharing(data->q) &&
!hctx_may_queue(data->hctx, bt))
return BLK_MQ_NO_TAG;

Expand Down
3 changes: 2 additions & 1 deletion block/blk-mq.c
Expand Up @@ -1746,7 +1746,8 @@ static bool __blk_mq_alloc_driver_tag(struct request *rq)
bt = &rq->mq_hctx->tags->breserved_tags;
tag_offset = 0;
} else {
if (!hctx_may_queue(rq->mq_hctx, bt))
if (blk_queue_fair_tag_sharing(rq->q) &&
!hctx_may_queue(rq->mq_hctx, bt))
return false;
}

Expand Down
6 changes: 5 additions & 1 deletion include/linux/blkdev.h
Expand Up @@ -561,10 +561,12 @@ struct request_queue {
#define QUEUE_FLAG_NOWAIT 29 /* device supports NOWAIT */
#define QUEUE_FLAG_SQ_SCHED 30 /* single queue style io dispatch */
#define QUEUE_FLAG_SKIP_TAGSET_QUIESCE 31 /* quiesce_tagset skip the queue*/
#define QUEUE_FLAG_FAIR_TAG_SHARING 32 /* fair allocation of shared tags */

#define QUEUE_FLAG_MQ_DEFAULT ((1UL << QUEUE_FLAG_IO_STAT) | \
(1UL << QUEUE_FLAG_SAME_COMP) | \
(1UL << QUEUE_FLAG_NOWAIT))
(1UL << QUEUE_FLAG_NOWAIT) | \
(1UL << QUEUE_FLAG_FAIR_TAG_SHARING))

void blk_queue_flag_set(unsigned int flag, struct request_queue *q);
void blk_queue_flag_clear(unsigned int flag, struct request_queue *q);
Expand Down Expand Up @@ -602,6 +604,8 @@ bool blk_queue_flag_test_and_set(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) \
test_bit(QUEUE_FLAG_SKIP_TAGSET_QUIESCE, &(q)->queue_flags)
#define blk_queue_fair_tag_sharing(q) \
test_bit(QUEUE_FLAG_FAIR_TAG_SHARING, &(q)->queue_flags)

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

0 comments on commit b108102

Please sign in to comment.