Mailing List Archive

Reorganizes network frontend device unregister and removal, so that
# HG changeset patch
# User kaf24@firebug.cl.cam.ac.uk
# Node ID 27ea8232fe7980249cb5d3745a0c7c2a8c57c58e
# Parent ebe84a7f2a8b2d09e85dbfab163e2cf098025c5b
Reorganizes network frontend device unregister and removal, so that
occur in the right order and succeed.

Now on Closing state we:
- stop queue
- unbind irq
- unregister the device

On removal:
- end foreign access to TX and RX pages (we cannot do this before)
- free_netdev, doing the last stage of destroying an allocated device

Makes xm-test network "03_attach_detach_multiple_pos" pass:
http://xmtest.dague.org/cgi-bin/display?view=single&testid=1068

Signed-off-by: Murillo F. Bernardes <mfb@br.ibm.com>

diff -r ebe84a7f2a8b -r 27ea8232fe79 linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c
--- a/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c Wed Dec 28 14:07:16 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c Wed Dec 28 14:07:43 2005
@@ -1209,33 +1209,14 @@

DPRINTK("%s\n", dev->nodename);

- netif_free(info);
- kfree(info);
+ netif_disconnect_backend(info);
+ free_netdev(info->netdev);

return 0;
}


-static void netif_free(struct netfront_info *info)
-{
- netif_disconnect_backend(info);
- close_netdev(info);
-}
-
-
static void close_netdev(struct netfront_info *info)
-{
- if (info->netdev) {
-#ifdef CONFIG_PROC_FS
- xennet_proc_delif(info->netdev);
-#endif
- unregister_netdev(info->netdev);
- info->netdev = NULL;
- }
-}
-
-
-static void netif_disconnect_backend(struct netfront_info *info)
{
/* Stop old i/f to prevent errors whilst we rebuild the state. */
spin_lock_irq(&info->tx_lock);
@@ -1245,18 +1226,36 @@
spin_unlock(&info->rx_lock);
spin_unlock_irq(&info->tx_lock);

+#ifdef CONFIG_PROC_FS
+ xennet_proc_delif(info->netdev);
+#endif
+
+ if (info->irq)
+ unbind_from_irqhandler(info->irq, info->netdev);
+ info->evtchn = info->irq = 0;
+
+ del_timer_sync(&info->rx_refill_timer);
+
+ unregister_netdev(info->netdev);
+}
+
+
+static void netif_disconnect_backend(struct netfront_info *info)
+{
end_access(info->tx_ring_ref, info->tx.sring);
end_access(info->rx_ring_ref, info->rx.sring);
info->tx_ring_ref = GRANT_INVALID_REF;
info->rx_ring_ref = GRANT_INVALID_REF;
info->tx.sring = NULL;
info->rx.sring = NULL;
-
- if (info->irq)
- unbind_from_irqhandler(info->irq, info->netdev);
- info->evtchn = info->irq = 0;
-
- del_timer_sync(&info->rx_refill_timer);
+}
+
+
+static void netif_free(struct netfront_info *info)
+{
+ close_netdev(info);
+ netif_disconnect_backend(info);
+ free_netdev(info->netdev);
}



_______________________________________________
Xen-changelog mailing list
Xen-changelog@lists.xensource.com
http://lists.xensource.com/xen-changelog