nvmet: add passthru io timeout value attr
authorChaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
Tue, 10 Nov 2020 00:33:44 +0000 (16:33 -0800)
committerChristoph Hellwig <hch@lst.de>
Tue, 1 Dec 2020 19:36:35 +0000 (20:36 +0100)
NVMeOF controller in the passsthru mode is capable of handling wide set
of I/O commands including vender specific passhtru io comands.

The vendor specific I/O commands are used to read the large drive
logs and can take longer than default NVMe commands, i.e. for
passthru requests the timeout value may differ from the passthru
controller's default timeout values (nvme-core:io_timeout).

Add a configfs attribute so that user can set the io timeout values.
In case if this configfs value is not set nvme_alloc_request() will set
the NVME_IO_TIMEOUT value when request queuedata is NULL.

Signed-off-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
drivers/nvme/target/configfs.c
drivers/nvme/target/nvmet.h
drivers/nvme/target/passthru.c

index 781157a654e95636e7a3789985eea7b93bf7783b..c61ffd76706263cb6c6939df0c9a0c9fa762894b 100644 (file)
@@ -755,10 +755,30 @@ static ssize_t nvmet_passthru_admin_timeout_store(struct config_item *item,
 }
 CONFIGFS_ATTR(nvmet_passthru_, admin_timeout);
 
+static ssize_t nvmet_passthru_io_timeout_show(struct config_item *item,
+               char *page)
+{
+       return sprintf(page, "%u\n", to_subsys(item->ci_parent)->io_timeout);
+}
+
+static ssize_t nvmet_passthru_io_timeout_store(struct config_item *item,
+               const char *page, size_t count)
+{
+       struct nvmet_subsys *subsys = to_subsys(item->ci_parent);
+       unsigned int timeout;
+
+       if (kstrtouint(page, 0, &timeout))
+               return -EINVAL;
+       subsys->io_timeout = timeout;
+       return count;
+}
+CONFIGFS_ATTR(nvmet_passthru_, io_timeout);
+
 static struct configfs_attribute *nvmet_passthru_attrs[] = {
        &nvmet_passthru_attr_device_path,
        &nvmet_passthru_attr_enable,
        &nvmet_passthru_attr_admin_timeout,
+       &nvmet_passthru_attr_io_timeout,
        NULL,
 };
 
index a0c80e5179a276bedc82398b65e3c8b9582f18f2..2f9635273629287fb7686b7fe942b3dba5e1bb2b 100644 (file)
@@ -250,6 +250,7 @@ struct nvmet_subsys {
        char                    *passthru_ctrl_path;
        struct config_group     passthru_group;
        unsigned int            admin_timeout;
+       unsigned int            io_timeout;
 #endif /* CONFIG_NVME_TARGET_PASSTHRU */
 };
 
index b496682ccf85927b6152ed0b24b56f3eb0c87692..a062398305a76d08a72f8b4562b7fbde1a5bba62 100644 (file)
@@ -227,7 +227,7 @@ static void nvmet_passthru_execute_cmd(struct nvmet_req *req)
        struct request_queue *q = ctrl->admin_q;
        struct nvme_ns *ns = NULL;
        struct request *rq = NULL;
-       unsigned int timeout = 0;
+       unsigned int timeout;
        u32 effects;
        u16 status;
        int ret;
@@ -243,6 +243,7 @@ static void nvmet_passthru_execute_cmd(struct nvmet_req *req)
                }
 
                q = ns->queue;
+               timeout = req->sq->ctrl->subsys->io_timeout;
        } else {
                timeout = req->sq->ctrl->subsys->admin_timeout;
        }