Thread (9 messages) 9 messages, 2 authors, 2016-12-07

Re: [PATCH 3/4] vsock: add pkt cancel capability

From: Peng Tao <hidden>
Date: 2016-12-07 14:47:02
Also in: kvm

On Wed, Dec 7, 2016 at 9:22 PM, Stefan Hajnoczi [off-list ref] wrote:
On Wed, Dec 07, 2016 at 06:00:20PM +0800, Peng Tao wrote:
quoted
Signed-off-by: Peng Tao <redacted>
---
 net/vmw_vsock/virtio_transport.c | 36 ++++++++++++++++++++++++++++++++++++
 1 file changed, 36 insertions(+)
diff --git a/net/vmw_vsock/virtio_transport.c b/net/vmw_vsock/virtio_transport.c
index 936d7ee..f88b6ed 100644
--- a/net/vmw_vsock/virtio_transport.c
+++ b/net/vmw_vsock/virtio_transport.c
@@ -170,6 +170,41 @@ virtio_transport_send_pkt(struct virtio_vsock_pkt *pkt)
      return len;
 }

+static int
+virtio_transport_cancel_pkt(struct vsock_sock *vsk)
+{
+     struct virtio_vsock *vsock;
+     struct virtio_vsock_pkt *pkt, *n;
+     int cnt = 0;
+     LIST_HEAD(freeme);
+
+     vsock = virtio_vsock_get();
+     if (!vsock) {
+             return -ENODEV;
+     }
+
+     if (pkt->reply)
pkt is uninitialized.  I guess this if statement should be deleted, you
already take care of counting reply packets below.
ah, sorry! I forgot to delete it after handling cnt below...
quoted
+             cnt++;
+
+     spin_lock_bh(&vsock->send_pkt_list_lock);
+     list_for_each_entry_safe(pkt, n, &vsock->send_pkt_list, list) {
+             if (pkt->vsk != vsk)
+                     continue;
+             list_move(&pkt->list, &freeme);
+     }
+     spin_unlock_bh(&vsock->send_pkt_list_lock);
+
+     list_for_each_entry_safe(pkt, n, &freeme, list) {
+             if (pkt->reply)
+                     cnt++;
+             list_del(&pkt->list);
+             virtio_transport_free_pkt(pkt);
+     }
+     atomic_sub(cnt, &vsock->queued_replies);
If we stopped rx because there were too many replies in flight then we
might be able to resume rx now:

/* Do we now have resources to resume rx processing? */
if (old_val >= virtqueue_get_vring_size(rx_vq) &&
    new_val < virtqueue_get_vring_size(rx_vq))
        queue_work(virtio_vsock_workqueue, &vsock->rx_work);
Thanks! I totally missed the resume part... I'll send an updated version later.

Cheers,
Tao
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help