Skip to content

Commit

Permalink
VSOCK: defer sock removal to transports
Browse files Browse the repository at this point in the history
The virtio transport will implement graceful shutdown and the related
SO_LINGER socket option.  This requires orphaning the sock but keeping
it in the table of connections after .release().

This patch adds the vsock_remove_sock() function and leaves it up to the
transport when to remove the sock.

Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
  • Loading branch information
stefanhaRH authored and mstsirkin committed Aug 1, 2016
1 parent 0b01aeb commit 6773b7d
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 6 deletions.
1 change: 1 addition & 0 deletions include/net/af_vsock.h
Original file line number Diff line number Diff line change
Expand Up @@ -180,6 +180,7 @@ void vsock_remove_connected(struct vsock_sock *vsk);
struct sock *vsock_find_bound_socket(struct sockaddr_vm *addr);
struct sock *vsock_find_connected_socket(struct sockaddr_vm *src,
struct sockaddr_vm *dst);
void vsock_remove_sock(struct vsock_sock *vsk);
void vsock_for_each_connected_socket(void (*fn)(struct sock *sk));

#endif /* __AF_VSOCK_H__ */
16 changes: 10 additions & 6 deletions net/vmw_vsock/af_vsock.c
Original file line number Diff line number Diff line change
Expand Up @@ -344,6 +344,16 @@ static bool vsock_in_connected_table(struct vsock_sock *vsk)
return ret;
}

void vsock_remove_sock(struct vsock_sock *vsk)
{
if (vsock_in_bound_table(vsk))
vsock_remove_bound(vsk);

if (vsock_in_connected_table(vsk))
vsock_remove_connected(vsk);
}
EXPORT_SYMBOL_GPL(vsock_remove_sock);

void vsock_for_each_connected_socket(void (*fn)(struct sock *sk))
{
int i;
Expand Down Expand Up @@ -660,12 +670,6 @@ static void __vsock_release(struct sock *sk)
vsk = vsock_sk(sk);
pending = NULL; /* Compiler warning. */

if (vsock_in_bound_table(vsk))
vsock_remove_bound(vsk);

if (vsock_in_connected_table(vsk))
vsock_remove_connected(vsk);

transport->release(vsk);

lock_sock(sk);
Expand Down
2 changes: 2 additions & 0 deletions net/vmw_vsock/vmci_transport.c
Original file line number Diff line number Diff line change
Expand Up @@ -1644,6 +1644,8 @@ static void vmci_transport_destruct(struct vsock_sock *vsk)

static void vmci_transport_release(struct vsock_sock *vsk)
{
vsock_remove_sock(vsk);

if (!vmci_handle_is_invalid(vmci_trans(vsk)->dg_handle)) {
vmci_datagram_destroy_handle(vmci_trans(vsk)->dg_handle);
vmci_trans(vsk)->dg_handle = VMCI_INVALID_HANDLE;
Expand Down

0 comments on commit 6773b7d

Please sign in to comment.