Skip to content

Commit fd2d332

Browse files
committed
blk-mq: add support for carrying internal tag information in blk_qc_t
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 <axboe@fb.com> Reviewed-by: Omar Sandoval <osandov@fb.com>
1 parent cc71a6f commit fd2d332

File tree

2 files changed

+25
-8
lines changed

2 files changed

+25
-8
lines changed

block/blk-mq.c

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1308,6 +1308,11 @@ static struct request *blk_mq_map_request(struct request_queue *q,
13081308
return rq;
13091309
}
13101310

1311+
static blk_qc_t request_to_qc_t(struct blk_mq_hw_ctx *hctx, struct request *rq)
1312+
{
1313+
return blk_tag_to_qc_t(rq->tag, hctx->queue_num, false);
1314+
}
1315+
13111316
static void blk_mq_try_issue_directly(struct request *rq, blk_qc_t *cookie)
13121317
{
13131318
int ret;
@@ -1318,7 +1323,7 @@ static void blk_mq_try_issue_directly(struct request *rq, blk_qc_t *cookie)
13181323
.list = NULL,
13191324
.last = 1
13201325
};
1321-
blk_qc_t new_cookie = blk_tag_to_qc_t(rq->tag, hctx->queue_num);
1326+
blk_qc_t new_cookie = request_to_qc_t(hctx, rq);
13221327

13231328
if (blk_mq_hctx_stopped(hctx))
13241329
goto insert;
@@ -1387,7 +1392,7 @@ static blk_qc_t blk_mq_make_request(struct request_queue *q, struct bio *bio)
13871392

13881393
wbt_track(&rq->issue_stat, wb_acct);
13891394

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

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

14971502
wbt_track(&rq->issue_stat, wb_acct);
14981503

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

15011506
if (unlikely(is_flush_fua)) {
15021507
blk_mq_bio_to_request(rq, bio);

include/linux/blk_types.h

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -232,29 +232,41 @@ static inline bool op_is_sync(unsigned int op)
232232
}
233233

234234
typedef unsigned int blk_qc_t;
235-
#define BLK_QC_T_NONE -1U
236-
#define BLK_QC_T_SHIFT 16
235+
#define BLK_QC_T_NONE -1U
236+
#define BLK_QC_T_SHIFT 16
237+
#define BLK_QC_T_INTERNAL (1U << 31)
237238

238239
static inline bool blk_qc_t_valid(blk_qc_t cookie)
239240
{
240241
return cookie != BLK_QC_T_NONE;
241242
}
242243

243-
static inline blk_qc_t blk_tag_to_qc_t(unsigned int tag, unsigned int queue_num)
244+
static inline blk_qc_t blk_tag_to_qc_t(unsigned int tag, unsigned int queue_num,
245+
bool internal)
244246
{
245-
return tag | (queue_num << BLK_QC_T_SHIFT);
247+
blk_qc_t ret = tag | (queue_num << BLK_QC_T_SHIFT);
248+
249+
if (internal)
250+
ret |= BLK_QC_T_INTERNAL;
251+
252+
return ret;
246253
}
247254

248255
static inline unsigned int blk_qc_t_to_queue_num(blk_qc_t cookie)
249256
{
250-
return cookie >> BLK_QC_T_SHIFT;
257+
return (cookie & ~BLK_QC_T_INTERNAL) >> BLK_QC_T_SHIFT;
251258
}
252259

253260
static inline unsigned int blk_qc_t_to_tag(blk_qc_t cookie)
254261
{
255262
return cookie & ((1u << BLK_QC_T_SHIFT) - 1);
256263
}
257264

265+
static inline bool blk_qc_t_is_internal(blk_qc_t cookie)
266+
{
267+
return (cookie & BLK_QC_T_INTERNAL) != 0;
268+
}
269+
258270
struct blk_issue_stat {
259271
u64 time;
260272
};

0 commit comments

Comments
 (0)