> >> 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]"