summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Kicinski <kuba@kernel.org>2026-06-13 20:39:32 +0300
committerJakub Kicinski <kuba@kernel.org>2026-06-13 20:39:32 +0300
commit30b81fc779c9333ddd803facb0c50cbfaebaeddc (patch)
treea9c446091ced44fe3323537e09ed95ac43b2908e
parent4ff2e84ff1b33d79fa0e3ae355ce4a334908ef9a (diff)
parent27fc25bb82e6934cf4473539d58dd179961a5447 (diff)
downloadlinux-30b81fc779c9333ddd803facb0c50cbfaebaeddc.tar.xz
Merge branch 'vsock-consolidate-acceptq-accounting-into-core-helpers'
Raf Dickson says: ==================== vsock: consolidate acceptq accounting into core helpers These patches follow up on commit c05fa14db43e ("vsock/vmci: fix sk_ack_backlog leak on failed handshake") by consolidating sk_acceptq_added() and sk_acceptq_removed() into the core vsock helpers so transports cannot forget them. Link: https://lore.kernel.org/netdev/20260611021317.69362-1-rafdog35@gmail.com/ ==================== Link: https://patch.msgid.link/20260612045216.105796-1-rafdog35@gmail.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
-rw-r--r--include/net/af_vsock.h1
-rw-r--r--net/vmw_vsock/af_vsock.c15
-rw-r--r--net/vmw_vsock/hyperv_transport.c1
-rw-r--r--net/vmw_vsock/virtio_transport_common.c1
-rw-r--r--net/vmw_vsock/vmci_transport.c8
5 files changed, 16 insertions, 10 deletions
diff --git a/include/net/af_vsock.h b/include/net/af_vsock.h
index 4e40063adab4..30046a3c20f7 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 1b20ec498518..622dbd046799 100644
--- a/net/vmw_vsock/af_vsock.c
+++ b/net/vmw_vsock/af_vsock.c
@@ -484,6 +484,7 @@ void vsock_add_pending(struct sock *listener, struct sock *pending)
sock_hold(pending);
sock_hold(listener);
list_add_tail(&vpending->pending_links, &vlistener->pending_links);
+ sk_acceptq_added(listener);
}
EXPORT_SYMBOL_GPL(vsock_add_pending);
@@ -494,9 +495,20 @@ void vsock_remove_pending(struct sock *listener, struct sock *pending)
list_del_init(&vpending->pending_links);
sock_put(listener);
sock_put(pending);
+ sk_acceptq_removed(listener);
}
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;
@@ -508,6 +520,7 @@ void vsock_enqueue_accept(struct sock *listener, struct sock *connected)
sock_hold(connected);
sock_hold(listener);
list_add_tail(&vconnected->accept_queue, &vlistener->accept_queue);
+ sk_acceptq_added(listener);
}
EXPORT_SYMBOL_GPL(vsock_enqueue_accept);
@@ -761,8 +774,6 @@ static void vsock_pending_work(struct work_struct *work)
if (vsock_is_pending(sk)) {
vsock_remove_pending(listener, sk);
-
- sk_acceptq_removed(listener);
} 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
diff --git a/net/vmw_vsock/hyperv_transport.c b/net/vmw_vsock/hyperv_transport.c
index e6adbc47011d..5405c2680dec 100644
--- a/net/vmw_vsock/hyperv_transport.c
+++ b/net/vmw_vsock/hyperv_transport.c
@@ -410,7 +410,6 @@ static void hvs_open_connection(struct vmbus_channel *chan)
if (conn_from_host) {
new->sk_state = TCP_ESTABLISHED;
- sk_acceptq_added(sk);
hvs_new->vm_srv_id = *if_type;
hvs_new->host_srv_id = *if_instance;
diff --git a/net/vmw_vsock/virtio_transport_common.c b/net/vmw_vsock/virtio_transport_common.c
index 3b294164b741..09475007165b 100644
--- a/net/vmw_vsock/virtio_transport_common.c
+++ b/net/vmw_vsock/virtio_transport_common.c
@@ -1582,7 +1582,6 @@ virtio_transport_recv_listen(struct sock *sk, struct sk_buff *skb,
return ret;
}
- sk_acceptq_added(sk);
if (virtio_transport_space_update(child, skb))
child->sk_write_space(child);
diff --git a/net/vmw_vsock/vmci_transport.c b/net/vmw_vsock/vmci_transport.c
index 56503bee3165..1c4ee039c166 100644
--- a/net/vmw_vsock/vmci_transport.c
+++ b/net/vmw_vsock/vmci_transport.c
@@ -980,10 +980,8 @@ static int vmci_transport_recv_listen(struct sock *sk,
err = -EINVAL;
}
- if (err < 0) {
+ if (err < 0)
vsock_remove_pending(sk, pending);
- sk_acceptq_removed(sk);
- }
release_sock(pending);
vmci_transport_release_pending(pending);
@@ -1109,7 +1107,6 @@ static int vmci_transport_recv_listen(struct sock *sk,
}
vsock_add_pending(sk, pending);
- sk_acceptq_added(sk);
pending->sk_state = TCP_SYN_SENT;
vmci_trans(vpending)->produce_size =
@@ -1258,8 +1255,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.