Commit 485cb2a6 authored by Konrad Sztyber's avatar Konrad Sztyber Committed by Tomasz Zawadzki
Browse files

nvme/tcp: ensure PDUs aren't removed from send_queue before enqueue



PDUs are enqueued on the send_queue in _tcp_write_pdu(), so when an
error happens earlier, we need to make sure they're enqueued before
calling pdu_write_done().

Also, while here, removed the underscore from _pdu_write_done(), as it
wasn't necessary (there was no functions with the same name without the
underscore).

Signed-off-by: default avatarKonrad Sztyber <konrad.sztyber@intel.com>
Change-Id: I6784baff13b6f1b85d21207c49b9045886a350c9
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/18766


Reviewed-by: default avatarAleksey Marchuk <alexeymar@nvidia.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <smatsumoto@nvidia.com>
parent 2fca6fef
Loading
Loading
Loading
Loading
+15 −4
Original line number Diff line number Diff line
@@ -379,7 +379,7 @@ nvme_tcp_ctrlr_destruct(struct spdk_nvme_ctrlr *ctrlr)
}

static void
_pdu_write_done(void *cb_arg, int err)
pdu_write_done(void *cb_arg, int err)
{
	struct nvme_tcp_pdu *pdu = cb_arg;
	struct nvme_tcp_qpair *tqpair = pdu->qpair;
@@ -415,6 +415,17 @@ _pdu_write_done(void *cb_arg, int err)
	pdu->cb_fn(pdu->cb_arg);
}

static void
pdu_write_fail(struct nvme_tcp_pdu *pdu, int status)
{
	struct nvme_tcp_qpair *tqpair = pdu->qpair;

	/* This function is similar to pdu_write_done(), but it should be called before a PDU is
	 * sent over the socket */
	TAILQ_INSERT_TAIL(&tqpair->send_queue, pdu, tailq);
	pdu_write_done(pdu, status);
}

static void
_tcp_write_pdu(struct nvme_tcp_pdu *pdu)
{
@@ -428,10 +439,10 @@ _tcp_write_pdu(struct nvme_tcp_pdu *pdu)
	if (spdk_unlikely(mapped_length < pdu->data_len)) {
		SPDK_ERRLOG("could not map the whole %u bytes (mapped only %u bytes)\n", pdu->data_len,
			    mapped_length);
		_pdu_write_done(pdu, -EINVAL);
		pdu_write_done(pdu, -EINVAL);
		return;
	}
	pdu->sock_req.cb_fn = _pdu_write_done;
	pdu->sock_req.cb_fn = pdu_write_done;
	pdu->sock_req.cb_arg = pdu;
	tqpair->stats->submitted_requests++;
	spdk_sock_writev_async(tqpair->sock, &pdu->sock_req);
@@ -444,7 +455,7 @@ pdu_accel_compute_crc32_done(void *cb_arg, int status)

	if (spdk_unlikely(status)) {
		SPDK_ERRLOG("Failed to compute the data digest for pdu =%p\n", pdu);
		_pdu_write_done(pdu, status);
		pdu_write_fail(pdu, status);
		return;
	}