From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: passt.top; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: passt.top; dkim=pass (2048-bit key; secure) header.d=gibson.dropbear.id.au header.i=@gibson.dropbear.id.au header.a=rsa-sha256 header.s=202508 header.b=hirpVf43; dkim-atps=neutral Received: from mail.ozlabs.org (mail.ozlabs.org [IPv6:2404:9400:2221:ea00::3]) by passt.top (Postfix) with ESMTPS id DFC855A027E for ; Mon, 18 Aug 2025 05:04:20 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gibson.dropbear.id.au; s=202508; t=1755486257; bh=2lcdtbowPwuYiwUU7lzGZ+1g6czTzP5TXSGTcQ2J1gE=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=hirpVf439LGrHqBgae0PVP2QqxE2z9oY9prr0j649AbsJr9gZve9qRoTdBY/YwbQu G/Oz1z+2kgRRj0kVwUw9wwZwE4DP+xNCGxj7InOirLbSerZJMJoE+hFDCBXFgfysGK o5wKQNCft/3oXnU/ialr3OEclJh8+zDmTyIU/kV36waCmfIp5DFutB7AqreZm6+Psl ta4lGrp6Bu+38Duk5Kaeg7LA+DrirMsT90NVVjPSJTUpHvlCLTbxbb1v82qKb//Qiq IlRj+8GwoFEpBENGQ6y1f/OwJinoBAJZtFb1OyRySkkJvuCGlJ/RYHzDoLwgBQtQYC 2WSoHTdGye/xg== Received: by gandalf.ozlabs.org (Postfix, from userid 1007) id 4c4yH534vpz4x2g; Mon, 18 Aug 2025 13:04:17 +1000 (AEST) Date: Mon, 18 Aug 2025 12:49:17 +1000 From: David Gibson To: Stefano Brivio Subject: Re: [PATCH 3/6] tcp: Rewind sequence when guest shrinks window to zero Message-ID: References: <20250815161042.3606244-1-sbrivio@redhat.com> <20250815161042.3606244-4-sbrivio@redhat.com> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha512; protocol="application/pgp-signature"; boundary="09t3RDB5Lg7iDltS" Content-Disposition: inline In-Reply-To: <20250815161042.3606244-4-sbrivio@redhat.com> Message-ID-Hash: WICHRXQRKKRJJDHHKP3SBSYEU22KRZMY X-Message-ID-Hash: WICHRXQRKKRJJDHHKP3SBSYEU22KRZMY X-MailFrom: dgibson@gandalf.ozlabs.org X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: passt-dev@passt.top, Jon Maloy , Paul Holzinger X-Mailman-Version: 3.3.8 Precedence: list List-Id: Development discussion and patches for passt Archived-At: Archived-At: List-Archive: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: --09t3RDB5Lg7iDltS Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Fri, Aug 15, 2025 at 06:10:39PM +0200, Stefano Brivio wrote: > A window shrunk to zero means by definition that anything else that > might be in flight is now out of window. Restart from the currently > acknowledged sequence. >=20 > Suggested-by: Jon Maloy > Signed-off-by: Stefano Brivio Reviewed-by: David Gibson > --- > tcp.c | 25 ++++++++++++++++--------- > 1 file changed, 16 insertions(+), 9 deletions(-) >=20 > diff --git a/tcp.c b/tcp.c > index 1402ca2..dda0a2e 100644 > --- a/tcp.c > +++ b/tcp.c > @@ -1257,19 +1257,25 @@ static void tcp_get_tap_ws(struct tcp_tap_conn *c= onn, > =20 > /** > * tcp_tap_window_update() - Process an updated window from tap side > + * @c: Execution context > * @conn: Connection pointer > * @wnd: Window value, host order, unscaled > */ > -static void tcp_tap_window_update(struct tcp_tap_conn *conn, unsigned wn= d) > +static void tcp_tap_window_update(const struct ctx *c, > + struct tcp_tap_conn *conn, unsigned wnd) > { > wnd =3D MIN(MAX_WINDOW, wnd << conn->ws_from_tap); > =20 > /* Work-around for bug introduced in peer kernel code, commit > - * e2142825c120 ("net: tcp: send zero-window ACK when no memory"). > - * We don't update if window shrank to zero. > + * e2142825c120 ("net: tcp: send zero-window ACK when no memory"): don't > + * update the window if it shrank to zero, so that we'll eventually > + * retry to send data, but rewind the sequence as that obviously implies > + * that no data beyond the updated window will ever be acknowledged. > */ > - if (!wnd && SEQ_LT(conn->seq_ack_from_tap, conn->seq_to_tap)) > + if (!wnd && SEQ_LT(conn->seq_ack_from_tap, conn->seq_to_tap)) { > + tcp_rewind_seq(c, conn); > return; > + } > =20 > conn->wnd_from_tap =3D MIN(wnd >> conn->ws_from_tap, USHRT_MAX); > =20 > @@ -1694,7 +1700,8 @@ static int tcp_data_from_tap(const struct ctx *c, s= truct tcp_tap_conn *conn, > tcp_timer_ctl(c, conn); > =20 > if (p->count =3D=3D 1) { > - tcp_tap_window_update(conn, ntohs(th->window)); > + tcp_tap_window_update(c, conn, > + ntohs(th->window)); > return 1; > } > =20 > @@ -1772,7 +1779,7 @@ static int tcp_data_from_tap(const struct ctx *c, s= truct tcp_tap_conn *conn, > if (ack && !tcp_sock_consume(conn, max_ack_seq)) > tcp_update_seqack_from_tap(c, conn, max_ack_seq); > =20 > - tcp_tap_window_update(conn, max_ack_seq_wnd); > + tcp_tap_window_update(c, conn, max_ack_seq_wnd); > =20 > if (retr) { > flow_trace(conn, > @@ -1861,7 +1868,7 @@ static void tcp_conn_from_sock_finish(const struct = ctx *c, > const struct tcphdr *th, > const char *opts, size_t optlen) > { > - tcp_tap_window_update(conn, ntohs(th->window)); > + tcp_tap_window_update(c, conn, ntohs(th->window)); > tcp_get_tap_ws(conn, opts, optlen); > =20 > /* First value is not scaled */ > @@ -2059,7 +2066,7 @@ int tcp_tap_handler(const struct ctx *c, uint8_t pi= f, sa_family_t af, > if (!th->ack) > goto reset; > =20 > - tcp_tap_window_update(conn, ntohs(th->window)); > + tcp_tap_window_update(c, conn, ntohs(th->window)); > =20 > tcp_data_from_sock(c, conn); > =20 > @@ -2071,7 +2078,7 @@ int tcp_tap_handler(const struct ctx *c, uint8_t pi= f, sa_family_t af, > if (conn->events & TAP_FIN_RCVD) { > tcp_sock_consume(conn, ntohl(th->ack_seq)); > tcp_update_seqack_from_tap(c, conn, ntohl(th->ack_seq)); > - tcp_tap_window_update(conn, ntohs(th->window)); > + tcp_tap_window_update(c, conn, ntohs(th->window)); > tcp_data_from_sock(c, conn); > =20 > if (conn->events & SOCK_FIN_RCVD && --=20 David Gibson (he or they) | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you, not the other way | around. http://www.ozlabs.org/~dgibson --09t3RDB5Lg7iDltS Content-Type: application/pgp-signature; name=signature.asc -----BEGIN PGP SIGNATURE----- iQIzBAEBCgAdFiEEO+dNsU4E3yXUXRK2zQJF27ox2GcFAmiilKwACgkQzQJF27ox 2GdpkQ/+JJLXy9Acm6DuKdFX1fRAFYD0okDASYrVxOb7biDwHPFfAmGiulIJe7YX Pbo4+zRT/ZF8DJglESzYdUJLyCUxwgvYZZhQLktQZGDQpbU+/6iFDGxOEsB3Nka3 dJ1WRt5DlkFGX43gEGpPOd/udRFA1Q8JI7ZUZt1FSaTTYHWT3wOQLHW0NPS9i5XA uFFBIoN/urzq9D9lzvKOQTCVUTxfuleU1L5z0KTX0egDNz/V8dAwoOaGqzmpP7xT XDEVedTyBbWcQiPluLnaKhB4TvzJUEo/819GF0GpTmwwTvUXuCJOM4QBKSUn02Vj mxhO0niz+//PgAy66iOl/Yt6T8pMBKZpQHwH7tP+u8RMikK6tuTHon5jBBgUZBob 15EEZyg+4dX6isbSLTmSUy9qGQWMGPPQg4/gXAowqnBenfcsSDxctxWfNgIpUS4V 4f97kzFDh7J5xu3mrYUAnmcVcihavdsN/59YnaHJ0/zagX+1+2L7uSRqfqMqLvrp +CtKY1u6ZangeHNfknjM8sTFTVRA1n2Ujlx/TIh6l1QQ2JiB3gtInrMfL8M1CykK s1yRYVEk3r7N/1YcC9gD0y4hAk3c+LfXjjl/O67F3dN45wDOMsW2Je2tI4uhkACJ KxMXfVyQnCOF46eDcFzJV8uVlk/sftzRrzUiouWHmTitvPU9eMg= =kn/X -----END PGP SIGNATURE----- --09t3RDB5Lg7iDltS--