]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[autoboot] Avoid closing and immediately reopening network device
authorMichael Brown <mcb30@ipxe.org>
Mon, 1 Feb 2021 23:32:34 +0000 (23:32 +0000)
committerMichael Brown <mcb30@ipxe.org>
Mon, 1 Feb 2021 23:33:50 +0000 (23:33 +0000)
Some network devices can take a substantial time to close and reopen.
Avoid closing the device from which we are about to attempt booting,
in case it happens to be already open.

Suggested-by: Christian Iversen <ci@iversenit.dk>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/usr/autoboot.c

index 51b07e1256d70842219d2c4c62ed8a2bcc3924e3..62e90ecd00d9581fa1c5104479fc002917133c86 100644 (file)
@@ -210,18 +210,19 @@ int uriboot ( struct uri *filename, struct uri **root_paths,
 }
 
 /**
- * Close all open net devices
+ * Close all but one network device
  *
  * Called before a fresh boot attempt in order to free up memory.  We
  * don't just close the device immediately after the boot fails,
  * because there may still be TCP connections in the process of
  * closing.
  */
-static void close_all_netdevs ( void ) {
-       struct net_device *netdev;
+static void close_other_netdevs ( struct net_device *netdev ) {
+       struct net_device *other;
 
-       for_each_netdev ( netdev ) {
-               ifclose ( netdev );
+       for_each_netdev ( other ) {
+               if ( other != netdev )
+                       ifclose ( other );
        }
 }
 
@@ -388,7 +389,7 @@ int netboot ( struct net_device *netdev ) {
        int rc;
 
        /* Close all other network devices */
-       close_all_netdevs();
+       close_other_netdevs ( netdev );
 
        /* Open device and display device status */
        if ( ( rc = ifopen ( netdev ) ) != 0 )