DragonFly bugs List (threaded) for 2007-07
[
Date Prev][
Date Next]
[
Thread Prev][
Thread Next]
[
Date Index][
Thread Index]
Re: [issue713] shutdown freeze and forced unmounts
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);
>
[
Date Prev][
Date Next]
[
Thread Prev][
Thread Next]
[
Date Index][
Thread Index]