Commit 96e49d0d authored by Changpeng Liu's avatar Changpeng Liu Committed by Tomasz Zawadzki
Browse files

sock/posix: retry for partial and pending request in interrupt mode



When running in interrupt mode, NVMeoF TCP doesn't have a chance
to flush PDU again if partial flush happened, so here return correct
errno to let NVMeoF TCP doing more retries to flush one PDU completely.

Even for a full flush request in interrupt mode, the `sock->queued_reqs`
list maybe not empty, we let the caller to do more retries for this case
too.

Fix issue #3697.

Change-Id: I01edf17a2b31b67f41f170c8a479a940294ac4c5
Signed-off-by: default avatarChangpeng Liu <changpeliu@tencent.com>
Reviewed-on: https://review.spdk.io/c/spdk/spdk/+/26263


Tested-by: default avatarSPDK Automated Test System <spdkbot@gmail.com>
Reviewed-by: default avatarKonrad Sztyber <ksztyber@nvidia.com>
Community-CI: Mellanox Build Bot
Reviewed-by: default avatarJim Harris <jim.harris@nvidia.com>
Reviewed-by: default avatarGangCao <gang.cao@intel.com>
parent e4febd9c
Loading
Loading
Loading
Loading
+11 −2
Original line number Diff line number Diff line
@@ -1459,6 +1459,11 @@ _sock_flush(struct spdk_sock *sock)
			if (len > (size_t)rc) {
				/* This element was partially sent. */
				req->internal.offset += rc;
				/* Caller in interrupt mode should retry for partial flush */
				if (spdk_unlikely(spdk_interrupt_mode_is_enabled())) {
					errno = EAGAIN;
					return -1;
				}
				return 0;
			}

@@ -1481,11 +1486,15 @@ _sock_flush(struct spdk_sock *sock)
			}
		}

		req = TAILQ_FIRST(&sock->queued_reqs);
		if (rc == 0) {
			/* Caller in interrupt mode should retry for rest pending requests */
			if (spdk_unlikely(spdk_interrupt_mode_is_enabled()) && req) {
				errno = EAGAIN;
				return -1;
			}
			break;
		}

		req = TAILQ_FIRST(&sock->queued_reqs);
	}

	return 0;