From nobody Wed Dec 17 03:33:59 2025 Received: from mailtransmit04.runbox.com (mailtransmit04.runbox.com [185.226.149.37]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id F38A4219312; Mon, 21 Apr 2025 21:51:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.226.149.37 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745272286; cv=none; b=i/t5K5FH49FJyWmsv9otkWy8Hq2GtV4FYxX7VpWM2iC5FCVloIKv8QCgOe2+4e52ZDexQMoJTVJSymKcF6p3Iar45ExhDo5nhEmNiCizGVZSHcqzksHQC7OeXl1ZuV8Z8++ETkSY5oD0ONfCARTvyzTGtrmLfMhiure5iNjls+E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745272286; c=relaxed/simple; bh=Wse4yBBOfc213KZWiON8OPL4gZVnS7c31xlmnDvSO4w=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Sgcn/uOH8XNudSmlwbK2++UQjekH6rj4rXuGwtY+S9CghiODXor34ptmLGHmdmnQzFrUHznra5v1ufiLCagj4CpdPk8ki4AY8tvrlivk0Txxsysp457Z7vmE4ZxbrY0PLWnQSsJ2ntFIo/zEHm7Myw+ZVtKTG02pcPGefp2WmBw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=rbox.co; spf=pass smtp.mailfrom=rbox.co; dkim=pass (2048-bit key) header.d=rbox.co header.i=@rbox.co header.b=RSdtqQhT; arc=none smtp.client-ip=185.226.149.37 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=rbox.co Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=rbox.co Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=rbox.co header.i=@rbox.co header.b="RSdtqQhT" Received: from mailtransmit03.runbox ([10.9.9.163] helo=aibo.runbox.com) by mailtransmit04.runbox.com with esmtps (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.93) (envelope-from ) id 1u6z2p-000P7q-PG; Mon, 21 Apr 2025 23:51:15 +0200 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=rbox.co; s=selector1; h=Cc:To:In-Reply-To:References:Message-Id: Content-Transfer-Encoding:Content-Type:MIME-Version:Subject:Date:From; bh=HCx4RfOmQ7VpHQRdKJQtChL1M92T4VsEIiHTk68PCLs=; b=RSdtqQhT5mo1V22DKp3equpyJt Mayi316SPCexBiAXkHGbYFOQlZaS/ULxVa2zhjE3lIKE01owkliV06slWarjezc2PU6IQOEdb6Hb2 w7uDdWqkyk+/Qtf/8KrhtMZwOBHU1udcQWrBURdx0PfR3bn5qsHxgT0liEC8C+Y7krgrw3JUDUuA4 GB9mY5dxEGgfGP5PLpEyN4SzgVsb40rh1oPGgfWH8+yZRBvJrbD9a553bdjtHf8OPU+qzjdOSfCz6 L9PZJ0vExh74jPCHeK2w6FxM8Pd3Pd0/79BYPqVJwkppO3IhJ653uNYR4lXW4N/HaolCS/PDBo9nD qSNlYSYA==; Received: from [10.9.9.73] (helo=submission02.runbox) by mailtransmit03.runbox with esmtp (Exim 4.86_2) (envelope-from ) id 1u6z2p-0000Nl-F6; Mon, 21 Apr 2025 23:51:15 +0200 Received: by submission02.runbox with esmtpsa [Authenticated ID (604044)] (TLS1.2:ECDHE_SECP256R1__RSA_PSS_RSAE_SHA256__AES_256_GCM:256) (Exim 4.93) id 1u6z2h-0056xd-H6; Mon, 21 Apr 2025 23:51:07 +0200 From: Michal Luczaj Date: Mon, 21 Apr 2025 23:50:41 +0200 Subject: [PATCH net-next v2 1/3] vsock: Linger on unsent data Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250421-vsock-linger-v2-1-fe9febd64668@rbox.co> References: <20250421-vsock-linger-v2-0-fe9febd64668@rbox.co> In-Reply-To: <20250421-vsock-linger-v2-0-fe9febd64668@rbox.co> To: Stefano Garzarella , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , "Michael S. Tsirkin" , Jason Wang , Xuan Zhuo , =?utf-8?q?Eugenio_P=C3=A9rez?= , Stefan Hajnoczi Cc: virtualization@lists.linux.dev, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, kvm@vger.kernel.org, Michal Luczaj X-Mailer: b4 0.14.2 Currently vsock's lingering effectively boils down to waiting (or timing out) until packets are consumed or dropped by the peer; be it by receiving the data, closing or shutting down the connection. To align with the semantics described in the SO_LINGER section of man socket(7) and to mimic AF_INET's behaviour more closely, change the logic of a lingering close(): instead of waiting for all data to be handled, block until data is considered sent from the vsock's transport point of view. That is until worker picks the packets for processing and decrements virtio_vsock_sock::bytes_unsent down to 0. Note that such lingering is limited to transports that actually implement vsock_transport::unsent_bytes() callback. This excludes Hyper-V and VMCI, under which no lingering would be observed. The implementation does not adhere strictly to man page's interpretation of SO_LINGER: shutdown() will not trigger the lingering. This follows AF_INET. Signed-off-by: Michal Luczaj --- net/vmw_vsock/virtio_transport_common.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/net/vmw_vsock/virtio_transport_common.c b/net/vmw_vsock/virtio= _transport_common.c index 7f7de6d8809655fe522749fbbc9025df71f071bd..aeb7f3794f7cfc251dde878cb44= fdcc54814c89c 100644 --- a/net/vmw_vsock/virtio_transport_common.c +++ b/net/vmw_vsock/virtio_transport_common.c @@ -1196,12 +1196,21 @@ static void virtio_transport_wait_close(struct sock= *sk, long timeout) { if (timeout) { DEFINE_WAIT_FUNC(wait, woken_wake_function); + ssize_t (*unsent)(struct vsock_sock *vsk); + struct vsock_sock *vsk =3D vsock_sk(sk); + + /* Some transports (Hyper-V, VMCI) do not implement + * unsent_bytes. For those, no lingering on close(). + */ + unsent =3D vsk->transport->unsent_bytes; + if (!unsent) + return; =20 add_wait_queue(sk_sleep(sk), &wait); =20 do { - if (sk_wait_event(sk, &timeout, - sock_flag(sk, SOCK_DONE), &wait)) + if (sk_wait_event(sk, &timeout, unsent(vsk) =3D=3D 0, + &wait)) break; } while (!signal_pending(current) && timeout); =20 --=20 2.49.0 From nobody Wed Dec 17 03:33:59 2025 Received: from mailtransmit05.runbox.com (mailtransmit05.runbox.com [185.226.149.38]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A72982165E9; Mon, 21 Apr 2025 21:51:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.226.149.38 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745272286; cv=none; b=OFLFpZ9xF5YvCU6GLle7bJzvq7zHSuVt/MtsBPvC53HHjghIL09tP2cRUrFdSdo/n4G5rwr0AmHCpQsxhgvUvjyWmh0wCz/OSG+fq/TzuaIScY/0k80j6zuOysV7z/XwDNtx4SajjG1bFQPbMCAKDAr5JottFD/5j9avvtx9EQw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745272286; c=relaxed/simple; bh=bHwtlyMxeHnsuncWmgegHfpg8gQ1s1DmHKYAxY8sXgk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=XaJBapN/DZ/V1cAAKTZDpNZr6iuvSRCCA428COkYdUc5r909hr0DL9nD3qRVDzWv6Zh+9b5xuZxAmcv0fP6I5sljC9jGVbaH7HDJ+u+KITfivQ9ui92VnBaoOuL1e1sr4wH0Ot3sAmrQ84ZbJU1k4o9gNDBnFC/tXnkf8zDlHzk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=rbox.co; spf=pass smtp.mailfrom=rbox.co; dkim=pass (2048-bit key) header.d=rbox.co header.i=@rbox.co header.b=O5hg71pU; arc=none smtp.client-ip=185.226.149.38 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=rbox.co Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=rbox.co Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=rbox.co header.i=@rbox.co header.b="O5hg71pU" Received: from mailtransmit02.runbox ([10.9.9.162] helo=aibo.runbox.com) by mailtransmit05.runbox.com with esmtps (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.93) (envelope-from ) id 1u6z2o-001iAs-H4; Mon, 21 Apr 2025 23:51:14 +0200 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=rbox.co; s=selector1; h=Cc:To:In-Reply-To:References:Message-Id: Content-Transfer-Encoding:Content-Type:MIME-Version:Subject:Date:From; bh=497SM9RsTvdwm5GlckzJy9eHMN+5FbxFzHDjGrgCfG0=; b=O5hg71pUdZHmXxa1Y9QOpsyloh Z8857BgHLvnJZ+g5bi0rqGZBzECQDJfDKgKPA/Pwgt7mvzSl7ZPWq3V96byIFeD3ZSuN23junglVa JXB/dotkuq/XzSErNQyCmZ0vOjyvwzBr8SFGRAnf/+yzmjdltyt2Qg0ZAlbreJqzWlZaYAWKQOvtk dcYZA0yw9aeesVfx2wbXK2zy1W177weBBSWpUoxuskFllEd94Y8KiPTBTStjVbfcvu86BBjQEIWNv GVo6n6zEqN3ieS+qgJtdRdhVE0IqyF01c0uDp8X/b+jWuAxrffn+1YsUDC2OH8CtRh20+Z2YxOBqR wnTXRS+g==; Received: from [10.9.9.73] (helo=submission02.runbox) by mailtransmit02.runbox with esmtp (Exim 4.86_2) (envelope-from ) id 1u6z2o-0008Iu-4s; Mon, 21 Apr 2025 23:51:14 +0200 Received: by submission02.runbox with esmtpsa [Authenticated ID (604044)] (TLS1.2:ECDHE_SECP256R1__RSA_PSS_RSAE_SHA256__AES_256_GCM:256) (Exim 4.93) id 1u6z2i-0056xd-9L; Mon, 21 Apr 2025 23:51:08 +0200 From: Michal Luczaj Date: Mon, 21 Apr 2025 23:50:42 +0200 Subject: [PATCH net-next v2 2/3] vsock: Reduce indentation in virtio_transport_wait_close() Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250421-vsock-linger-v2-2-fe9febd64668@rbox.co> References: <20250421-vsock-linger-v2-0-fe9febd64668@rbox.co> In-Reply-To: <20250421-vsock-linger-v2-0-fe9febd64668@rbox.co> To: Stefano Garzarella , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , "Michael S. Tsirkin" , Jason Wang , Xuan Zhuo , =?utf-8?q?Eugenio_P=C3=A9rez?= , Stefan Hajnoczi Cc: virtualization@lists.linux.dev, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, kvm@vger.kernel.org, Michal Luczaj X-Mailer: b4 0.14.2 Flatten the function. Remove the nested block by inverting the condition: return early on !timeout. No functional change intended. Suggested-by: Stefano Garzarella Signed-off-by: Michal Luczaj --- net/vmw_vsock/virtio_transport_common.c | 36 ++++++++++++++++-------------= ---- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/net/vmw_vsock/virtio_transport_common.c b/net/vmw_vsock/virtio= _transport_common.c index aeb7f3794f7cfc251dde878cb44fdcc54814c89c..73b6e7b437d950fd1cd1507f7dc= c28780bd98a0b 100644 --- a/net/vmw_vsock/virtio_transport_common.c +++ b/net/vmw_vsock/virtio_transport_common.c @@ -1194,28 +1194,28 @@ static void virtio_transport_remove_sock(struct vso= ck_sock *vsk) =20 static void virtio_transport_wait_close(struct sock *sk, long timeout) { - if (timeout) { - DEFINE_WAIT_FUNC(wait, woken_wake_function); - ssize_t (*unsent)(struct vsock_sock *vsk); - struct vsock_sock *vsk =3D vsock_sk(sk); + DEFINE_WAIT_FUNC(wait, woken_wake_function); + ssize_t (*unsent)(struct vsock_sock *vsk); + struct vsock_sock *vsk =3D vsock_sk(sk); =20 - /* Some transports (Hyper-V, VMCI) do not implement - * unsent_bytes. For those, no lingering on close(). - */ - unsent =3D vsk->transport->unsent_bytes; - if (!unsent) - return; + if (!timeout) + return; + + /* Some transports (Hyper-V, VMCI) do not implement unsent_bytes. + * For those, no lingering on close(). + */ + unsent =3D vsk->transport->unsent_bytes; + if (!unsent) + return; =20 - add_wait_queue(sk_sleep(sk), &wait); + add_wait_queue(sk_sleep(sk), &wait); =20 - do { - if (sk_wait_event(sk, &timeout, unsent(vsk) =3D=3D 0, - &wait)) - break; - } while (!signal_pending(current) && timeout); + do { + if (sk_wait_event(sk, &timeout, unsent(vsk) =3D=3D 0, &wait)) + break; + } while (!signal_pending(current) && timeout); =20 - remove_wait_queue(sk_sleep(sk), &wait); - } + remove_wait_queue(sk_sleep(sk), &wait); } =20 static void virtio_transport_cancel_close_work(struct vsock_sock *vsk, --=20 2.49.0 From nobody Wed Dec 17 03:33:59 2025 Received: from mailtransmit04.runbox.com (mailtransmit04.runbox.com [185.226.149.37]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5EB691D95A3; Mon, 21 Apr 2025 21:51:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.226.149.37 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745272285; cv=none; b=BgQJTY0VVgHJ6qzQgyFTcedurLLCQ9N1AR8SYIFBpEU/mihw5WZAeTmeFocjpfEbjtDxEzeWgjXfeqQ9jW/hN3YWPzxmYNx1OQ207jHy+ozvTiicdI+Y4ztXYVO47fa20efJRvz3ZFsEU7VJM/natvO5MqwgiW4rz/7Y3RBEDFA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745272285; c=relaxed/simple; bh=bU72gZf0Mlr4a1DTEu4p6xddG7QuL34UyWY76ya9fjA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=tfd60kmd4cwEtiIDTM/PlEgW+hHjy9l7c43Ia1FJQK1qgY3SfSEokW4eoMYdYzs7jSs8+jBciV9RO35aEceTzp52Oir7t1KG1tim85uRWOy7xgjONyRBt4LsLNJzqGss4tY9R9m+JnlinThOWcrJjFctLZfTnAYSrs+fw6PQSJ4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=rbox.co; spf=pass smtp.mailfrom=rbox.co; dkim=pass (2048-bit key) header.d=rbox.co header.i=@rbox.co header.b=J90FhxkX; arc=none smtp.client-ip=185.226.149.37 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=rbox.co Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=rbox.co Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=rbox.co header.i=@rbox.co header.b="J90FhxkX" Received: from mailtransmit03.runbox ([10.9.9.163] helo=aibo.runbox.com) by mailtransmit04.runbox.com with esmtps (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.93) (envelope-from ) id 1u6z2n-000P5i-7E; Mon, 21 Apr 2025 23:51:13 +0200 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=rbox.co; s=selector1; h=Cc:To:In-Reply-To:References:Message-Id: Content-Transfer-Encoding:Content-Type:MIME-Version:Subject:Date:From; bh=qswCCZ7zdNCGMNQd6xheEFi5M2DI/AzAcjRQmm33v3U=; b=J90FhxkXtWl335gXrcrN6soVBm Q6xbudBOn9/qMff9L5+o9kTYwOU11Y3t5HhhRR0YxY5UjwSU1hclxGgL1ezvDNg/MagJC5i/4vhe4 4XxK+2vwetUSur5Tba/Ef81hulIVRsmBF5d6MYV99PCF/IsgCLbn92DPLcmYfALe02VxHoUWzdsFu iAzHJu942Fpqc+NNT0Em53nbg83EpXVoYJhj3zqNQnerfItzsdiJJ+jaWvNI1opUKHD968AkLGEp2 0XgWbLMiAyG5rTK/Z+A8MApKTT6wujw5mAHOLzZbYfzbgwN1w5PxwRoWKw5wUWXbcf+mBnNhSIe8o b9UUbbQw==; Received: from [10.9.9.73] (helo=submission02.runbox) by mailtransmit03.runbox with esmtp (Exim 4.86_2) (envelope-from ) id 1u6z2m-0000Nf-T1; Mon, 21 Apr 2025 23:51:13 +0200 Received: by submission02.runbox with esmtpsa [Authenticated ID (604044)] (TLS1.2:ECDHE_SECP256R1__RSA_PSS_RSAE_SHA256__AES_256_GCM:256) (Exim 4.93) id 1u6z2j-0056xd-1t; Mon, 21 Apr 2025 23:51:09 +0200 From: Michal Luczaj Date: Mon, 21 Apr 2025 23:50:43 +0200 Subject: [PATCH net-next v2 3/3] vsock/test: Expand linger test to ensure close() does not misbehave Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250421-vsock-linger-v2-3-fe9febd64668@rbox.co> References: <20250421-vsock-linger-v2-0-fe9febd64668@rbox.co> In-Reply-To: <20250421-vsock-linger-v2-0-fe9febd64668@rbox.co> To: Stefano Garzarella , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , "Michael S. Tsirkin" , Jason Wang , Xuan Zhuo , =?utf-8?q?Eugenio_P=C3=A9rez?= , Stefan Hajnoczi Cc: virtualization@lists.linux.dev, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, kvm@vger.kernel.org, Michal Luczaj X-Mailer: b4 0.14.2 There was an issue with SO_LINGER: instead of blocking until all queued messages for the socket have been successfully sent (or the linger timeout has been reached), close() would block until packets were handled by the peer. Add a check to alert on close() lingering when it should not. Signed-off-by: Michal Luczaj --- tools/testing/vsock/vsock_test.c | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/tools/testing/vsock/vsock_test.c b/tools/testing/vsock/vsock_t= est.c index d0f6d253ac72d08a957cb81a3c38fcc72bec5a53..82d0bc20dfa75041f04eada1b43= 10be2f7c3a0c1 100644 --- a/tools/testing/vsock/vsock_test.c +++ b/tools/testing/vsock/vsock_test.c @@ -1788,13 +1788,16 @@ static void test_stream_connect_retry_server(const = struct test_opts *opts) close(fd); } =20 +#define LINGER_TIMEOUT 1 /* seconds */ + static void test_stream_linger_client(const struct test_opts *opts) { struct linger optval =3D { .l_onoff =3D 1, - .l_linger =3D 1 + .l_linger =3D LINGER_TIMEOUT }; - int fd; + int bytes_unsent, fd; + time_t ts; =20 fd =3D vsock_stream_connect(opts->peer_cid, opts->peer_port); if (fd < 0) { @@ -1807,7 +1810,28 @@ static void test_stream_linger_client(const struct t= est_opts *opts) exit(EXIT_FAILURE); } =20 + /* Byte left unread to expose any incorrect behaviour. */ + send_byte(fd, 1, 0); + + /* Reuse LINGER_TIMEOUT to wait for bytes_unsent =3D=3D 0. */ + timeout_begin(LINGER_TIMEOUT); + do { + if (ioctl(fd, SIOCOUTQ, &bytes_unsent) < 0) { + perror("ioctl(SIOCOUTQ)"); + exit(EXIT_FAILURE); + } + timeout_check("ioctl(SIOCOUTQ) =3D=3D 0"); + } while (bytes_unsent !=3D 0); + timeout_end(); + + ts =3D current_nsec(); close(fd); + if ((current_nsec() - ts) / NSEC_PER_SEC > 0) { + fprintf(stderr, "Unexpected lingering on close()\n"); + exit(EXIT_FAILURE); + } + + control_writeln("DONE"); } =20 static void test_stream_linger_server(const struct test_opts *opts) @@ -1820,7 +1844,7 @@ static void test_stream_linger_server(const struct te= st_opts *opts) exit(EXIT_FAILURE); } =20 - vsock_wait_remote_close(fd); + control_expectln("DONE"); close(fd); } =20 --=20 2.49.0