nvme: add the Apple shared tag workaround to nvme_alloc_io_tag_set
authorChristoph Hellwig <hch@lst.de>
Wed, 30 Nov 2022 16:28:48 +0000 (17:28 +0100)
committerChristoph Hellwig <hch@lst.de>
Wed, 7 Dec 2022 14:02:27 +0000 (15:02 +0100)
Add the apple shared tag workaround to nvme_alloc_io_tag_set to prepare
for using that helper in the PCIe driver.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
Reviewed-by: Chaitanya Kulkarni <kch@nvidia.com>
drivers/nvme/host/core.c

index ed163c5..9854f5d 100644 (file)
@@ -4899,7 +4899,13 @@ int nvme_alloc_io_tag_set(struct nvme_ctrl *ctrl, struct blk_mq_tag_set *set,
        memset(set, 0, sizeof(*set));
        set->ops = ops;
        set->queue_depth = ctrl->sqsize + 1;
-       if (ctrl->ops->flags & NVME_F_FABRICS)
+       /*
+        * Some Apple controllers requires tags to be unique across admin and
+        * the (only) I/O queue, so reserve the first 32 tags of the I/O queue.
+        */
+       if (ctrl->quirks & NVME_QUIRK_SHARED_TAGS)
+               set->reserved_tags = NVME_AQ_DEPTH;
+       else if (ctrl->ops->flags & NVME_F_FABRICS)
                set->reserved_tags = NVMF_RESERVED_TAGS;
        set->numa_node = ctrl->numa_node;
        set->flags = BLK_MQ_F_SHOULD_MERGE;