From mboxrd@z Thu Jan 1 00:00:00 1970 From: Philipp Hahn Subject: Re: RFH: Kernel OOPS in xen_netbk_rx_action / xenvif_gop_skb Date: Mon, 23 Jun 2014 16:56:02 +0200 Message-ID: <53A84002.5050402@univention.de> References: <5391976F.8020800@univention.de> <20140606105804.GD11959@zion.uk.xensource.com> <53923CD0.7010001@univention.de> <53A1C2DF.10407@univention.de> <20140619141252.GO20819@zion.uk.xensource.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Received: from mail6.bemta3.messagelabs.com ([195.245.230.39]) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1Wz5fB-0004vb-Gk for xen-devel@lists.xenproject.org; Mon, 23 Jun 2014 14:56:05 +0000 In-Reply-To: <20140619141252.GO20819@zion.uk.xensource.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: Wei Liu Cc: xen-devel , Erik Damrose , Ian Campbell , Zoltan Kiss List-Id: xen-devel@lists.xenproject.org Hello Wei Liu, On 19.06.2014 16:12, Wei Liu wrote: > On Wed, Jun 18, 2014 at 06:48:31PM +0200, Philipp Hahn wrote: ... >> 5. then xen-netback continues processing the pending requests and tries ... > 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. Your quick hack seems to have solved the problem: The network survived the week-end, but we had to change the VMs as one of them was required last weekend. We're currently re-checking that the bug still occurs with the old kernel but the new set of VMs. >>>> 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. Thanks, I'll have a look. > ---8<--- > From d2f428a93e6e296bc5f55e16f44ac1ad63a951a8 Mon Sep 17 00:00:00 2001 > From: Wei Liu > 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; > >