diff --git a/net/vmw_vsock/virtio_transport_common.c b/net/vmw_vsock/virtio_transport_common.c index dcc8a1d5851e..b8e52c71920a 100644 --- a/net/vmw_vsock/virtio_transport_common.c +++ b/net/vmw_vsock/virtio_transport_common.c @@ -316,6 +316,15 @@ static struct sk_buff *virtio_transport_alloc_skb(struct virtio_vsock_pkt_info * info->flags, zcopy);
- /*
* If there is no corresponding socket, then we don't have a* corresponding namespace. This only happens For VIRTIO_VSOCK_OP_RST.*/So, in virtio_transport_recv_pkt() should we check that `net` is not set?
Should we set it to NULL here?
Sounds good to me.
- if (vsk) {
virtio_vsock_skb_set_net(skb, info->net);Ditto here about the net refcnt, can the net disappear? Should we use get_net() in some way, or the socket will prevent that?
As long as the socket has an outstanding skb it can't be destroyed and so will have a reference to the net, that is after skb_set_owner_w() and freeing... so I think this is okay.
But, maybe we could simplify the implied relationship between skb, sk, and net by removing the VIRTIO_VSOCK_SKB_CB(skb)->net entirely, and only ever referring to sock_net(skb->sk)? I remember originally having a reason for adding it to the cb, but my hunch is it that it was probably some confusion over the !vsk case.
WDYT?
... now I remember the reason, because I didn't want two different places for storing the net for RX and TX.
Best, Bobby