Commit 17c5843d authored by Changpeng Liu's avatar Changpeng Liu Committed by Tomasz Zawadzki
Browse files

nvmf/vfio-user: don't block DSM command in vfio-user



Previously we only process Read/Write/Flush IO commands, we should
not block the DSM command in vfio-user layer if the backend block
device can support it.

Change-Id: Ia6b90397adcc36015f331f011a5bdf3e3d6562d8
Signed-off-by: default avatarChangpeng Liu <changpeng.liu@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/6525


Community-CI: Broadcom CI
Community-CI: Mellanox Build Bot
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
parent d5bcc16d
Loading
Loading
Loading
Loading
+28 −35
Original line number Diff line number Diff line
@@ -2003,20 +2003,25 @@ get_nvmf_req(struct nvmf_vfio_user_qpair *qpair)
static int
get_nvmf_io_req_length(struct spdk_nvmf_request *req)
{
	uint16_t nlb;
	uint16_t nlb, nr;
	uint32_t nsid;
	struct spdk_nvme_cmd *cmd = &req->cmd->nvme_cmd;
	struct spdk_nvmf_ctrlr *ctrlr = req->qpair->ctrlr;
	struct spdk_nvmf_ns *ns;

	nsid = cmd->nsid;
	nlb = (cmd->cdw12 & 0x0000ffffu) + 1;
	ns = _nvmf_subsystem_get_ns(ctrlr->subsys, nsid);
	if (ns == NULL || ns->bdev == NULL) {
		SPDK_ERRLOG("unsuccessful query for nsid %u\n", cmd->nsid);
		return -EINVAL;
	}

	if (cmd->opc == SPDK_NVME_OPC_DATASET_MANAGEMENT) {
		nr = cmd->cdw10_bits.dsm.nr + 1;
		return nr * sizeof(struct spdk_nvme_dsm_range);
	}

	nlb = (cmd->cdw12 & 0x0000ffffu) + 1;
	return nlb * spdk_bdev_get_block_size(ns->bdev);
}

@@ -2067,31 +2072,19 @@ static int
map_io_cmd_req(struct nvmf_vfio_user_ctrlr *ctrlr, struct spdk_nvmf_request *req)
{
	int err = 0;
	bool remap = true;
	struct spdk_nvme_cmd *cmd;

	assert(ctrlr != NULL);
	assert(req != NULL);

	switch (req->cmd->nvme_cmd.opc) {
	case SPDK_NVME_OPC_FLUSH:
		req->xfer = SPDK_NVME_DATA_NONE;
		remap = false;
		break;
	case SPDK_NVME_OPC_READ:
		req->xfer = SPDK_NVME_DATA_CONTROLLER_TO_HOST;
		break;
	case SPDK_NVME_OPC_WRITE:
		req->xfer = SPDK_NVME_DATA_HOST_TO_CONTROLLER;
		break;
	default:
		SPDK_ERRLOG("%s: SQ%d invalid I/O request type 0x%x\n",
			    ctrlr_id(ctrlr), req->qpair->qid,
			    req->cmd->nvme_cmd.opc);
		return -EINVAL;
	cmd = &req->cmd->nvme_cmd;
	req->xfer = spdk_nvme_opc_get_data_transfer(cmd->opc);

	if (spdk_unlikely(req->xfer == SPDK_NVME_DATA_NONE)) {
		return 0;
	}

	req->data = NULL;
	if (remap) {
	/* SGL isn't supported now */
	assert(req->cmd->nvme_cmd.psdt == 0);
	err = get_nvmf_io_req_length(req);
	if (err < 0) {
@@ -2102,12 +2095,12 @@ map_io_cmd_req(struct nvmf_vfio_user_ctrlr *ctrlr, struct spdk_nvmf_request *req
	err = vfio_user_map_prps(ctrlr, &req->cmd->nvme_cmd, req->iov,
				 req->length);
	if (err < 0) {
			SPDK_ERRLOG("%s: failed to map PRP: %d\n",
				    ctrlr_id(ctrlr), err);
		SPDK_ERRLOG("%s: failed to map PRP: %d\n", ctrlr_id(ctrlr), err);
		return -EFAULT;
	}

	req->data = req->iov[0].iov_base;
	req->iovcnt = err;
	}

	return 0;
}