|
@@ -584,6 +584,34 @@ int blk_mq_tag_update_depth(struct blk_mq_tags *tags, unsigned int tdepth)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * blk_mq_unique_tag() - return a tag that is unique queue-wide
|
|
|
+ * @rq: request for which to compute a unique tag
|
|
|
+ *
|
|
|
+ * The tag field in struct request is unique per hardware queue but not over
|
|
|
+ * all hardware queues. Hence this function that returns a tag with the
|
|
|
+ * hardware context index in the upper bits and the per hardware queue tag in
|
|
|
+ * the lower bits.
|
|
|
+ *
|
|
|
+ * Note: When called for a request that is queued on a non-multiqueue request
|
|
|
+ * queue, the hardware context index is set to zero.
|
|
|
+ */
|
|
|
+u32 blk_mq_unique_tag(struct request *rq)
|
|
|
+{
|
|
|
+ struct request_queue *q = rq->q;
|
|
|
+ struct blk_mq_hw_ctx *hctx;
|
|
|
+ int hwq = 0;
|
|
|
+
|
|
|
+ if (q->mq_ops) {
|
|
|
+ hctx = q->mq_ops->map_queue(q, rq->mq_ctx->cpu);
|
|
|
+ hwq = hctx->queue_num;
|
|
|
+ }
|
|
|
+
|
|
|
+ return (hwq << BLK_MQ_UNIQUE_TAG_BITS) |
|
|
|
+ (rq->tag & BLK_MQ_UNIQUE_TAG_MASK);
|
|
|
+}
|
|
|
+EXPORT_SYMBOL(blk_mq_unique_tag);
|
|
|
+
|
|
|
ssize_t blk_mq_tag_sysfs_show(struct blk_mq_tags *tags, char *page)
|
|
|
{
|
|
|
char *orig_page = page;
|