On Mon, 26 May 2025 at 15:50, Konstantin Shkolnyy <k...@linux.ibm.com> wrote:
>
> The test outputs:
> "SOCK_STREAM SHUT_RD...expected send(2) failure, got 1".
>
> It tests that shutdown(fd, SHUT_RD) on one side causes send() to fail on
> the other side. However, sometimes there is a delay in delivery of the
> SHUT_RD command, send() succeeds and the test fails, even though the
> command is properly delivered and send() starts failing several
> milliseconds later.
>
> The delay occurs in the kernel because the used buffer notification
> callback virtio_vsock_rx_done(), called upon receipt of the SHUT_RD
> command, doesn't immediately disable send(). It delegates that to
> a kernel thread (via vsock->rx_work). Sometimes that thread is delayed
> more than the test expects.
>
> Change the test to keep calling send() until it fails or a timeout occurs.
>
> Fixes: b698bd97c5711 ("test/vsock: shutdowned socket test")
> Signed-off-by: Konstantin Shkolnyy <k...@linux.ibm.com>
> ---
> Changes in v2:
>  - Move the new function to utils.c.

BTW I think I already fixed the same issue in this series:
https://lore.kernel.org/netdev/20250514141927.159456-1-sgarz...@redhat.com/

Can you check it?

Thanks,
Stefano

>
>  tools/testing/vsock/util.c       | 11 +++++++++++
>  tools/testing/vsock/util.h       |  1 +
>  tools/testing/vsock/vsock_test.c | 14 ++------------
>  3 files changed, 14 insertions(+), 12 deletions(-)
>
> diff --git a/tools/testing/vsock/util.c b/tools/testing/vsock/util.c
> index de25892f865f..04ac88dc4d3a 100644
> --- a/tools/testing/vsock/util.c
> +++ b/tools/testing/vsock/util.c
> @@ -798,3 +798,14 @@ void enable_so_zerocopy_check(int fd)
>         setsockopt_int_check(fd, SOL_SOCKET, SO_ZEROCOPY, 1,
>                              "setsockopt SO_ZEROCOPY");
>  }
> +
> +void vsock_test_for_send_failure(int fd, int send_flags)
> +{
> +       timeout_begin(TIMEOUT);
> +       while (true) {
> +               if (send(fd, "A", 1, send_flags) == -1)
> +                       return;
> +               timeout_check("expected send(2) failure");
> +       }
> +       timeout_end();
> +}
> diff --git a/tools/testing/vsock/util.h b/tools/testing/vsock/util.h
> index d1f765ce3eee..58c17cfb63d4 100644
> --- a/tools/testing/vsock/util.h
> +++ b/tools/testing/vsock/util.h
> @@ -79,4 +79,5 @@ void setsockopt_int_check(int fd, int level, int optname, 
> int val,
>  void setsockopt_timeval_check(int fd, int level, int optname,
>                               struct timeval val, char const *errmsg);
>  void enable_so_zerocopy_check(int fd);
> +void vsock_test_for_send_failure(int fd, int send_flags);
>  #endif /* UTIL_H */
> diff --git a/tools/testing/vsock/vsock_test.c 
> b/tools/testing/vsock/vsock_test.c
> index 613551132a96..b68a85a6d929 100644
> --- a/tools/testing/vsock/vsock_test.c
> +++ b/tools/testing/vsock/vsock_test.c
> @@ -1060,15 +1060,9 @@ static void sigpipe(int signo)
>
>  static void test_stream_check_sigpipe(int fd)
>  {
> -       ssize_t res;
> -
>         have_sigpipe = 0;
>
> -       res = send(fd, "A", 1, 0);
> -       if (res != -1) {
> -               fprintf(stderr, "expected send(2) failure, got %zi\n", res);
> -               exit(EXIT_FAILURE);
> -       }
> +       vsock_test_for_send_failure(fd, 0);
>
>         if (!have_sigpipe) {
>                 fprintf(stderr, "SIGPIPE expected\n");
> @@ -1077,11 +1071,7 @@ static void test_stream_check_sigpipe(int fd)
>
>         have_sigpipe = 0;
>
> -       res = send(fd, "A", 1, MSG_NOSIGNAL);
> -       if (res != -1) {
> -               fprintf(stderr, "expected send(2) failure, got %zi\n", res);
> -               exit(EXIT_FAILURE);
> -       }
> +       vsock_test_for_send_failure(fd, MSG_NOSIGNAL);
>
>         if (have_sigpipe) {
>                 fprintf(stderr, "SIGPIPE not expected\n");
> --
> 2.34.1
>


Reply via email to