Skip to content

Commit

Permalink
blk-mq: add support for carrying internal tag information in blk_qc_t
Browse files Browse the repository at this point in the history
No functional change in this patch, just in preparation for having
two types of tags available to the block layer for a single request.

Signed-off-by: Jens Axboe <[email protected]>
Reviewed-by: Omar Sandoval <[email protected]>
  • Loading branch information
axboe committed Jan 17, 2017
1 parent cc71a6f commit fd2d332
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 8 deletions.
11 changes: 8 additions & 3 deletions block/blk-mq.c
Original file line number Diff line number Diff line change
Expand Up @@ -1308,6 +1308,11 @@ static struct request *blk_mq_map_request(struct request_queue *q,
return rq;
}

static blk_qc_t request_to_qc_t(struct blk_mq_hw_ctx *hctx, struct request *rq)
{
return blk_tag_to_qc_t(rq->tag, hctx->queue_num, false);
}

static void blk_mq_try_issue_directly(struct request *rq, blk_qc_t *cookie)
{
int ret;
Expand All @@ -1318,7 +1323,7 @@ static void blk_mq_try_issue_directly(struct request *rq, blk_qc_t *cookie)
.list = NULL,
.last = 1
};
blk_qc_t new_cookie = blk_tag_to_qc_t(rq->tag, hctx->queue_num);
blk_qc_t new_cookie = request_to_qc_t(hctx, rq);

if (blk_mq_hctx_stopped(hctx))
goto insert;
Expand Down Expand Up @@ -1387,7 +1392,7 @@ static blk_qc_t blk_mq_make_request(struct request_queue *q, struct bio *bio)

wbt_track(&rq->issue_stat, wb_acct);

cookie = blk_tag_to_qc_t(rq->tag, data.hctx->queue_num);
cookie = request_to_qc_t(data.hctx, rq);

if (unlikely(is_flush_fua)) {
blk_mq_bio_to_request(rq, bio);
Expand Down Expand Up @@ -1496,7 +1501,7 @@ static blk_qc_t blk_sq_make_request(struct request_queue *q, struct bio *bio)

wbt_track(&rq->issue_stat, wb_acct);

cookie = blk_tag_to_qc_t(rq->tag, data.hctx->queue_num);
cookie = request_to_qc_t(data.hctx, rq);

if (unlikely(is_flush_fua)) {
blk_mq_bio_to_request(rq, bio);
Expand Down
22 changes: 17 additions & 5 deletions include/linux/blk_types.h
Original file line number Diff line number Diff line change
Expand Up @@ -232,29 +232,41 @@ static inline bool op_is_sync(unsigned int op)
}

typedef unsigned int blk_qc_t;
#define BLK_QC_T_NONE -1U
#define BLK_QC_T_SHIFT 16
#define BLK_QC_T_NONE -1U
#define BLK_QC_T_SHIFT 16
#define BLK_QC_T_INTERNAL (1U << 31)

static inline bool blk_qc_t_valid(blk_qc_t cookie)
{
return cookie != BLK_QC_T_NONE;
}

static inline blk_qc_t blk_tag_to_qc_t(unsigned int tag, unsigned int queue_num)
static inline blk_qc_t blk_tag_to_qc_t(unsigned int tag, unsigned int queue_num,
bool internal)
{
return tag | (queue_num << BLK_QC_T_SHIFT);
blk_qc_t ret = tag | (queue_num << BLK_QC_T_SHIFT);

if (internal)
ret |= BLK_QC_T_INTERNAL;

return ret;
}

static inline unsigned int blk_qc_t_to_queue_num(blk_qc_t cookie)
{
return cookie >> BLK_QC_T_SHIFT;
return (cookie & ~BLK_QC_T_INTERNAL) >> BLK_QC_T_SHIFT;
}

static inline unsigned int blk_qc_t_to_tag(blk_qc_t cookie)
{
return cookie & ((1u << BLK_QC_T_SHIFT) - 1);
}

static inline bool blk_qc_t_is_internal(blk_qc_t cookie)
{
return (cookie & BLK_QC_T_INTERNAL) != 0;
}

struct blk_issue_stat {
u64 time;
};
Expand Down

0 comments on commit fd2d332

Please sign in to comment.