Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0e62f51f authored by Jens Axboe's avatar Jens Axboe
Browse files

blk-mq: let blk_mq_tag_to_rq() take blk_mq_tags as the main parameter



We currently pass in the hardware queue, and get the tags from there.
But from scsi-mq, with a shared tag space, it's a lot more convenient
to pass in the blk_mq_tags instead as the hardware queue isn't always
directly available. So instead of having to re-map to a given
hardware queue from rq->mq_ctx, just pass in the tags structure.

Signed-off-by: default avatarJens Axboe <axboe@fb.com>
parent f899fed4
Loading
Loading
Loading
Loading
+12 −7
Original line number Diff line number Diff line
@@ -529,15 +529,20 @@ void blk_mq_kick_requeue_list(struct request_queue *q)
}
EXPORT_SYMBOL(blk_mq_kick_requeue_list);

struct request *blk_mq_tag_to_rq(struct blk_mq_hw_ctx *hctx, unsigned int tag)
static inline bool is_flush_request(struct request *rq, unsigned int tag)
{
	struct request_queue *q = hctx->queue;
	return ((rq->cmd_flags & REQ_FLUSH_SEQ) &&
			rq->q->flush_rq->tag == tag);
}

	if ((q->flush_rq->cmd_flags & REQ_FLUSH_SEQ) &&
	    q->flush_rq->tag == tag)
		return q->flush_rq;
struct request *blk_mq_tag_to_rq(struct blk_mq_tags *tags, unsigned int tag)
{
	struct request *rq = tags->rqs[tag];

	if (!is_flush_request(rq, tag))
		return rq;

	return hctx->tags->rqs[tag];
	return rq->q->flush_rq;
}
EXPORT_SYMBOL(blk_mq_tag_to_rq);

@@ -566,7 +571,7 @@ static void blk_mq_timeout_check(void *__data, unsigned long *free_tags)
		if (tag >= hctx->tags->nr_tags)
			break;

		rq = blk_mq_tag_to_rq(hctx, tag++);
		rq = blk_mq_tag_to_rq(hctx->tags, tag++);
		if (rq->q != hctx->queue)
			continue;
		if (!test_bit(REQ_ATOM_STARTED, &rq->atomic_flags))
+3 −1
Original line number Diff line number Diff line
@@ -193,7 +193,9 @@ static void mtip_put_int_command(struct driver_data *dd, struct mtip_cmd *cmd)
static struct request *mtip_rq_from_tag(struct driver_data *dd,
					unsigned int tag)
{
	return blk_mq_tag_to_rq(dd->queue->queue_hw_ctx[0], tag);
	struct blk_mq_hw_ctx *hctx = dd->queue->queue_hw_ctx[0];

	return blk_mq_tag_to_rq(hctx->tags, tag);
}

static struct mtip_cmd *mtip_cmd_from_tag(struct driver_data *dd,
+1 −1
Original line number Diff line number Diff line
@@ -155,7 +155,7 @@ void blk_mq_free_request(struct request *rq);
bool blk_mq_can_queue(struct blk_mq_hw_ctx *);
struct request *blk_mq_alloc_request(struct request_queue *q, int rw,
		gfp_t gfp, bool reserved);
struct request *blk_mq_tag_to_rq(struct blk_mq_hw_ctx *hctx, unsigned int tag);
struct request *blk_mq_tag_to_rq(struct blk_mq_tags *tags, unsigned int tag);

struct blk_mq_hw_ctx *blk_mq_map_queue(struct request_queue *, const int ctx_index);
struct blk_mq_hw_ctx *blk_mq_alloc_single_hw_queue(struct blk_mq_tag_set *, unsigned int, int);