> >> Wait - if it returns EAGAIN for a while, then look at that code above. 
> >> It will hold the sysctl lock for some indefinite amount of time.  Maybe 
> >> it should look like this instead:
> >> 
> >> 
> >>    do {
> >>        SYSCTL_LOCK();
> >>        req.oldidx = 0;
> >>        req.newidx = 0;
> >>        error = sysctl_root(0, name, namelen, &req);
> >>        SYSCTL_UNLOCK();
> >>    } while (error == EAGAIN);
> >> 
> >>    if (req.lock == REQ_WIRED && req.validlen > 0)
> >>        vsunlock(req.oldptr, req.validlen);
> >> 
> > 
> > Tried no difference unfortunately, possibly its give the closeness
> > of the lock unlock its just reacquiring the lock straight after releasing
> > it hence not giving the other thread chance to run / obtain the lock?
> 
> In an attempt to prove this is in fact the issue I've tried with the
> locking around this code removed, yes dangerous but just as a test :)
> It does indeed prevent the extended lockup so this is the right area.

Would adding a call to cpu_switch() be appropriate here?
_______________________________________________
freebsd-performance@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-performance
To unsubscribe, send any mail to "[EMAIL PROTECTED]"

Reply via email to