sysctl -a is slow
David Xu
davidxu at freebsd.org
Wed Oct 20 01:47:51 UTC 2010
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!
More information about the freebsd-current
mailing list