]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - drivers/nvme/host/fabrics.c
nvme: make fabrics command run on a separate request queue
[linux.git] / drivers / nvme / host / fabrics.c
index 5838f7cd53ac70d6ff73f9a5a58eec088d79ba57..145c210edb03ef01dde2008e1485b3c9fdb9a6d9 100644 (file)
@@ -150,7 +150,7 @@ int nvmf_reg_read32(struct nvme_ctrl *ctrl, u32 off, u32 *val)
        cmd.prop_get.fctype = nvme_fabrics_type_property_get;
        cmd.prop_get.offset = cpu_to_le32(off);
 
-       ret = __nvme_submit_sync_cmd(ctrl->admin_q, &cmd, &res, NULL, 0, 0,
+       ret = __nvme_submit_sync_cmd(ctrl->fabrics_q, &cmd, &res, NULL, 0, 0,
                        NVME_QID_ANY, 0, 0, false);
 
        if (ret >= 0)
@@ -197,7 +197,7 @@ int nvmf_reg_read64(struct nvme_ctrl *ctrl, u32 off, u64 *val)
        cmd.prop_get.attrib = 1;
        cmd.prop_get.offset = cpu_to_le32(off);
 
-       ret = __nvme_submit_sync_cmd(ctrl->admin_q, &cmd, &res, NULL, 0, 0,
+       ret = __nvme_submit_sync_cmd(ctrl->fabrics_q, &cmd, &res, NULL, 0, 0,
                        NVME_QID_ANY, 0, 0, false);
 
        if (ret >= 0)
@@ -243,7 +243,7 @@ int nvmf_reg_write32(struct nvme_ctrl *ctrl, u32 off, u32 val)
        cmd.prop_set.offset = cpu_to_le32(off);
        cmd.prop_set.value = cpu_to_le64(val);
 
-       ret = __nvme_submit_sync_cmd(ctrl->admin_q, &cmd, NULL, NULL, 0, 0,
+       ret = __nvme_submit_sync_cmd(ctrl->fabrics_q, &cmd, NULL, NULL, 0, 0,
                        NVME_QID_ANY, 0, 0, false);
        if (unlikely(ret))
                dev_err(ctrl->device,
@@ -396,7 +396,7 @@ int nvmf_connect_admin_queue(struct nvme_ctrl *ctrl)
        strncpy(data->subsysnqn, ctrl->opts->subsysnqn, NVMF_NQN_SIZE);
        strncpy(data->hostnqn, ctrl->opts->host->nqn, NVMF_NQN_SIZE);
 
-       ret = __nvme_submit_sync_cmd(ctrl->admin_q, &cmd, &res,
+       ret = __nvme_submit_sync_cmd(ctrl->fabrics_q, &cmd, &res,
                        data, sizeof(*data), 0, NVME_QID_ANY, 1,
                        BLK_MQ_REQ_RESERVED | BLK_MQ_REQ_NOWAIT, false);
        if (ret) {
@@ -578,7 +578,7 @@ bool __nvmf_check_ready(struct nvme_ctrl *ctrl, struct request *rq,
        switch (ctrl->state) {
        case NVME_CTRL_NEW:
        case NVME_CTRL_CONNECTING:
-               if (req->cmd->common.opcode == nvme_fabrics_command &&
+               if (nvme_is_fabrics(req->cmd) &&
                    req->cmd->fabrics.fctype == nvme_fabrics_type_connect)
                        return true;
                break;
@@ -611,6 +611,7 @@ static const match_table_t opt_tokens = {
        { NVMF_OPT_DATA_DIGEST,         "data_digest"           },
        { NVMF_OPT_NR_WRITE_QUEUES,     "nr_write_queues=%d"    },
        { NVMF_OPT_NR_POLL_QUEUES,      "nr_poll_queues=%d"     },
+       { NVMF_OPT_TOS,                 "tos=%d"                },
        { NVMF_OPT_ERR,                 NULL                    }
 };
 
@@ -632,6 +633,7 @@ static int nvmf_parse_options(struct nvmf_ctrl_options *opts,
        opts->duplicate_connect = false;
        opts->hdr_digest = false;
        opts->data_digest = false;
+       opts->tos = -1; /* < 0 == use transport default */
 
        options = o = kstrdup(buf, GFP_KERNEL);
        if (!options)
@@ -856,6 +858,22 @@ static int nvmf_parse_options(struct nvmf_ctrl_options *opts,
                        }
                        opts->nr_poll_queues = token;
                        break;
+               case NVMF_OPT_TOS:
+                       if (match_int(args, &token)) {
+                               ret = -EINVAL;
+                               goto out;
+                       }
+                       if (token < 0) {
+                               pr_err("Invalid type of service %d\n", token);
+                               ret = -EINVAL;
+                               goto out;
+                       }
+                       if (token > 255) {
+                               pr_warn("Clamping type of service to 255\n");
+                               token = 255;
+                       }
+                       opts->tos = token;
+                       break;
                default:
                        pr_warn("unknown parameter or missing value '%s' in ctrl creation request\n",
                                p);