Netdev List
 help / color / mirror / Atom feed
From: Stefano Garzarella <sgarzare@redhat.com>
To: Nguyen Dinh Phi <phind.uet@gmail.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>,
	virtualization@lists.linux.dev,  netdev@vger.kernel.org,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH v5 2/3] vsock: remove the now-unused rejected flag
Date: Thu, 13 Aug 2026 10:38:29 +0200	[thread overview]
Message-ID: <an15JxACeo30Owo_@sgarzare-redhat> (raw)
In-Reply-To: <20260810170935.2242314-3-phind.uet@gmail.com>

On Tue, Aug 11, 2026 at 01:09:31AM +0800, Nguyen Dinh Phi wrote:
>After previous patch, the branch marking a socket rejected in
>vsock_accept() is unreachable, and nothing ever sets vsk->rejected
>elsewhere.
>
>Therefore, we can remove the `rejected` field from vsock_sock structure.

I'd like to mention here that since commit d021c344051a ("VSOCK: 
Introduce VM Sockets") where `rejected` was introduced, we didn't have 
any path where sk_err is set on a listener socket, so that path was dead 
since the beginning.

The rest LGTM!

Thanks,
Stefano

>Suggested-by: Stefano Garzarella <sgarzare@redhat.com>
>Signed-off-by: Nguyen Dinh Phi <phind.uet@gmail.com>
>---
> include/net/af_vsock.h   |  5 +----
> net/vmw_vsock/af_vsock.c | 46 +++++++++++++---------------------------
> 2 files changed, 16 insertions(+), 35 deletions(-)
>
>diff --git a/include/net/af_vsock.h b/include/net/af_vsock.h
>index 30046a3c20f7..3357ee62d10b 100644
>--- a/include/net/af_vsock.h
>+++ b/include/net/af_vsock.h
>@@ -52,13 +52,10 @@ struct vsock_sock {
> 	 * The listening socket is the head for both lists.  Sockets created
> 	 * for connection requests are placed in the pending list until they
> 	 * are connected, at which point they are put in the accept queue list
>-	 * so they can be accepted in accept().  If accept() cannot accept the
>-	 * connection, it is marked as rejected so the cleanup function knows
>-	 * to clean up the socket.
>+	 * so they can be accepted in accept().
> 	 */
> 	struct list_head pending_links;
> 	struct list_head accept_queue;
>-	bool rejected;
> 	struct delayed_work connect_work;
> 	struct delayed_work pending_work;
> 	struct delayed_work close_work;
>diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c
>index ff507761f472..b59890bbd217 100644
>--- a/net/vmw_vsock/af_vsock.c
>+++ b/net/vmw_vsock/af_vsock.c
>@@ -38,10 +38,9 @@
>  * pending socket.  When that socket reaches the connected state, it is removed
>  * from the listener socket's pending list and enqueued in the listener
>  * socket's accept queue.  Callers of accept(2) will accept connected sockets
>- * from the listener socket's accept queue.  If the socket cannot be accepted
>- * for some reason then it is marked rejected.  Once the connection is
>- * accepted, it is owned by the user process and the responsibility for cleanup
>- * falls with that user process.
>+ * from the listener socket's accept queue. Once the connection is accepted,
>+ * it is owned by the user process and the responsibility for cleanup falls
>+ * with that user process.
>  *
>  * - It is possible that these pending sockets will never reach the connected
>  * state; in fact, we may never receive another packet after the connection
>@@ -49,9 +48,7 @@
>  * future, after some amount of time passes where a connection should have been
>  * established.  This function ensures that the socket is off all lists so it
>  * cannot be retrieved, then drops all references to the socket so it is cleaned
>- * up (sock_put() -> sk_free() -> our sk_destruct implementation).  Note this
>- * function will also cleanup rejected sockets, those that reach the connected
>- * state but leave it before they have been accepted.
>+ * up (sock_put() -> sk_free() -> our sk_destruct implementation).
>  *
>  * - Lock ordering for pending or accept queue sockets is:
>  *
>@@ -774,11 +771,10 @@ static void vsock_pending_work(struct work_struct *work)
>
> 	if (vsock_is_pending(sk)) {
> 		vsock_remove_pending(listener, sk);
>-	} else if (!vsk->rejected) {
>-		/* We are not on the pending list and accept() did not reject
>-		 * us, so we must have been accepted by our user process.  We
>-		 * just need to drop our references to the sockets and be on
>-		 * our way.
>+	} else {
>+		/* We are not on the pending list so we must have been accepted
>+		 * by our user process. We just need to drop our references to
>+		 * the sockets and be on our way.
> 		 */
> 		cleanup = false;
> 		goto out;
>@@ -942,7 +938,6 @@ static struct sock *__vsock_create(struct net *net,
> 	vsk->listener = NULL;
> 	INIT_LIST_HEAD(&vsk->pending_links);
> 	INIT_LIST_HEAD(&vsk->accept_queue);
>-	vsk->rejected = false;
> 	vsk->sent_request = false;
> 	vsk->ignore_connecting_rst = false;
> 	WRITE_ONCE(vsk->peer_shutdown, 0);
>@@ -1912,26 +1907,15 @@ static int vsock_accept(struct socket *sock, struct socket *newsock,
> 		lock_sock_nested(connected, SINGLE_DEPTH_NESTING);
> 		vconnected = vsock_sk(connected);
>
>-		/* If the listener socket has received an error, then we should
>-		 * reject this socket and return.  Note that we simply mark the
>-		 * socket rejected, drop our reference, and let the cleanup
>-		 * function handle the cleanup; the fact that we found it in
>-		 * the listener's accept queue guarantees that the cleanup
>-		 * function hasn't run yet.
>-		 */
>-		if (err) {
>-			vconnected->rejected = true;
>-		} else {
>-			newsock->state = SS_CONNECTED;
>-			sock_graft(connected, newsock);
>+		newsock->state = SS_CONNECTED;
>+		sock_graft(connected, newsock);
>
>-			set_bit(SOCK_CUSTOM_SOCKOPT,
>-				&connected->sk_socket->flags);
>+		set_bit(SOCK_CUSTOM_SOCKOPT,
>+			&connected->sk_socket->flags);
>
>-			if (vsock_msgzerocopy_allow(vconnected->transport))
>-				set_bit(SOCK_SUPPORT_ZC,
>-					&connected->sk_socket->flags);
>-		}
>+		if (vsock_msgzerocopy_allow(vconnected->transport))
>+			set_bit(SOCK_SUPPORT_ZC,
>+				&connected->sk_socket->flags);
>
> 		release_sock(connected);
> 		sock_put(connected);
>-- 
>2.53.0
>


  reply	other threads:[~2026-08-13  8:38 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-10 17:09 [PATCH v5 0/3] vsock: fix stale sk_err handling after a failed connect Nguyen Dinh Phi
2026-08-10 17:09 ` [PATCH v5 1/3] vsock: don't check the listener's sk_err in vsock_accept() Nguyen Dinh Phi
2026-08-13  8:24   ` Stefano Garzarella
2026-08-10 17:09 ` [PATCH v5 2/3] vsock: remove the now-unused rejected flag Nguyen Dinh Phi
2026-08-13  8:38   ` Stefano Garzarella [this message]
2026-08-10 17:09 ` [PATCH v5 3/3] vsock: use sock_error() to consume sk_err after a failed connect Nguyen Dinh Phi
2026-08-13  8:43   ` 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=an15JxACeo30Owo_@sgarzare-redhat \
    --to=sgarzare@redhat.com \
    --cc=davem@davemloft.net \
    --cc=edumazet@google.com \
    --cc=horms@kernel.org \
    --cc=kuba@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=pabeni@redhat.com \
    --cc=phind.uet@gmail.com \
    --cc=virtualization@lists.linux.dev \
    /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