The supposedly atomic functions in i386/include/atomic.h are not
as atomic as was previously thought :-):
#define atomic_add_short(P, V) (*(u_short*)(P) += (V))
I looked at that kinda funny. But C doesn't guarentee a RMW opcode
for a "+=" !!!. Alan found an example showing a load, add, and
separate store by disassembling the kernel. An interrupt occuring in
the middle of that sequence would lead to the reported problems.
I'm pretty sure this is the problem causing the "objtrm" lockups. I've
submitted a patch to Alan to make those atomic_*() functions inline
assembly.
There also appear to be a number of mistakes in some of the inline
assembly already laying around -- some of it appears to specify output
arguments for RMW instructions without also indicating to the compiler
that those are input arguments as well, leading to bogus optimizations
by the C compiler. The 'setbits' function is the one Alan found
inadvertantly while we were trying to figure out why my first iteration
didn't work. heh heh. Alan will fix the setbits inline.
It wouldn't hurt if someone with more assembly experience could audit
all of the inline assembly present in the source base.
I am re-running the 16MB/make -j5 buildworld test to see if this has
really fixed the problem.
-Matt
Matthew Dillon
<[EMAIL PROTECTED]>
To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-current" in the body of the message