On 5/6/25 11:53, Stefano Garzarella wrote: > On Thu, May 01, 2025 at 10:05:23AM +0200, Michal Luczaj wrote: >> Lingering should be transport-independent in the long run. In preparation >> for supporting other transports, as well the linger on shutdown(), move >> code to core. >> >> Generalize by querying vsock_transport::unsent_bytes(), guard against the >> callback being unimplemented. Do not pass sk_lingertime explicitly. Pull >> SOCK_LINGER check into vsock_linger(). >> >> Flatten the function. Remove the nested block by inverting the condition: >> return early on !timeout. >> >> Suggested-by: Stefano Garzarella <sgarz...@redhat.com> >> Signed-off-by: Michal Luczaj <m...@rbox.co> >> --- >> include/net/af_vsock.h | 1 + >> net/vmw_vsock/af_vsock.c | 30 ++++++++++++++++++++++++++++++ >> net/vmw_vsock/virtio_transport_common.c | 23 ++--------------------- >> 3 files changed, 33 insertions(+), 21 deletions(-) >> >> diff --git a/include/net/af_vsock.h b/include/net/af_vsock.h >> index >> 9e85424c834353d016a527070dd62e15ff3bfce1..d56e6e135158939087d060dfcf65d3fdaea53bf3 >> 100644 >> --- a/include/net/af_vsock.h >> +++ b/include/net/af_vsock.h >> @@ -221,6 +221,7 @@ void vsock_for_each_connected_socket(struct >> vsock_transport *transport, >> void (*fn)(struct sock *sk)); >> int vsock_assign_transport(struct vsock_sock *vsk, struct vsock_sock >> *psk); >> bool vsock_find_cid(unsigned int cid); >> +void vsock_linger(struct sock *sk); >> >> /**** TAP ****/ >> >> diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c >> index >> fc6afbc8d6806a4d98c66abc3af4bd139c583b08..a31ad6b141cd38d1806df4b5d417924bb8607e32 >> 100644 >> --- a/net/vmw_vsock/af_vsock.c >> +++ b/net/vmw_vsock/af_vsock.c >> @@ -1013,6 +1013,36 @@ static int vsock_getname(struct socket *sock, >> return err; >> } >> >> +void vsock_linger(struct sock *sk) >> +{ >> + DEFINE_WAIT_FUNC(wait, woken_wake_function); >> + ssize_t (*unsent)(struct vsock_sock *vsk); >> + struct vsock_sock *vsk = vsock_sk(sk); >> + long timeout; >> + >> + if (!sock_flag(sk, SOCK_LINGER)) >> + return; >> + >> + timeout = sk->sk_lingertime; >> + if (!timeout) >> + return; >> + >> + /* unsent_bytes() may be unimplemented. */ > > This comment IMO should be enriched, as it is now it doesn't add much to > the code. I'm thinking on something like this: > Transports must implement `unsent_bytes` if they want to support > SOCK_LINGER through `vsock_linger()` since we use it to check when > the socket can be closed.
OK, will do. Thanks, Michal