Commit a2c540e3 authored by Jacek Kalwas's avatar Jacek Kalwas Committed by Tomasz Zawadzki
Browse files

nvmf: improve request layout #3



first_fused_req is touched on the hot completion path but fused commands
are not considered hot path in general. To workaround that first_fused
flag is introduced in the first cache line of the nvmf request.

Change-Id: Ibd5e9278101cbad6883e937b2830dc8e84b3cb3c
Signed-off-by: default avatarJacek Kalwas <jacek.kalwas@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/21442


Reviewed-by: default avatarJim Harris <jim.harris@samsung.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Mellanox Build Bot
Reviewed-by: default avatarKonrad Sztyber <konrad.sztyber@intel.com>
Reviewed-by: default avatarAleksey Marchuk <alexeymar@nvidia.com>
parent 4d2a5442
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -81,7 +81,8 @@ struct spdk_nvmf_request {
		struct {
			uint8_t data_from_pool		: 1;
			uint8_t dif_enabled		: 1;
			uint8_t rsvd			: 6;
			uint8_t first_fused		: 1;
			uint8_t rsvd			: 5;
		};
	};
	uint8_t				zcopy_phase; /* type enum spdk_nvmf_zcopy_phase */
+2 −0
Original line number Diff line number Diff line
@@ -4159,6 +4159,7 @@ nvmf_ctrlr_process_io_fused_cmd(struct spdk_nvmf_request *req, struct spdk_bdev

		/* save request of first command to generate response later */
		req->first_fused_req = first_fused_req;
		req->first_fused = true;
		req->qpair->first_fused_req = NULL;
	} else {
		SPDK_ERRLOG("Invalid fused command fuse field.\n");
@@ -4179,6 +4180,7 @@ nvmf_ctrlr_process_io_fused_cmd(struct spdk_nvmf_request *req, struct spdk_bdev
			/* Complete first of fused commands. Second will be completed by upper layer */
			_nvmf_request_complete(first_fused_req);
			req->first_fused_req = NULL;
			req->first_fused = false;
		}
	}

+7 −5
Original line number Diff line number Diff line
@@ -72,14 +72,15 @@ nvmf_bdev_ctrlr_complete_cmd(struct spdk_bdev_io *bdev_io, bool success,
{
	struct spdk_nvmf_request	*req = cb_arg;
	struct spdk_nvme_cpl		*response = &req->rsp->nvme_cpl;
	int				first_sc = 0, first_sct = 0, sc = 0, sct = 0;
	int				sc = 0, sct = 0;
	uint32_t			cdw0 = 0;
	struct spdk_nvmf_request	*first_req = req->first_fused_req;

	if (spdk_unlikely(first_req != NULL)) {
		/* fused commands - get status for both operations */
	if (spdk_unlikely(req->first_fused)) {
		struct spdk_nvmf_request	*first_req = req->first_fused_req;
		struct spdk_nvme_cpl		*first_response = &first_req->rsp->nvme_cpl;
		int				first_sc = 0, first_sct = 0;

		/* get status for both operations */
		spdk_bdev_io_get_nvme_fused_status(bdev_io, &cdw0, &first_sct, &first_sc, &sct, &sc);
		first_response->cdw0 = cdw0;
		first_response->status.sc = first_sc;
@@ -88,6 +89,7 @@ nvmf_bdev_ctrlr_complete_cmd(struct spdk_bdev_io *bdev_io, bool success,
		/* first request should be completed */
		spdk_nvmf_request_complete(first_req);
		req->first_fused_req = NULL;
		req->first_fused = false;
	} else {
		spdk_bdev_io_get_nvme_status(bdev_io, &cdw0, &sct, &sc);
	}