On 4/11/25 15:43, Stefano Garzarella wrote:
> On Mon, Apr 07, 2025 at 08:41:43PM +0200, Michal Luczaj wrote:
>> Change the behaviour of a lingering close(): instead of waiting for all
>> data to be consumed, block until data is considered sent, i.e. until worker
>> picks the packets and decrements virtio_vsock_sock::bytes_unsent down to 0.
>>
>> Do linger on shutdown() just as well.
> 
> I think this should go in a separate patch.

As discussed, dropping linger on shutdown() for now.

>> diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c
>> index 
>> fc6afbc8d6806a4d98c66abc3af4bd139c583b08..383c6644d047589035c0439c47d1440273e67ea9
>>  100644
>> --- a/net/vmw_vsock/af_vsock.c
>> +++ b/net/vmw_vsock/af_vsock.c
>> @@ -1013,6 +1013,29 @@ static int vsock_getname(struct socket *sock,
>>      return err;
>> }
>>
>> +void vsock_linger(struct sock *sk, long timeout)
>> +{
>> +    if (timeout) {
> 
> I would prefer to avoid a whole nested block and return immediately
> in such a case. (It's pre-existing, but since we are moving this code
> I'd fix it).
> 
>       if (!timeout)
>               return;

In v2 no code is moved (since no shutdown() lingering), so I'll reduce the
indentation in a separate patch. Let me know if it's not worth the churn
anymore.

>> +            DEFINE_WAIT_FUNC(wait, woken_wake_function);
>> +            ssize_t (*unsent)(struct vsock_sock *vsk);
>> +            struct vsock_sock *vsk = vsock_sk(sk);
>> +
> 
> transport->unsent_bytes can be NULL, this will panic with hyperv or
> vmci transport, especially because we now call this function in
> vsock_shutdown().
> 
> I'd skip that call if transports don't implement it, but please add
> a comment on top of this function about that.

I'm not sure I understand. I am calling it only conditionally, see below.
Nevertheless, I'll add a comment.

>> +            unsent = vsk->transport->unsent_bytes;
>> +            if (!unsent)
>> +                    return;
>> +
>> +            add_wait_queue(sk_sleep(sk), &wait);
>> +
>> +            do {
>> +                    if (sk_wait_event(sk, &timeout, unsent(vsk) == 0, 
>> &wait))
>> +                            break;
>> +            } while (!signal_pending(current) && timeout);
>> +
>> +            remove_wait_queue(sk_sleep(sk), &wait);
>> +    }
>> +}

...

>> -    if (sock_flag(sk, SOCK_DONE)) {
>> +    if (sock_flag(sk, SOCK_DONE))
>>              return true;
>> -    }
> 
> Please avoid this unrelated changes, if you really want to fix them,
> add another patch in the series where to fix them.
> 
>>
>>      sock_hold(sk);
>> -    INIT_DELAYED_WORK(&vsk->close_work,
>> -                      virtio_transport_close_timeout);
>> +    INIT_DELAYED_WORK(&vsk->close_work, virtio_transport_close_timeout);
> 
> Ditto.
> 
> These 2 could go together in a single `cleanup` patch, although I
> usually avoid it so that `git blame` makes sense. But if we want to
> make checkpatch happy, that's fine.

All right, dropping these. I've thought, since I was touching this function
and this wasn't a bug fix (and wouldn't be backported), it'd be okay to do
some trivial cleanups along the way.

Here's v2:
https://lore.kernel.org/netdev/20250421-vsock-linger-v2-0-fe9febd64...@rbox.co/

Thanks,
Michal

Reply via email to