[issue713] shutdown freeze and forced unmounts

YONETANI Tomokazu qhwt+dfly at les.ath.cx
Tue Jul 10 21:55:39 PDT 2007


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);




More information about the Bugs mailing list