Duh, I forgot including the change to kern_shutdown.c.  Can you insert
"eventhandler_show_invoked_funcs = 1;" somewhere just before the call
to EVENTHANDLER_INVOKE(shutdown_post_sync, howto) ?

Cheers.

On Wed, Jul 11, 2007 at 05:56:25PM -0400, Peter Avalos wrote:
> I'm looking the patch over (haven't tested it yet) but when is
> eventhandler_show_invoked_funcs ever going to be non-zero?
> 
> --Peter
> 
> On Wed, Jul 11, 2007 at 01:54:03PM +0900, YONETANI Tomokazu wrote:
> > 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_show_invoked_funcs = 1;        /* ADD THIS! */
> >         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