From 24d93aa9e66e6ff97fe1dc4bcc618b285ee260c4 Mon Sep 17 00:00:00 2001 From: Konrad Sztyber Date: Mon, 6 Dec 2021 13:48:51 +0100 Subject: [PATCH] nvmf: execute zcopy requests through process_io_cmd The zcopy_start requests are now executed through nvmf_ctrlr_process_io_cmd. It makes the zero-copy share checks with the regular IO path. Note, that zcopy_end doesn't utilize this path and is directly submitted to the bdev layer, as it doesn't need to perform these checks (they were already verified in the accompanying zcopy_start). Signed-off-by: Konrad Sztyber Change-Id: Ic9ffecb15e7c351a9d60e731cc711d6500b845db Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/10785 Community-CI: Broadcom CI Community-CI: Mellanox Build Bot Reviewed-by: Ben Walker Reviewed-by: Jim Harris Reviewed-by: Aleksey Marchuk Tested-by: SPDK CI Jenkins --- lib/nvmf/ctrlr.c | 47 ++++++++++++++++++++++++++--------------------- 1 file changed, 26 insertions(+), 21 deletions(-) diff --git a/lib/nvmf/ctrlr.c b/lib/nvmf/ctrlr.c index 24919ddae..d16d5582f 100644 --- a/lib/nvmf/ctrlr.c +++ b/lib/nvmf/ctrlr.c @@ -3873,27 +3873,32 @@ nvmf_ctrlr_process_io_cmd(struct spdk_nvmf_request *req) req->qpair->first_fused_req = NULL; } - switch (cmd->opc) { - case SPDK_NVME_OPC_READ: - return nvmf_bdev_ctrlr_read_cmd(bdev, desc, ch, req); - case SPDK_NVME_OPC_WRITE: - return nvmf_bdev_ctrlr_write_cmd(bdev, desc, ch, req); - case SPDK_NVME_OPC_COMPARE: - return nvmf_bdev_ctrlr_compare_cmd(bdev, desc, ch, req); - case SPDK_NVME_OPC_WRITE_ZEROES: - return nvmf_bdev_ctrlr_write_zeroes_cmd(bdev, desc, ch, req); - case SPDK_NVME_OPC_FLUSH: - return nvmf_bdev_ctrlr_flush_cmd(bdev, desc, ch, req); - case SPDK_NVME_OPC_DATASET_MANAGEMENT: - return nvmf_bdev_ctrlr_dsm_cmd(bdev, desc, ch, req); - case SPDK_NVME_OPC_RESERVATION_REGISTER: - case SPDK_NVME_OPC_RESERVATION_ACQUIRE: - case SPDK_NVME_OPC_RESERVATION_RELEASE: - case SPDK_NVME_OPC_RESERVATION_REPORT: - spdk_thread_send_msg(ctrlr->subsys->thread, nvmf_ns_reservation_request, req); - return SPDK_NVMF_REQUEST_EXEC_STATUS_ASYNCHRONOUS; - default: - return nvmf_bdev_ctrlr_nvme_passthru_io(bdev, desc, ch, req); + if (spdk_nvmf_request_using_zcopy(req)) { + assert(req->zcopy_phase == NVMF_ZCOPY_PHASE_INIT); + return nvmf_bdev_ctrlr_start_zcopy(bdev, desc, ch, req); + } else { + switch (cmd->opc) { + case SPDK_NVME_OPC_READ: + return nvmf_bdev_ctrlr_read_cmd(bdev, desc, ch, req); + case SPDK_NVME_OPC_WRITE: + return nvmf_bdev_ctrlr_write_cmd(bdev, desc, ch, req); + case SPDK_NVME_OPC_COMPARE: + return nvmf_bdev_ctrlr_compare_cmd(bdev, desc, ch, req); + case SPDK_NVME_OPC_WRITE_ZEROES: + return nvmf_bdev_ctrlr_write_zeroes_cmd(bdev, desc, ch, req); + case SPDK_NVME_OPC_FLUSH: + return nvmf_bdev_ctrlr_flush_cmd(bdev, desc, ch, req); + case SPDK_NVME_OPC_DATASET_MANAGEMENT: + return nvmf_bdev_ctrlr_dsm_cmd(bdev, desc, ch, req); + case SPDK_NVME_OPC_RESERVATION_REGISTER: + case SPDK_NVME_OPC_RESERVATION_ACQUIRE: + case SPDK_NVME_OPC_RESERVATION_RELEASE: + case SPDK_NVME_OPC_RESERVATION_REPORT: + spdk_thread_send_msg(ctrlr->subsys->thread, nvmf_ns_reservation_request, req); + return SPDK_NVMF_REQUEST_EXEC_STATUS_ASYNCHRONOUS; + default: + return nvmf_bdev_ctrlr_nvme_passthru_io(bdev, desc, ch, req); + } } }