On Tue, Jul 10, 2007 at 07:18:26PM -0400, Peter Avalos wrote:
> Indeed, only kernel threads and init, sh, and ps, but a reboot still freezes
> after "Uptime: xxxx"

... which means it's stuck at somewhere at the bottom of boot()
in kern_shutdown.c:
        /*
         * Ok, now do things that assume all filesystem activity has
         * been completed.
         */
        EVENTHANDLER_INVOKE(shutdown_post_sync, howto);
        crit_enter();
        if ((howto & (RB_HALT|RB_DUMP)) == RB_DUMP && !cold)
                dumpsys();

        /* Now that we're going to really halt the system... */
        EVENTHANDLER_INVOKE(shutdown_final, howto);

        for(;;) ;       /* safety against shutdown_reset not working */
        /* NOTREACHED */

At first I thought it's in cpu_reset(), but since you didn't see
"Rebooting...", it's stuck in one of event handlers for shutdown_post_sync
and not managed to shutdown_reset().  Please try attached patch to
find which handler is the culprit.  Note that you may have to rebuild
modules too, since this patches makes some incompatible changes to
EVENTHANDLER_* APIs.

Cheers.
Index: sys/eventhandler.h
===================================================================
RCS file: /home/source/dragonfly/cvs/src/sys/sys/eventhandler.h,v
retrieving revision 1.7
diff -u -p -r1.7 eventhandler.h
--- sys/eventhandler.h  21 May 2006 03:43:47 -0000      1.7
+++ sys/eventhandler.h  11 Jul 2007 04:31:07 -0000
@@ -43,6 +43,7 @@ struct eventhandler_entry 
     TAILQ_ENTRY(eventhandler_entry)    ee_link;
     int                                        ee_priority;
     void                               *ee_arg;
+    const char                         *ee_name;
 };
 
 struct eventhandler_list 
@@ -55,6 +56,7 @@ struct eventhandler_list 
 };
 
 typedef struct eventhandler_entry      *eventhandler_tag;
+extern int eventhandler_show_invoked_funcs;
 
 /* 
  * Fast handler lists require the eventhandler list be present
@@ -85,13 +87,15 @@ do {                                                        
                \
     struct eventhandler_entry *_ep = TAILQ_FIRST(&(_el->el_entries));  \
                                                                        \
     while (_ep != NULL) {                                              \
+       if (eventhandler_show_invoked_funcs)                            \
+               kprintf("FAST_INVOKE(" #name ") %s\n", _ep->ee_name);   \
        ((struct eventhandler_entry_ ## name *)_ep)->eh_func(_ep->ee_arg , ## 
args); \
        _ep = TAILQ_NEXT(_ep, ee_link);                                 \
     }                                                                  \
 } while (0)
 
 #define EVENTHANDLER_FAST_REGISTER(name, func, arg, priority) \
-    eventhandler_register(Xeventhandler_list_ ## name, #name, func, arg, 
priority)
+    eventhandler_register(Xeventhandler_list_ ## name, #name, #func, func, 
arg, priority)
 
 #define EVENTHANDLER_FAST_DEREGISTER(name, tag) \
     eventhandler_deregister(Xeventhandler_list ## name, tag)
@@ -121,13 +125,15 @@ do {                                                      
                \
        for (_ep = TAILQ_FIRST(&(_el->el_entries));                     \
             _ep != NULL;                                               \
             _ep = TAILQ_NEXT(_ep, ee_link)) {                          \
+       if (eventhandler_show_invoked_funcs)                            \
+               kprintf("INVOKE(" #name ") %s\n", _ep->ee_name);        \
            ((struct eventhandler_entry_ ## name *)_ep)->eh_func(_ep->ee_arg , 
## args); \
        }                                                               \
     }                                                                  \
 } while (0)
 
 #define EVENTHANDLER_REGISTER(name, func, arg, priority) \
-    eventhandler_register(NULL, #name, func, arg, priority)
+    eventhandler_register(NULL, #name, #func, func, arg, priority)
 
 #define EVENTHANDLER_DEREGISTER(name, tag)             \
 do {                                                   \
@@ -141,6 +147,7 @@ do {                                                        
\
 #ifdef _KERNEL
 extern eventhandler_tag        eventhandler_register(struct eventhandler_list 
*list, 
                                              char *name,
+                                             const char *fname,
                                              void *func, 
                                              void *arg, 
                                              int priority);
Index: kern/subr_eventhandler.c
===================================================================
RCS file: /home/source/dragonfly/cvs/src/sys/kern/subr_eventhandler.c,v
retrieving revision 1.5
diff -u -p -r1.5 subr_eventhandler.c
--- kern/subr_eventhandler.c    5 Sep 2006 03:48:12 -0000       1.5
+++ kern/subr_eventhandler.c    11 Jul 2007 04:13:07 -0000
@@ -35,6 +35,8 @@
 
 MALLOC_DEFINE(M_EVENTHANDLER, "eventhandler", "Event handler records");
 
+int eventhandler_show_invoked_funcs = 0;
+
 /* List of 'slow' lists */
 static TAILQ_HEAD(, eventhandler_list) eventhandler_lists;
 static int                             eventhandler_lists_initted = 0;
@@ -50,8 +52,8 @@ struct eventhandler_entry_generic 
  * if all priorities are identical.
  */
 eventhandler_tag
-eventhandler_register(struct eventhandler_list *list, char *name, 
-                     void *func, void *arg, int priority)
+eventhandler_register(struct eventhandler_list *list, char *name,
+                     const char *funcname, void *func, void *arg, int priority)
 {
     struct eventhandler_entry_generic  *eg;
     struct eventhandler_entry          *ep;
@@ -88,6 +90,7 @@ eventhandler_register(struct eventhandle
     eg->func = func;
     eg->ee.ee_arg = arg;
     eg->ee.ee_priority = priority;
+    eg->ee.ee_name = funcname;
     
     /* sort it into the list */
     for (ep = TAILQ_FIRST(&list->el_entries);

Reply via email to