Date: Wed, 6 Jun 2007 10:03:37 +1000 (EST) From: Bruce Evans <brde@optusnet.com.au> To: John Baldwin <jhb@freebsd.org> Cc: src-committers@freebsd.org, cvs-src@freebsd.org, cvs-all@freebsd.org, Attilio Rao <attilio@freebsd.org>, Bruce Evans <brde@optusnet.com.au>, Kostik Belousov <kostikbel@gmail.com> Subject: Re: cvs commit: src/sys/kern kern_mutex.c Message-ID: <20070606094354.E51708@delplex.bde.org> In-Reply-To: <200706051230.21242.jhb@freebsd.org> References: <200706051420.l55EKEih018925@repoman.freebsd.org> <3bbf2fe10706050829o2d756a4cu22f98cf11c01f5e4@mail.gmail.com> <3bbf2fe10706050843x5aaafaafy284e339791bcfe42@mail.gmail.com> <200706051230.21242.jhb@freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
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@freebsd.org>: >>> 2007/6/5, Bruce Evans <brde@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. 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
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20070606094354.E51708>