cvs commit: src/sys/kern kern_mutex.c

Jeff Roberson jroberson at chesapeake.net
Wed Jun 6 03:01:11 UTC 2007


On Wed, 6 Jun 2007, Bruce Evans wrote:

> On Tue, 5 Jun 2007, John Baldwin wrote:
>
>> On Tuesday 05 June 2007 11:43:03 am Attilio Rao wrote:
>>> 2007/6/5, Attilio Rao <attilio at freebsd.org>:
>>>> 2007/6/5, Bruce Evans <brde at optusnet.com.au>:
>>>>> 
>>>>> I get a "spin lock held too long" panic during (an interrupt in?) acpi
>>>>> initialization on booting non-PREEMPTION SCHED_4BSD SMP.  Haven't tried
>>>>> other cases.
>>>> 
>>>> Do you have a backtrace or any other debugging stuffs available?
>
> No, it's on a laptop with no i/o :-).
>
>>> Mmm, I think I got the bug.
>>> basically, in kern_mutex.c::_mtx_unlock_sleep(), in the not-preemptive
>>> case what happens at some point is:
>>> 
>>> td = curthread;
>>> if (td->td_critnest > 0 || td1->td_priority >= td->td_priority)
>>>          return;
>>> ...
>> If this is the old #ifndef PREEMPTION manual preemption stuff, then just
>> remove it.  I've been wanting to axe it for a while, rwlocks don't do the
>> manual preemption either, and if it is getting in the way it's best to just
>> purge it.
>
> Interesting, I've been wanting to do the opposite -- axe the #ifdef
> PREEMPTION in a different place, in pagezero, since non-manual preemption
> doesn't actually work for SCHED_4BSD (it works for SCHED_ULE, but last
> time I checked, SCHED_ULE was 7% slower for my makeworld benchmark
> since it lets CPUs go idle when there is a runnable process in the
> hope of a better CPU to run on becoming available).  My SMP kernel
> that crashes has this ifdef removed.  However, the crash doesn't
> seem to be caused by pgzero.

You should try with kern.sched.pick_pri = 0.  I have changed this to be 
the default recently.  This weakens the preemption and speeds up some 
workloads.

Are you still experiencing a crash with -current sources?

Jeff

>
> Removing the manual preemption stuff in kern_mutex.c wouldn't affect
> pgzero but might affect operation of the !PREEMPTION case for better
> or worse.  I only use !PREEMPTION on SMP.  With only 1 CPU, something
> like PREEMPTION is needed to get interrupts serviced as soon as possible,
> which is the only reason that I want to preempt things, but with > 1
> CPU there is a good chance of a CPU being idle or going near the
> scheduler soon and thus being scheduled to run interrupt handler(s)
> soon.  The chance increases with the number of CPUs.  !PREEMPTION works
> well in practice with only 2 CPUs (no noticeable interrupt latency),
> at least with manual preemption in kern_mutex.c.
>
> Bruce
>


More information about the cvs-all mailing list