Use hotplug support to notify persistent reference holders when a
authorMichael Brown <mcb30@etherboot.org>
Thu, 4 Jan 2007 03:09:28 +0000 (03:09 +0000)
committerMichael Brown <mcb30@etherboot.org>
Thu, 4 Jan 2007 03:09:28 +0000 (03:09 +0000)
net_device is unregistered.

src/include/gpxe/netdevice.h
src/net/netdevice.c

index b7ec83d..7551be7 100644 (file)
@@ -10,6 +10,7 @@
 #include <stdint.h>
 #include <gpxe/list.h>
 #include <gpxe/tables.h>
+#include <gpxe/hotplug.h>
 
 struct pk_buff;
 struct net_device;
@@ -137,6 +138,10 @@ struct ll_protocol {
 struct net_device {
        /** List of network devices */
        struct list_head list;
+
+       /** List of persistent reference holders */
+       struct list_head references;
+
        /** Transmit packet
         *
         * @v netdev    Network device
index 3f8e54b..3949d26 100644 (file)
@@ -161,6 +161,7 @@ struct net_device * alloc_netdev ( size_t priv_size ) {
 
        netdev = calloc ( 1, sizeof ( *netdev ) + priv_size );
        if ( netdev ) {
+               INIT_LIST_HEAD ( &netdev->references );
                INIT_LIST_HEAD ( &netdev->rx_queue );
                netdev->priv = ( ( ( void * ) netdev ) + sizeof ( *netdev ) );
        }
@@ -201,6 +202,9 @@ void unregister_netdev ( struct net_device *netdev ) {
                free_pkb ( pkb );
        }
 
+       /* Kill off any persistent references to this device */
+       forget_references ( &netdev->references );
+
        /* Remove from device list */
        list_del ( &netdev->list );
        DBG ( "%s unregistered\n", netdev_name ( netdev ) );