:It seems to me the main problem (so far) is the buftimelock..
:
: simple_lock(&buftimelock);
: bp->b_lock.lk_wmesg = buf_wmesg;
: bp->b_lock.lk_prio = PRIBIO + 4;
: bp->b_lock.lk_timo = 0;
: return (lockmgr(&(bp)->b_lock, locktype, &buftimelock, curproc));
:
:Inside lockmgr():
:
: simple_lock(&lkp->lk_interlock);
: if (flags & LK_INTERLOCK)
: simple_unlock(interlkp);
: ^^^^^^^^ <--- &buftimelock;
:
:Note that there is no LK_INTERLOCK in any of the calls to lockmgr().. On
:UP, simplelocks are noops. On SMP, they are real and nothing is ever
:freeing buftimelock.
Ah ha! That is definitely one problem. It may be the interim fix I've
been looking for.
:But that doesn't fix the UP problem where cluster_wbuild() tries to
:recursively re-lock a buf that the current process already owns. I have a
:few ideas about that one though, I just don't understand the clustering
:well enough yet to fix it.
I haven't had any problems with cluster_wbuild(), are you sure?
It looks ok to me.
:Speaking of SMP and simple locks, I'd like to turn on the debugging
:simplelocks that keep a reference count and check before switching to make
:sure that a process doesn't sleep holding a lock. This is a pretty
:fundamental sanity check and would have found the LK_INTERLOCK problem
:above before it got committed.
:
:Cheers,
:-Peter
:--
:Peter Wemm - [EMAIL PROTECTED]; [EMAIL PROTECTED]; [EMAIL PROTECTED]
I think this would be a good idea.
In general, I really dislike the complexity of both simplelocks and
lockmgr locks. Simplelocks aren't as simple as they should be and
really abuse SMP principles badly if they are indeed attempting to disable
interrupts on a global scale! lockmgr() locks are so expensive that
using them anywhere represents a serious performance concern. Their use
in the buffer cache code is going to be strictly temporary because of that.
Hopefully we will be able to remove them from the VFS code as well later
this year. They are unbelievably expensive, cutting at least 15 MBytes/sec
of cache-case I/O bandwidth.
What we really need to do is get rid of all the I/O and interrupt-safety
code that is being pushed into core infrastructure routines such as
simplelocks and instead operate interrupts as kernel threads. Spinlocks
need to be split into two kinds: One that actually spins, and one that
does a thread switch in its core loop ( but does not actually try to
sleep ). Thread-switching spinlocks would replace much of the current
use for spinlocks while the true spinlocks would be used only in
non-preemptive threads ( i.e. not used for anything that interacts with
an interrupt ). It is then a simple matter to work on further separating
resource access by interrupts to reduce the number of involuntary
synchronous context switches out of an interrupt thread - a simple
performance issue rather then a system-stopping issue.
-Matt
Matthew Dillon
<[EMAIL PROTECTED]>
To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-current" in the body of the message