diff options
| author | Michael Brown | 2021-02-02 00:32:34 +0100 |
|---|---|---|
| committer | Michael Brown | 2021-02-02 00:33:50 +0100 |
| commit | 0c94659a8ab29cfd4e20b35bf98e364de9901d77 (patch) | |
| tree | f0aa4648d6fd9baf09b85d05e3b7fe9927f3c7eb | |
| parent | [hermon] Avoid parsing length field on completion errors (diff) | |
| download | ipxe-0c94659a8ab29cfd4e20b35bf98e364de9901d77.tar.gz ipxe-0c94659a8ab29cfd4e20b35bf98e364de9901d77.tar.xz ipxe-0c94659a8ab29cfd4e20b35bf98e364de9901d77.zip | |
[autoboot] Avoid closing and immediately reopening network device
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>
| -rw-r--r-- | src/usr/autoboot.c | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/src/usr/autoboot.c b/src/usr/autoboot.c index 51b07e125..62e90ecd0 100644 --- a/src/usr/autoboot.c +++ b/src/usr/autoboot.c @@ -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 ) |
