| From foo@baz Thu Dec 21 09:02:40 CET 2017 |
| From: Peng Tao <bergwolf@gmail.com> |
| Date: Wed, 15 Mar 2017 09:32:14 +0800 |
| Subject: vsock: track pkt owner vsock |
| |
| From: Peng Tao <bergwolf@gmail.com> |
| |
| |
| [ Upstream commit 36d277bac8080202684e67162ebb157f16631581 ] |
| |
| So that we can cancel a queued pkt later if necessary. |
| |
| Signed-off-by: Peng Tao <bergwolf@gmail.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin <alexander.levin@verizon.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| include/linux/virtio_vsock.h | 3 +++ |
| net/vmw_vsock/virtio_transport_common.c | 7 +++++++ |
| 2 files changed, 10 insertions(+) |
| |
| --- a/include/linux/virtio_vsock.h |
| +++ b/include/linux/virtio_vsock.h |
| @@ -48,6 +48,8 @@ struct virtio_vsock_pkt { |
| struct virtio_vsock_hdr hdr; |
| struct work_struct work; |
| struct list_head list; |
| + /* socket refcnt not held, only use for cancellation */ |
| + struct vsock_sock *vsk; |
| void *buf; |
| u32 len; |
| u32 off; |
| @@ -56,6 +58,7 @@ struct virtio_vsock_pkt { |
| |
| struct virtio_vsock_pkt_info { |
| u32 remote_cid, remote_port; |
| + struct vsock_sock *vsk; |
| struct msghdr *msg; |
| u32 pkt_len; |
| u16 type; |
| --- a/net/vmw_vsock/virtio_transport_common.c |
| +++ b/net/vmw_vsock/virtio_transport_common.c |
| @@ -57,6 +57,7 @@ virtio_transport_alloc_pkt(struct virtio |
| pkt->len = len; |
| pkt->hdr.len = cpu_to_le32(len); |
| pkt->reply = info->reply; |
| + pkt->vsk = info->vsk; |
| |
| if (info->msg && len > 0) { |
| pkt->buf = kmalloc(len, GFP_KERNEL); |
| @@ -180,6 +181,7 @@ static int virtio_transport_send_credit_ |
| struct virtio_vsock_pkt_info info = { |
| .op = VIRTIO_VSOCK_OP_CREDIT_UPDATE, |
| .type = type, |
| + .vsk = vsk, |
| }; |
| |
| return virtio_transport_send_pkt_info(vsk, &info); |
| @@ -519,6 +521,7 @@ int virtio_transport_connect(struct vsoc |
| struct virtio_vsock_pkt_info info = { |
| .op = VIRTIO_VSOCK_OP_REQUEST, |
| .type = VIRTIO_VSOCK_TYPE_STREAM, |
| + .vsk = vsk, |
| }; |
| |
| return virtio_transport_send_pkt_info(vsk, &info); |
| @@ -534,6 +537,7 @@ int virtio_transport_shutdown(struct vso |
| VIRTIO_VSOCK_SHUTDOWN_RCV : 0) | |
| (mode & SEND_SHUTDOWN ? |
| VIRTIO_VSOCK_SHUTDOWN_SEND : 0), |
| + .vsk = vsk, |
| }; |
| |
| return virtio_transport_send_pkt_info(vsk, &info); |
| @@ -560,6 +564,7 @@ virtio_transport_stream_enqueue(struct v |
| .type = VIRTIO_VSOCK_TYPE_STREAM, |
| .msg = msg, |
| .pkt_len = len, |
| + .vsk = vsk, |
| }; |
| |
| return virtio_transport_send_pkt_info(vsk, &info); |
| @@ -581,6 +586,7 @@ static int virtio_transport_reset(struct |
| .op = VIRTIO_VSOCK_OP_RST, |
| .type = VIRTIO_VSOCK_TYPE_STREAM, |
| .reply = !!pkt, |
| + .vsk = vsk, |
| }; |
| |
| /* Send RST only if the original pkt is not a RST pkt */ |
| @@ -826,6 +832,7 @@ virtio_transport_send_response(struct vs |
| .remote_cid = le64_to_cpu(pkt->hdr.src_cid), |
| .remote_port = le32_to_cpu(pkt->hdr.src_port), |
| .reply = true, |
| + .vsk = vsk, |
| }; |
| |
| return virtio_transport_send_pkt_info(vsk, &info); |