diff options
| author | Jakub Kicinski <kuba@kernel.org> | 2026-06-13 20:39:32 +0300 |
|---|---|---|
| committer | Jakub Kicinski <kuba@kernel.org> | 2026-06-13 20:39:32 +0300 |
| commit | 30b81fc779c9333ddd803facb0c50cbfaebaeddc (patch) | |
| tree | a9c446091ced44fe3323537e09ed95ac43b2908e | |
| parent | 4ff2e84ff1b33d79fa0e3ae355ce4a334908ef9a (diff) | |
| parent | 27fc25bb82e6934cf4473539d58dd179961a5447 (diff) | |
| download | linux-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.h | 1 | ||||
| -rw-r--r-- | net/vmw_vsock/af_vsock.c | 15 | ||||
| -rw-r--r-- | net/vmw_vsock/hyperv_transport.c | 1 | ||||
| -rw-r--r-- | net/vmw_vsock/virtio_transport_common.c | 1 | ||||
| -rw-r--r-- | net/vmw_vsock/vmci_transport.c | 8 |
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. |
