From: Michal Luczaj <mhal@rbox.co>
To: Stefano Garzarella <sgarzare@redhat.com>
Cc: "David S. Miller" <davem@davemloft.net>,
"Eric Dumazet" <edumazet@google.com>,
"Jakub Kicinski" <kuba@kernel.org>,
"Paolo Abeni" <pabeni@redhat.com>,
"Simon Horman" <horms@kernel.org>,
"Michael S. Tsirkin" <mst@redhat.com>,
"Jason Wang" <jasowang@redhat.com>,
"Xuan Zhuo" <xuanzhuo@linux.alibaba.com>,
"Eugenio Pérez" <eperezma@redhat.com>,
"Stefan Hajnoczi" <stefanha@redhat.com>,
virtualization@lists.linux.dev, netdev@vger.kernel.org,
linux-kernel@vger.kernel.org, kvm@vger.kernel.org
Subject: Re: [PATCH net-next v4 3/3] vsock/test: Expand linger test to ensure close() does not misbehave
Date: Mon, 12 May 2025 14:23:12 +0200 [thread overview]
Message-ID: <720f6986-8b32-4d00-b309-66a6f0c1ca40@rbox.co> (raw)
In-Reply-To: <CAGxU2F77OT5_Pd6EUF1QcvPDC38e-nuhfwKmPSTau262Eey5vQ@mail.gmail.com>
On 5/7/25 10:26, Stefano Garzarella wrote:
> On Wed, 7 May 2025 at 00:47, Michal Luczaj <mhal@rbox.co> wrote:
>>
>> On 5/6/25 11:46, Stefano Garzarella wrote:
>>> On Tue, 6 May 2025 at 11:43, Stefano Garzarella <sgarzare@redhat.com> wrote:
>>>>
>>>> On Thu, May 01, 2025 at 10:05:24AM +0200, Michal Luczaj wrote:
>>>>> 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.
>>>>
>>>> This is a new behaviour that only new kernels will follow, so I think
>>>> it is better to add a new test instead of extending a pre-existing test
>>>> that we described as "SOCK_STREAM SO_LINGER null-ptr-deref".
>>>>
>>>> The old test should continue to check the null-ptr-deref also for old
>>>> kernels, while the new test will check the new behaviour, so we can skip
>>>> the new test while testing an old kernel.
>>
>> Right, I'll split it.
>>
>>> I also saw that we don't have any test to verify that actually the
>>> lingering is working, should we add it since we are touching it?
>>
>> Yeah, I agree we should. Do you have any suggestion how this could be done
>> reliably?
>
> Can we play with SO_VM_SOCKETS_BUFFER_SIZE like in credit-update tests?
>
> One peer can set it (e.g. to 1k), accept the connection, but without
> read anything. The other peer can set the linger timeout, send more
> bytes than the buffer size set by the receiver.
> At this point the extra bytes should stay on the sender socket buffer,
> so we can do the close() and it should time out, and we can check if
> it happens.
>
> WDYT?
Haven't we discussed this approach in [1]? I've reported that I can't make
it work. But maybe I'm misunderstanding something, please see the code below.
[1]:
https://lore.kernel.org/netdev/df2d51fd-03e7-477f-8aea-938446f47864@rbox.co/
import termios, time
from socket import *
SIOCOUTQ = termios.TIOCOUTQ
VMADDR_CID_LOCAL = 1
SZ = 1024
def set_linger(s, timeout):
optval = (timeout << 32) | 1
s.setsockopt(SOL_SOCKET, SO_LINGER, optval)
assert s.getsockopt(SOL_SOCKET, SO_LINGER) == optval
def set_bufsz(s, size):
s.setsockopt(AF_VSOCK, SO_VM_SOCKETS_BUFFER_SIZE, size)
assert s.getsockopt(AF_VSOCK, SO_VM_SOCKETS_BUFFER_SIZE) == size
def check_lingering(addr):
lis = socket(AF_VSOCK, SOCK_STREAM)
lis.bind(addr)
lis.listen()
set_bufsz(lis, SZ)
s = socket(AF_VSOCK, SOCK_STREAM)
set_linger(s, 5)
s.connect(lis.getsockname())
p, _ = lis.accept()
s.send(b'x')
p.recv(1)
print("sending...")
s.send(b'x' * (SZ+1)) # blocks
print("sent")
print("closing...")
ts = time.time()
s.close()
print("done in %ds" % (time.time() - ts))
check_lingering((VMADDR_CID_LOCAL, 1234))
next prev parent reply other threads:[~2025-05-12 12:52 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-05-01 8:05 [PATCH net-next v4 0/3] vsock: SOCK_LINGER rework Michal Luczaj
2025-05-01 8:05 ` [PATCH net-next v4 1/3] vsock/virtio: Linger on unsent data Michal Luczaj
2025-05-06 9:44 ` Stefano Garzarella
2025-05-01 8:05 ` [PATCH net-next v4 2/3] vsock: Move lingering logic to af_vsock core Michal Luczaj
2025-05-06 9:53 ` Stefano Garzarella
2025-05-06 22:47 ` Michal Luczaj
2025-05-01 8:05 ` [PATCH net-next v4 3/3] vsock/test: Expand linger test to ensure close() does not misbehave Michal Luczaj
2025-05-06 9:43 ` Stefano Garzarella
2025-05-06 9:46 ` Stefano Garzarella
2025-05-06 22:47 ` Michal Luczaj
2025-05-07 8:26 ` Stefano Garzarella
2025-05-12 12:23 ` Michal Luczaj [this message]
2025-05-20 8:54 ` Stefano Garzarella
2025-05-20 9:01 ` Stefano Garzarella
2025-05-20 10:20 ` Stefano Garzarella
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=720f6986-8b32-4d00-b309-66a6f0c1ca40@rbox.co \
--to=mhal@rbox.co \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=eperezma@redhat.com \
--cc=horms@kernel.org \
--cc=jasowang@redhat.com \
--cc=kuba@kernel.org \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mst@redhat.com \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=sgarzare@redhat.com \
--cc=stefanha@redhat.com \
--cc=virtualization@lists.linux.dev \
--cc=xuanzhuo@linux.alibaba.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®