|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3 0/3] map grant refs at pfn = mfn
On Thu, Aug 07, 2014 at 08:59:30AM +0100, Thomas Leonard wrote:
[...]
> >
> > If you do "ps aux | grep vif" do you see some kthreads? If so, what is
> > the status of these threads?
>
> root@cubietruck:~# xl list
> Name ID Mem VCPUs State
> Time(s)
> Domain-0 0 512 2 r-----
> 22.0
> (null) 1 0 1 --ps-d
> 0.1
>
> root@cubietruck:~# ps aux | grep vif
> root 1189 0.0 0.0 0 0 ? S 07:50 0:00
> [vif1.0-q0-guest]
> root 1190 0.0 0.0 0 0 ? S 07:50 0:00
> [vif1.0-q0-deall]
> root 1242 0.0 0.2 3388 1052 pts/0 S+ 07:51 0:00 grep
> --color=auto vif
>
> > What's the status of "xenwatch" thread?
>
> root@cubietruck:~# ps aux | grep xenwatch
> root 18 0.0 0.0 0 0 ? D 07:49 0:00 [xenwatch]
>
> root@cubietruck:~# cat /proc/18/wchan
> xenvif_disconnect
>
OK, so the ref-count is messed up. My patch is buggy.
Another simplier fix came to mind this morning. Can you give it a go?
I've run preliminary test on x86, this patch at least doesn't cause
regression for me.
Wei.
---8<---
From 9b7db1c85798a0f25ce845815d20ff331aaf15c1 Mon Sep 17 00:00:00 2001
From: Wei Liu <wei.liu2@xxxxxxxxxx>
Date: Thu, 7 Aug 2014 11:33:37 +0100
Subject: [PATCH] xen-netback: don't stop dealloc kthread until all packets
are processed
Move xenvif_wait_unmap_timeout before stopping dealloc thread, so that
we guarantee all inflight packets are eventually unmapped.
Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx>
---
drivers/net/xen-netback/interface.c | 30 ++++++++++++++++--------------
1 file changed, 16 insertions(+), 14 deletions(-)
diff --git a/drivers/net/xen-netback/interface.c
b/drivers/net/xen-netback/interface.c
index 5f11d1d..ce871db 100644
--- a/drivers/net/xen-netback/interface.c
+++ b/drivers/net/xen-netback/interface.c
@@ -655,6 +655,20 @@ void xenvif_disconnect(struct xenvif *vif)
struct xenvif_queue *queue = NULL;
unsigned int num_queues = vif->num_queues;
unsigned int queue_index;
+ /* Here we want to avoid timeout messages if an skb can be legitimately
+ * stuck somewhere else. Realistically this could be an another vif's
+ * internal or QDisc queue. That another vif also has this
+ * rx_drain_timeout_msecs timeout, but the timer only ditches the
+ * internal queue. After that, the QDisc queue can put in worst case
+ * XEN_NETIF_RX_RING_SIZE / MAX_SKB_FRAGS skbs into that another vif's
+ * internal queue, so we need several rounds of such timeouts until we
+ * can be sure that no another vif should have skb's from us. We are
+ * not sending more skb's, so newly stuck packets are not interesting
+ * for us here.
+ */
+ unsigned int worst_case_skb_lifetime = (rx_drain_timeout_msecs/1000) *
+ DIV_ROUND_UP(XENVIF_QUEUE_LENGTH, (XEN_NETIF_RX_RING_SIZE /
MAX_SKB_FRAGS));
+
if (netif_carrier_ok(vif->dev))
xenvif_carrier_off(vif);
@@ -673,6 +687,8 @@ void xenvif_disconnect(struct xenvif *vif)
queue->task = NULL;
}
+ xenvif_wait_unmap_timeout(queue, worst_case_skb_lifetime);
+
if (queue->dealloc_task) {
kthread_stop(queue->dealloc_task);
queue->dealloc_task = NULL;
@@ -706,25 +722,11 @@ void xenvif_free(struct xenvif *vif)
struct xenvif_queue *queue = NULL;
unsigned int num_queues = vif->num_queues;
unsigned int queue_index;
- /* Here we want to avoid timeout messages if an skb can be legitimately
- * stuck somewhere else. Realistically this could be an another vif's
- * internal or QDisc queue. That another vif also has this
- * rx_drain_timeout_msecs timeout, but the timer only ditches the
- * internal queue. After that, the QDisc queue can put in worst case
- * XEN_NETIF_RX_RING_SIZE / MAX_SKB_FRAGS skbs into that another vif's
- * internal queue, so we need several rounds of such timeouts until we
- * can be sure that no another vif should have skb's from us. We are
- * not sending more skb's, so newly stuck packets are not interesting
- * for us here.
- */
- unsigned int worst_case_skb_lifetime = (rx_drain_timeout_msecs/1000) *
- DIV_ROUND_UP(XENVIF_QUEUE_LENGTH, (XEN_NETIF_RX_RING_SIZE /
MAX_SKB_FRAGS));
unregister_netdev(vif->dev);
for (queue_index = 0; queue_index < num_queues; ++queue_index) {
queue = &vif->queues[queue_index];
- xenvif_wait_unmap_timeout(queue, worst_case_skb_lifetime);
xenvif_deinit_queue(queue);
}
--
1.7.10.4
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |