kernel - Add mandatory config hooks delay
authorMatthew Dillon <dillon@apollo.backplane.com>
Wed, 9 Apr 2014 23:49:12 +0000 (16:49 -0700)
committerMatthew Dillon <dillon@apollo.backplane.com>
Wed, 9 Apr 2014 23:49:12 +0000 (16:49 -0700)
* Add a mandatory 5-second minimum delay for config hooks.

  This fixes an issue with U4B's very late port probing.  Essentially the
  other disk devices (aka AHCI) can completely finish probing and attaching
  devices before USB even knows there's a stick in a port.  The result is
  that the run_interrupt_driven_config_hooks() routine thinks that all
  disk devices have attached and does not wait at all.

  In addition, usb devices tend to probe near dead last, making the problem
  worse.  The kernel tries to mount the root device the instant after
  the usb pci probe.

* This is a hack, but to really fix it requires a great deal of surgery in
  the U4B USB stack.

sys/kern/subr_autoconf.c

index c3dfa5b..86f25b3 100644 (file)
@@ -67,8 +67,10 @@ run_interrupt_driven_config_hooks(void *dummy)
 {
        struct intr_config_hook *hook_entry;
        int waiting;
+       int save_ticks;
 
        waiting = 0;
+       save_ticks = ticks;
 
        ran_config_hooks = 1;
        while (!TAILQ_EMPTY(&intr_config_hook_list)) {
@@ -106,6 +108,16 @@ run_interrupt_driven_config_hooks(void *dummy)
                tsleep(&intr_config_hook_list, 0, "conifhk", hz);
                ++waiting;
        }
+
+       /*
+        * Terrible hack to give U4B (usb) a chance to configure, else
+        * the root mount might not see a valid usb device.  This can happen
+        * because the AHCI devices might have already finished probing
+        * before the usb ports are even registered.
+        */
+       while (ticks - save_ticks < 5*hz)
+               tsleep(&intr_config_hook_list, 0, "delay", hz / 10);
+
 }
 SYSINIT(intr_config_hooks, SI_SUB_INT_CONFIG_HOOKS, SI_ORDER_FIRST,
        run_interrupt_driven_config_hooks, NULL)