vhost_nvme: add support for bdev_io_wait implement

according to commit:
     bdev: add spdk_bdev_queue_io_wait
This patch will make io_wait to support vhost_nvme

Change-Id: I20f7c9f2005a0d4140db9ff2d522fb5e15356cd5
Signed-off-by: Ni Xun <nixun@baidu.com>
Signed-off-by: Li Lin <lilin24@baidu.com>
Signed-off-by: Zhang Yu <zhangyu31@baidu.com>
Reviewed-on: https://review.gerrithub.io/425884
Reviewed-by: Changpeng Liu <changpeng.liu@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Chandler-Test-Pool: SPDK Automated Test System <sys_sgsw@intel.com>
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
This commit is contained in:
Ni Xun 2018-09-18 11:32:15 +08:00 committed by Jim Harris
parent d5132e871c
commit b65b033758

View File

@ -107,6 +107,11 @@ struct spdk_vhost_nvme_task {
/** Offset in current iovec. */ /** Offset in current iovec. */
uint32_t iov_offset; uint32_t iov_offset;
/* for bdev_io_wait */
struct spdk_bdev_io_wait_entry bdev_io_wait;
struct spdk_vhost_nvme_sq *sq;
struct spdk_vhost_nvme_ns *ns;
/* parent pointer. */ /* parent pointer. */
struct spdk_vhost_nvme_task *parent; struct spdk_vhost_nvme_task *parent;
uint8_t dnr; uint8_t dnr;
@ -150,6 +155,10 @@ static const struct spdk_vhost_dev_backend spdk_vhost_nvme_device_backend;
*/ */
#define FW_VERSION SPDK_VERSION_MAJOR_STRING SPDK_VERSION_MINOR_STRING SPDK_VERSION_PATCH_STRING #define FW_VERSION SPDK_VERSION_MAJOR_STRING SPDK_VERSION_MINOR_STRING SPDK_VERSION_PATCH_STRING
static int
spdk_nvme_process_sq(struct spdk_vhost_nvme_dev *nvme, struct spdk_vhost_nvme_sq *sq,
struct spdk_vhost_nvme_task *task);
static struct spdk_vhost_nvme_dev * static struct spdk_vhost_nvme_dev *
to_nvme_dev(struct spdk_vhost_dev *vdev) to_nvme_dev(struct spdk_vhost_dev *vdev)
{ {
@ -411,6 +420,39 @@ spdk_vhost_nvme_get_ns_from_nsid(struct spdk_vhost_nvme_dev *dev, uint32_t nsid)
return &dev->ns[nsid - 1]; return &dev->ns[nsid - 1];
} }
static void
vhost_nvme_resubmit_task(void *arg)
{
struct spdk_vhost_nvme_task *task = (struct spdk_vhost_nvme_task *)arg;
int rc;
rc = spdk_nvme_process_sq(task->nvme, task->sq, task);
if (rc) {
SPDK_DEBUGLOG(SPDK_LOG_VHOST_NVME, "vhost_nvme: task resubmit failed, rc = %d.\n", rc);
}
}
static int
vhost_nvme_queue_task(struct spdk_vhost_nvme_task *task)
{
int rc;
task->bdev_io_wait.bdev = task->ns->bdev;
task->bdev_io_wait.cb_fn = vhost_nvme_resubmit_task;
task->bdev_io_wait.cb_arg = task;
rc = spdk_bdev_queue_io_wait(task->ns->bdev, task->ns->bdev_io_channel, &task->bdev_io_wait);
if (rc != 0) {
SPDK_ERRLOG("Queue io failed in vhost_nvme_queue_task, rc=%d.\n", rc);
task->dnr = 1;
task->sct = SPDK_NVME_SCT_GENERIC;
task->sc = SPDK_NVME_SC_INTERNAL_DEVICE_ERROR;
spdk_vhost_nvme_task_complete(task);
}
return rc;
}
static int static int
spdk_nvme_process_sq(struct spdk_vhost_nvme_dev *nvme, struct spdk_vhost_nvme_sq *sq, spdk_nvme_process_sq(struct spdk_vhost_nvme_dev *nvme, struct spdk_vhost_nvme_sq *sq,
struct spdk_vhost_nvme_task *task) struct spdk_vhost_nvme_task *task)
@ -443,6 +485,8 @@ spdk_nvme_process_sq(struct spdk_vhost_nvme_dev *nvme, struct spdk_vhost_nvme_sq
task->cqid = sq->cqid; task->cqid = sq->cqid;
task->sqid = sq->sqid; task->sqid = sq->sqid;
task->ns = ns;
if (spdk_unlikely(!ns->active_ns)) { if (spdk_unlikely(!ns->active_ns)) {
task->dnr = 1; task->dnr = 1;
task->sct = SPDK_NVME_SCT_GENERIC; task->sct = SPDK_NVME_SCT_GENERIC;
@ -531,6 +575,11 @@ spdk_nvme_process_sq(struct spdk_vhost_nvme_dev *nvme, struct spdk_vhost_nvme_sq
} }
if (spdk_unlikely(ret)) { if (spdk_unlikely(ret)) {
if (ret == -ENOMEM) {
SPDK_DEBUGLOG(SPDK_LOG_VHOST_NVME, "No memory, start to queue io.\n");
task->sq = sq;
ret = vhost_nvme_queue_task(task);
} else {
/* post error status to cqe */ /* post error status to cqe */
SPDK_ERRLOG("Error Submission For Command %u, ret %d\n", cmd->opc, ret); SPDK_ERRLOG("Error Submission For Command %u, ret %d\n", cmd->opc, ret);
task->dnr = 1; task->dnr = 1;
@ -538,6 +587,7 @@ spdk_nvme_process_sq(struct spdk_vhost_nvme_dev *nvme, struct spdk_vhost_nvme_sq
task->sc = SPDK_NVME_SC_INTERNAL_DEVICE_ERROR; task->sc = SPDK_NVME_SC_INTERNAL_DEVICE_ERROR;
spdk_vhost_nvme_task_complete(task); spdk_vhost_nvme_task_complete(task);
} }
}
return ret; return ret;
} }