On 4/30/25 11:26, Stefano Garzarella wrote: > On Wed, Apr 30, 2025 at 11:10:27AM +0200, Michal Luczaj wrote: >> 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 (some interpretation of) lingering was always limited to >> transports that called virtio_transport_wait_close() on transport release. >> This does not change, i.e. under Hyper-V and VMCI 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 <m...@rbox.co> >> --- >> net/vmw_vsock/virtio_transport_common.c | 8 ++++++-- >> 1 file changed, 6 insertions(+), 2 deletions(-) >> >> diff --git a/net/vmw_vsock/virtio_transport_common.c >> b/net/vmw_vsock/virtio_transport_common.c >> index >> 7f7de6d8809655fe522749fbbc9025df71f071bd..49c6617b467195ba385cc3db86caa4321b422d7a >> 100644 >> --- a/net/vmw_vsock/virtio_transport_common.c >> +++ b/net/vmw_vsock/virtio_transport_common.c >> @@ -1196,12 +1196,16 @@ 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 = vsock_sk(sk); >> + >> + unsent = vsk->transport->unsent_bytes; > > Just use `virtio_transport_unsent_bytes`, we don't need to be generic on > transport here.
All right. Thanks