Jaakko Heinonen wrote:
On 2010-09-20, David Xu wrote:
I redirect all output to a disk file, and it still needs 1 second to
complete, this machine is dual-core pentium E5500, faster than previous
one which is a dual-core AMD 5000+ machine, the 5000+ needs 2
seconds to complete.

$/usr/bin/time sysctl -b kern.geom.confdot > sysctl_geom_confdot.txt
        1.00 real         0.00 user         0.00 sys

I couldn't reproduce the problem myself but I bet that it's a lost
wakeup in g_waitfor_event(). Can you try this patch?

%%%
Index: sys/geom/geom_event.c
===================================================================
--- sys/geom/geom_event.c       (revision 214048)
+++ sys/geom/geom_event.c       (working copy)
@@ -220,11 +220,12 @@ one_event(void)
        mtx_lock(&g_eventlock);
        TAILQ_REMOVE(&g_events, ep, events);
        ep->flag &= ~EV_INPROGRESS;
-       mtx_unlock(&g_eventlock);
        if (ep->flag & EV_WAKEUP) {
                ep->flag |= EV_DONE;
                wakeup(ep);
+               mtx_unlock(&g_eventlock);
        } else {
+               mtx_unlock(&g_eventlock);
                g_free(ep);
        }
        g_topology_unlock();
@@ -365,11 +366,14 @@ g_waitfor_event(g_event_t *func, void *a
        va_end(ap);
        if (error)
                return (error);
- do - tsleep(ep, PRIBIO, "g_waitfor_event", hz);
-       while (!(ep->flag & EV_DONE));
+
+       mtx_lock(&g_eventlock);
+       while (!(ep->flag & EV_DONE))
+               msleep(ep, &g_eventlock, PRIBIO, "g_waitfor_event", hz);
        if (ep->flag & EV_CANCELED)
                error = EAGAIN;
+       mtx_unlock(&g_eventlock);
+
        g_free(ep);
        return (error);
 }
%%%

Yes, the patch seems fixed the problem, I can not reproduce it.

Thanks!


_______________________________________________
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to "freebsd-current-unsubscr...@freebsd.org"

Reply via email to