Commit c7094274 authored by Maciej Szulik's avatar Maciej Szulik Committed by Jim Harris
Browse files

sock: fix wrap around for zcopy request



Kernel can use the whole range of uint32 to report a completion index.
We can miss one by wrapping from UINT32_MAX to 1.

Fixes issue #3600.

Signed-off-by: default avatarMaciej Szulik <maciej.szulik@intel.com>
Reported-by: Ariel Marcovitch
Change-Id: Ide1bb31ec2d59059adb7564d0b7699a781942301
Reviewed-on: https://review.spdk.io/c/spdk/spdk/+/25650


Reviewed-by: default avatarJacek Kalwas <jacek.kalwas@nutanix.com>
Community-CI: Mellanox Build Bot
Reviewed-by: default avatarAleksey Marchuk <alexeymar@nvidia.com>
Reviewed-by: default avatarGangCao <gang.cao@intel.com>
Reviewed-by: default avatarJim Harris <jim.harris@nvidia.com>
Tested-by: default avatarSPDK Automated Test System <spdkbot@gmail.com>
Reviewed-by: default avatarBen Walker <ben@nvidia.com>
parent dca18c42
Loading
Loading
Loading
Loading
+1 −7
Original line number Diff line number Diff line
@@ -1401,14 +1401,8 @@ _sock_flush(struct spdk_sock *sock)
	sent = rc;

	if (is_zcopy) {
		/* Handling overflow case, because we use psock->sendmsg_idx - 1 for the
		 * req->internal.offset, so sendmsg_idx should not be zero  */
		if (spdk_unlikely(psock->sendmsg_idx == UINT32_MAX)) {
			psock->sendmsg_idx = 1;
		} else {
		psock->sendmsg_idx++;
	}
	}

	/* Consume the requests that were actually written */
	req = TAILQ_FIRST(&sock->queued_reqs);
+1 −7
Original line number Diff line number Diff line
@@ -1091,14 +1091,8 @@ sock_complete_write_reqs(struct spdk_sock *_sock, ssize_t rc, bool is_zcopy)
	int retval;

	if (is_zcopy) {
		/* Handling overflow case, because we use psock->sendmsg_idx - 1 for the
		 * req->internal.offset, so sendmsg_idx should not be zero */
		if (spdk_unlikely(sock->sendmsg_idx == UINT32_MAX)) {
			sock->sendmsg_idx = 1;
		} else {
		sock->sendmsg_idx++;
	}
	}

	/* Consume the requests that were actually written */
	req = TAILQ_FIRST(&_sock->queued_reqs);