Current Netpoll init does not trust carrier detected right upon bringing the NIC up and waits for a delay before allowing boot to continue.
The delay varied with the kernel version: 10 seconds in 2.6.11 3 seconds in 2.6.12 4 seconds in 2.6.13 and later Any significant delay is undesired in production environments as 3 seconds boot the entire kernel. The patch reduces the delay to about 300msec + NIC startup time. The adjusted timeout mechanism polls the carrier every 100ms and polls for a good carrier for N_CARRIER_POLL (3) _consecutive_ cycles or 10s maximum. The patch is in use on a dozen x86 systems with 2.6.11 since June. Signed-off-by: Michael Frank <[EMAIL PROTECTED]> --- netpoll.c | 54 +++++++++++++++++++++++++++++++----------------------- 1 file changed, 31 insertions(+), 23 deletions(-) Patch file: netp-timeout-mhfp16 --- linux-2.6.15-rc2-mhf260/net/core/netpoll.c.001 2005-11-21 08:28:58.000000000 +0100 +++ linux-2.6.15-rc2-mhf260/net/core/netpoll.c 2005-11-21 09:08:15.000000000 +0100 @@ -1,7 +1,8 @@ /* * Common framework for low-level network console, dump, and debugger code * - * Sep 8 2003 Matt Mackall <[EMAIL PROTECTED]> + * Sep 8 2003 Matt Mackall <[EMAIL PROTECTED]> + * Jun 13 2005 Michael Frank <[EMAIL PROTECTED]> Adjust carrier timeout logic * * based on the netconsole code from: * @@ -69,6 +70,8 @@ (MAX_UDP_CHUNK + sizeof(struct udphdr) + \ sizeof(struct iphdr) + sizeof(struct ethhdr)) +#define N_CARRIER_POLL 3 + static void zap_completion_queue(void); static void queue_process(void *p) @@ -673,6 +676,7 @@ if (!netif_running(ndev)) { unsigned long atmost, atleast; + int pollcarrier; printk(KERN_INFO "%s: device %s not up yet, forcing it\n", np->name, np->dev_name); @@ -686,31 +690,35 @@ } rtnl_shunlock(); - atleast = jiffies + HZ/10; - atmost = jiffies + 4*HZ; - while (!netif_carrier_ok(ndev)) { - if (time_after(jiffies, atmost)) { - printk(KERN_NOTICE - "%s: timeout waiting for carrier\n", - np->name); - break; - } - cond_resched(); - } - - /* If carrier appears to come up instantly, we don't - * trust it and pause so that we don't pump all our - * queued console messages into the bitbucket. + /* Wait for carrier: + * Until carrier detected for N_CARRIER_POLL + * consecutive 100ms intervals. + * + * At most 10s. */ - - if (time_before(jiffies, atleast)) { - printk(KERN_NOTICE "%s: carrier detect appears" - " untrustworthy, waiting 4 seconds\n", - np->name); - msleep(4000); + + pollcarrier = N_CARRIER_POLL; + atmost = jiffies + 10 * HZ; + + while (pollcarrier--) { + atleast = jiffies + HZ / 10; + + while (time_before(jiffies, atleast)) + cond_resched(); + + while (!netif_carrier_ok(ndev)) { + pollcarrier = N_CARRIER_POLL; + if (time_after(jiffies, atmost)) { + printk(KERN_NOTICE "%s: timeout" + "waiting for carrier", + np->name); + goto out; + } + cond_resched(); + } } } - +out: if (!memcmp(np->local_mac, "\0\0\0\0\0\0", 6) && ndev->dev_addr) memcpy(np->local_mac, ndev->dev_addr, 6); - To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html