[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] Reorganizes network frontend device unregister and removal, so that
# HG changeset patch # User kaf24@xxxxxxxxxxxxxxxxxxxx # 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@xxxxxxxxxx> 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@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |