xen/netfront: stop tx queues during live migration
[ Upstream commit 042b2046d0 ]
The tx queues are not stopped during the live migration. As a result, the
ndo_start_xmit() may access netfront_info->queues which is freed by
talk_to_netback()->xennet_destroy_queues().
This patch is to netif_device_detach() at the beginning of xen-netfront
resuming, and netif_device_attach() at the end of resuming.
CPU A CPU B
talk_to_netback()
-> if (info->queues)
xennet_destroy_queues(info);
to free netfront_info->queues
xennet_start_xmit()
to access netfront_info->queues
-> err = xennet_create_queues(info, &num_queues);
The idea is borrowed from virtio-net.
Cc: Joe Jin <joe.jin@oracle.com>
Signed-off-by: Dongli Zhang <dongli.zhang@oracle.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
69b14e23df
commit
0e86b727a9
@@ -1671,6 +1671,10 @@ static int netfront_resume(struct xenbus_device *dev)
|
|||||||
|
|
||||||
dev_dbg(&dev->dev, "%s\n", dev->nodename);
|
dev_dbg(&dev->dev, "%s\n", dev->nodename);
|
||||||
|
|
||||||
|
netif_tx_lock_bh(info->netdev);
|
||||||
|
netif_device_detach(info->netdev);
|
||||||
|
netif_tx_unlock_bh(info->netdev);
|
||||||
|
|
||||||
xennet_disconnect_backend(info);
|
xennet_disconnect_backend(info);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -2285,6 +2289,10 @@ static int xennet_connect(struct net_device *dev)
|
|||||||
* domain a kick because we've probably just requeued some
|
* domain a kick because we've probably just requeued some
|
||||||
* packets.
|
* packets.
|
||||||
*/
|
*/
|
||||||
|
netif_tx_lock_bh(np->netdev);
|
||||||
|
netif_device_attach(np->netdev);
|
||||||
|
netif_tx_unlock_bh(np->netdev);
|
||||||
|
|
||||||
netif_carrier_on(np->netdev);
|
netif_carrier_on(np->netdev);
|
||||||
for (j = 0; j < num_queues; ++j) {
|
for (j = 0; j < num_queues; ++j) {
|
||||||
queue = &np->queues[j];
|
queue = &np->queues[j];
|
||||||
|
|||||||
Reference in New Issue
Block a user