sysctl -a is slow
Jaakko Heinonen
jh at FreeBSD.org
Tue Oct 19 09:00:03 UTC 2010
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);
}
%%%
--
Jaakko
More information about the freebsd-current
mailing list