aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/xen-netback/interface.c
diff options
context:
space:
mode:
authorDavid Vrabel <david.vrabel@citrix.com>2011-09-30 06:37:51 +0000
committerGreg Kroah-Hartman <gregkh@suse.de>2011-11-11 09:36:29 -0800
commita00fb1451d630898c1380349ac3776688e58010f (patch)
treeb1cc528a57283e8693f3b000e6c8a4922af6d8ba /drivers/net/xen-netback/interface.c
parent62d8d0b9b6c459789876335156c56110042f2158 (diff)
downloadkernel_samsung_smdk4412-a00fb1451d630898c1380349ac3776688e58010f.zip
kernel_samsung_smdk4412-a00fb1451d630898c1380349ac3776688e58010f.tar.gz
kernel_samsung_smdk4412-a00fb1451d630898c1380349ac3776688e58010f.tar.bz2
net: xen-netback: correctly restart Tx after a VM restore/migrate
[ Upstream commit d0e5d83284dac15c015bb48115b6780f5a6413cd ] If a VM is saved and restored (or migrated) the netback driver will no longer process any Tx packets from the frontend. xenvif_up() does not schedule the processing of any pending Tx requests from the front end because the carrier is off. Without this initial kick the frontend just adds Tx requests to the ring without raising an event (until the ring is full). This was caused by 47103041e91794acdbc6165da0ae288d844c820b (net: xen-netback: convert to hw_features) which reordered the calls to xenvif_up() and netif_carrier_on() in xenvif_connect(). Signed-off-by: David Vrabel <david.vrabel@citrix.com> Cc: Ian Campbell <ian.campbell@citrix.com> Acked-by: Ian Campbell <ian.campbell@citrix.com> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/net/xen-netback/interface.c')
-rw-r--r--drivers/net/xen-netback/interface.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/drivers/net/xen-netback/interface.c b/drivers/net/xen-netback/interface.c
index 0ca86f9..1825629 100644
--- a/drivers/net/xen-netback/interface.c
+++ b/drivers/net/xen-netback/interface.c
@@ -327,12 +327,12 @@ int xenvif_connect(struct xenvif *vif, unsigned long tx_ring_ref,
xenvif_get(vif);
rtnl_lock();
- if (netif_running(vif->dev))
- xenvif_up(vif);
if (!vif->can_sg && vif->dev->mtu > ETH_DATA_LEN)
dev_set_mtu(vif->dev, ETH_DATA_LEN);
netdev_update_features(vif->dev);
netif_carrier_on(vif->dev);
+ if (netif_running(vif->dev))
+ xenvif_up(vif);
rtnl_unlock();
return 0;