From bdf79ec8dc772d492dc75a4cb75525431230fadb Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Thu, 4 Jan 2007 03:09:28 +0000 Subject: [PATCH] Use hotplug support to notify persistent reference holders when a net_device is unregistered. --- src/include/gpxe/netdevice.h | 5 +++++ src/net/netdevice.c | 4 ++++ 2 files changed, 9 insertions(+) diff --git a/src/include/gpxe/netdevice.h b/src/include/gpxe/netdevice.h index b7ec83d9..7551be74 100644 --- a/src/include/gpxe/netdevice.h +++ b/src/include/gpxe/netdevice.h @@ -10,6 +10,7 @@ #include #include #include +#include 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 diff --git a/src/net/netdevice.c b/src/net/netdevice.c index 3f8e54bb..3949d26d 100644 --- a/src/net/netdevice.c +++ b/src/net/netdevice.c @@ -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 ) );