From 77eee189397df7ef8a19cf279db6845ab839662e Mon Sep 17 00:00:00 2001 From: Raf Dickson Date: Fri, 12 Jun 2026 04:52:13 +0000 Subject: [PATCH] vsock: introduce vsock_pending_to_accept() helper Add vsock_pending_to_accept() to move a socket directly from the pending list to the accept queue in a single operation, avoiding the sock_put/sock_hold dance and the sk_acceptq_removed()/ sk_acceptq_added() pair that would otherwise be needed when calling vsock_remove_pending() followed by vsock_enqueue_accept(). Use it in vmci_transport_recv_connecting_server() where a completed handshake transitions the socket from pending to accept queue. Suggested-by: Stefano Garzarella Signed-off-by: Raf Dickson Reviewed-by: Stefano Garzarella Reviewed-by: Luigi Leonardi Reviewed-by: Bobby Eshleman Link: https://patch.msgid.link/20260612045216.105796-2-rafdog35@gmail.com Signed-off-by: Jakub Kicinski --- include/net/af_vsock.h | 1 + net/vmw_vsock/af_vsock.c | 10 ++++++++++ net/vmw_vsock/vmci_transport.c | 3 +-- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/include/net/af_vsock.h b/include/net/af_vsock.h index 4e40063adab47..30046a3c20f73 100644 --- a/include/net/af_vsock.h +++ b/include/net/af_vsock.h @@ -220,6 +220,7 @@ static inline bool __vsock_in_connected_table(struct vsock_sock *vsk) void vsock_add_pending(struct sock *listener, struct sock *pending); void vsock_remove_pending(struct sock *listener, struct sock *pending); void vsock_enqueue_accept(struct sock *listener, struct sock *connected); +void vsock_pending_to_accept(struct sock *listener, struct sock *pending); void vsock_insert_connected(struct vsock_sock *vsk); void vsock_remove_bound(struct vsock_sock *vsk); void vsock_remove_connected(struct vsock_sock *vsk); diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c index 1b20ec4985186..2a267283aef80 100644 --- a/net/vmw_vsock/af_vsock.c +++ b/net/vmw_vsock/af_vsock.c @@ -497,6 +497,16 @@ void vsock_remove_pending(struct sock *listener, struct sock *pending) } EXPORT_SYMBOL_GPL(vsock_remove_pending); +void vsock_pending_to_accept(struct sock *listener, struct sock *pending) +{ + struct vsock_sock *vpending = vsock_sk(pending); + struct vsock_sock *vlistener = vsock_sk(listener); + + list_del_init(&vpending->pending_links); + list_add_tail(&vpending->accept_queue, &vlistener->accept_queue); +} +EXPORT_SYMBOL_GPL(vsock_pending_to_accept); + void vsock_enqueue_accept(struct sock *listener, struct sock *connected) { struct vsock_sock *vlistener; diff --git a/net/vmw_vsock/vmci_transport.c b/net/vmw_vsock/vmci_transport.c index 56503bee3165b..af64fd57c0c85 100644 --- a/net/vmw_vsock/vmci_transport.c +++ b/net/vmw_vsock/vmci_transport.c @@ -1258,8 +1258,7 @@ vmci_transport_recv_connecting_server(struct sock *listener, * listener's pending list to the accept queue so callers of accept() * can find it. */ - vsock_remove_pending(listener, pending); - vsock_enqueue_accept(listener, pending); + vsock_pending_to_accept(listener, pending); /* Callers of accept() will be waiting on the listening socket, not * the pending socket. -- 2.47.3