summaryrefslogtreecommitdiff
path: root/net
diff options
context:
space:
mode:
authorRaf Dickson <rafdog35@gmail.com>2026-06-12 07:52:13 +0300
committerJakub Kicinski <kuba@kernel.org>2026-06-13 20:38:27 +0300
commit77eee189397df7ef8a19cf279db6845ab839662e (patch)
tree1310cf597b7cbbe4429310e604144c5d4bd13ac8 /net
parent4ff2e84ff1b33d79fa0e3ae355ce4a334908ef9a (diff)
downloadlinux-77eee189397df7ef8a19cf279db6845ab839662e.tar.xz
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 <sgarzare@redhat.com> Signed-off-by: Raf Dickson <rafdog35@gmail.com> Reviewed-by: Stefano Garzarella <sgarzare@redhat.com> Reviewed-by: Luigi Leonardi <leonardi@redhat.com> Reviewed-by: Bobby Eshleman <bobbyeshleman@meta.com> Link: https://patch.msgid.link/20260612045216.105796-2-rafdog35@gmail.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Diffstat (limited to 'net')
-rw-r--r--net/vmw_vsock/af_vsock.c10
-rw-r--r--net/vmw_vsock/vmci_transport.c3
2 files changed, 11 insertions, 2 deletions
diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c
index 1b20ec498518..2a267283aef8 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 56503bee3165..af64fd57c0c8 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.