|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] RFH: Kernel OOPS in xen_netbk_rx_action / xenvif_gop_skb
On Wed, Jun 18, 2014 at 06:48:31PM +0200, Philipp Hahn wrote:
[...]
>
> (gdb) list *(xen_netbk_rx_action+0x18b)
> 0xffffffffa04287dc is in xen_netbk_rx_action
> (/var/build/temp/tmp.hW3dNilayw/pbuilder/linux-3.10.11/drivers/net/xen-netback/netback
> .c:611).
> 606 meta->gso_size = skb_shinfo(skb)->gso_size;
> 607 else
> 608 meta->gso_size = 0;
> 609
> 610 meta->size = 0;
> 611 meta->id = req->id;
> 612 npo->copy_off = 0;
> 613 npo->copy_gref = req->gref;
> 614
> 615 data = skb->data;
>
>
> After more debugging today I think something like this happens:
>
> 1. The VM is receiving packets through bonding + bridge + netback +
> netfront.
>
> 2. For some unknown reason at least one packet remains in the rx queue
> and is not delivered to the domU immediately by netback.
>
> 3. The VM finishes shutting down.
>
> 4. The shared ring between dom0 and domU is freed.
>
> 5. then xen-netback continues processing the pending requests and tries
> to put the packet into the now already released shared ring.
>
>
> >From reading the attached disassembly I guess, that
> AX = &meta
> CX = &rx->string
> DX =~ rx.req_cons
> CR2 = &req->id
> where
> CX + DX * sizeof(union struct xen_netif_rx_{request,response})=8 = CR2
>
>
> Any additional ideas or insight is appreciated.
>
I think your analysis makes sense. Netback does have it's internal queue
and kthread can certainly be scheduled away. There doesn't seem to be a
synchronisation point between a vif getting disconnet and internal queue
gets processed. I attach a quick hack. If it does work to a degree then
we can try to work out a proper fix.
> FYI: The host has only a single CPU and is running >=2 VMs so far.
>
> >> There's one more patch that you can pick up from 3.10.y tree. I doubt it
> >> will make much difference though.
>
> Which patch are you referring to?
>
You can have a look at 3.10.y tree for all the patches between your
current version and the latest stable version.
Wei.
---8<---
From d2f428a93e6e296bc5f55e16f44ac1ad63a951a8 Mon Sep 17 00:00:00 2001
From: Wei Liu <wei.liu2@xxxxxxxxxx>
Date: Thu, 19 Jun 2014 15:07:47 +0100
Subject: [PATCH] quick hack
---
drivers/net/xen-netback/common.h | 1 +
drivers/net/xen-netback/interface.c | 1 +
drivers/net/xen-netback/netback.c | 8 ++++++++
3 files changed, 10 insertions(+)
diff --git a/drivers/net/xen-netback/common.h b/drivers/net/xen-netback/common.h
index f2faa77..9239824 100644
--- a/drivers/net/xen-netback/common.h
+++ b/drivers/net/xen-netback/common.h
@@ -66,6 +66,7 @@ struct xenvif {
/* The shared rings and indexes. */
struct xen_netif_tx_back_ring tx;
struct xen_netif_rx_back_ring rx;
+ bool mapped;
/* Frontend feature information. */
u8 can_sg:1;
diff --git a/drivers/net/xen-netback/interface.c
b/drivers/net/xen-netback/interface.c
index 540a796..5f11763 100644
--- a/drivers/net/xen-netback/interface.c
+++ b/drivers/net/xen-netback/interface.c
@@ -271,6 +271,7 @@ struct xenvif *xenvif_alloc(struct device *parent, domid_t
domid,
vif->dev = dev;
INIT_LIST_HEAD(&vif->schedule_list);
INIT_LIST_HEAD(&vif->notify_list);
+ vif->mapped = false;
vif->credit_bytes = vif->remaining_credit = ~0UL;
vif->credit_usec = 0UL;
diff --git a/drivers/net/xen-netback/netback.c
b/drivers/net/xen-netback/netback.c
index 36efb41..f4f3693 100644
--- a/drivers/net/xen-netback/netback.c
+++ b/drivers/net/xen-netback/netback.c
@@ -720,6 +720,11 @@ static void xen_netbk_rx_action(struct xen_netbk *netbk)
vif = netdev_priv(skb->dev);
nr_frags = skb_shinfo(skb)->nr_frags;
+ if (!vif->mapped) {
+ dev_kfree_skb(skb);
+ continue;
+ }
+
sco = (struct skb_cb_overlay *)skb->cb;
sco->meta_slots_used = netbk_gop_skb(skb, &npo);
@@ -1864,6 +1869,8 @@ static int xen_netbk_kthread(void *data)
void xen_netbk_unmap_frontend_rings(struct xenvif *vif)
{
+ vif->mapped = false;
+
if (vif->tx.sring)
xenbus_unmap_ring_vfree(xenvif_to_xenbus_device(vif),
vif->tx.sring);
@@ -1899,6 +1906,7 @@ int xen_netbk_map_frontend_rings(struct xenvif *vif,
BACK_RING_INIT(&vif->rx, rxs, PAGE_SIZE);
vif->rx_req_cons_peek = 0;
+ vif->mapped = true;
return 0;
--
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 |