[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20250421-vsock-linger-v2-3-fe9febd64668@rbox.co>
Date: Mon, 21 Apr 2025 23:50:43 +0200
From: Michal Luczaj <mhal@...x.co>
To: Stefano Garzarella <sgarzare@...hat.com>,
"David S. Miller" <davem@...emloft.net>, Eric Dumazet <edumazet@...gle.com>,
Jakub Kicinski <kuba@...nel.org>, Paolo Abeni <pabeni@...hat.com>,
Simon Horman <horms@...nel.org>, "Michael S. Tsirkin" <mst@...hat.com>,
Jason Wang <jasowang@...hat.com>, Xuan Zhuo <xuanzhuo@...ux.alibaba.com>,
Eugenio Pérez <eperezma@...hat.com>,
Stefan Hajnoczi <stefanha@...hat.com>
Cc: virtualization@...ts.linux.dev, netdev@...r.kernel.org,
linux-kernel@...r.kernel.org, kvm@...r.kernel.org,
Michal Luczaj <mhal@...x.co>
Subject: [PATCH net-next v2 3/3] vsock/test: Expand linger test to ensure
close() does not misbehave
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 <mhal@...x.co>
---
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_test.c
index d0f6d253ac72d08a957cb81a3c38fcc72bec5a53..82d0bc20dfa75041f04eada1b4310be2f7c3a0c1 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);
}
+#define LINGER_TIMEOUT 1 /* seconds */
+
static void test_stream_linger_client(const struct test_opts *opts)
{
struct linger optval = {
.l_onoff = 1,
- .l_linger = 1
+ .l_linger = LINGER_TIMEOUT
};
- int fd;
+ int bytes_unsent, fd;
+ time_t ts;
fd = vsock_stream_connect(opts->peer_cid, opts->peer_port);
if (fd < 0) {
@@ -1807,7 +1810,28 @@ static void test_stream_linger_client(const struct test_opts *opts)
exit(EXIT_FAILURE);
}
+ /* Byte left unread to expose any incorrect behaviour. */
+ send_byte(fd, 1, 0);
+
+ /* Reuse LINGER_TIMEOUT to wait for bytes_unsent == 0. */
+ timeout_begin(LINGER_TIMEOUT);
+ do {
+ if (ioctl(fd, SIOCOUTQ, &bytes_unsent) < 0) {
+ perror("ioctl(SIOCOUTQ)");
+ exit(EXIT_FAILURE);
+ }
+ timeout_check("ioctl(SIOCOUTQ) == 0");
+ } while (bytes_unsent != 0);
+ timeout_end();
+
+ ts = 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");
}
static void test_stream_linger_server(const struct test_opts *opts)
@@ -1820,7 +1844,7 @@ static void test_stream_linger_server(const struct test_opts *opts)
exit(EXIT_FAILURE);
}
- vsock_wait_remote_close(fd);
+ control_expectln("DONE");
close(fd);
}
--
2.49.0
Powered by blists - more mailing lists