The core port allocator is currently private to connection-oriented sockets. Virtio datagrams need the same bound-socket lookup tables and port allocation, while VMCI datagrams must keep their own endpoint creation and port namespace. Export vsock_bind_common() with the bound-table locking inside the helper, and use it for stream and SEQPACKET binds. Keep datagram binds delegated to the transport so a transport can opt into the core allocator without changing other transports' binding behavior. Signed-off-by: Sergio Lopez --- include/net/af_vsock.h | 1 + net/vmw_vsock/af_vsock.c | 31 ++++++++++++++++++++++--------- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/include/net/af_vsock.h b/include/net/af_vsock.h index e8481f12312e..19bd9c1c3e5b 100644 --- a/include/net/af_vsock.h +++ b/include/net/af_vsock.h @@ -220,6 +220,7 @@ 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); +int vsock_bind_common(struct vsock_sock *vsk, struct sockaddr_vm *addr); void vsock_remove_bound(struct vsock_sock *vsk); void vsock_remove_connected(struct vsock_sock *vsk); struct sock *vsock_find_bound_socket(struct sockaddr_vm *addr); diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c index d0508887a2fb..5d1d85e5f519 100644 --- a/net/vmw_vsock/af_vsock.c +++ b/net/vmw_vsock/af_vsock.c @@ -832,8 +832,8 @@ static void vsock_pending_work(struct work_struct *work) /**** SOCKET OPERATIONS ****/ -static int __vsock_bind_connectible(struct vsock_sock *vsk, - struct sockaddr_vm *addr) +static int __vsock_bind_common(struct vsock_sock *vsk, + struct sockaddr_vm *addr) { struct net *net = sock_net(sk_vsock(vsk)); struct sockaddr_vm new_addr; @@ -888,11 +888,26 @@ static int __vsock_bind_connectible(struct vsock_sock *vsk, return 0; } -static int __vsock_bind_dgram(struct vsock_sock *vsk, - struct sockaddr_vm *addr) +/** + * vsock_bind_common - bind a socket using the core port allocator + * @vsk: socket to bind + * @addr: local address to bind to + * + * The caller must hold the socket lock. + * + * Return: 0 on success or a negative error code on failure. + */ +int vsock_bind_common(struct vsock_sock *vsk, struct sockaddr_vm *addr) { - return vsk->transport->dgram_bind(vsk, addr); + int ret; + + spin_lock_bh(&vsock_table_lock); + ret = __vsock_bind_common(vsk, addr); + spin_unlock_bh(&vsock_table_lock); + + return ret; } +EXPORT_SYMBOL_GPL(vsock_bind_common); static int __vsock_bind(struct sock *sk, struct sockaddr_vm *addr) { @@ -914,13 +929,11 @@ static int __vsock_bind(struct sock *sk, struct sockaddr_vm *addr) switch (sk->sk_socket->type) { case SOCK_STREAM: case SOCK_SEQPACKET: - spin_lock_bh(&vsock_table_lock); - retval = __vsock_bind_connectible(vsk, addr); - spin_unlock_bh(&vsock_table_lock); + retval = vsock_bind_common(vsk, addr); break; case SOCK_DGRAM: - retval = __vsock_bind_dgram(vsk, addr); + retval = vsk->transport->dgram_bind(vsk, addr); break; default: -- 2.56.0