On Sat, 10 Jul 1999, Matthew Dillon wrote:

> 
>     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.

What a nightmare. This must be due to egcs compiling things differently
from gcc 2.7.1. I should have guessed when people started talking about
objtrm (I spent many unhappy hours looking for objtrm bugs on the alpha)
but my attention was elsewhere.

Before I fixed this stuff for the alpha, the += expressions were
scattered all over the source tree. At least you get to fix the macro :-).

--
Doug Rabson                             Mail:  [EMAIL PROTECTED]
Nonlinear Systems Ltd.                  Phone: +44 181 442 9037




To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-current" in the body of the message

Reply via email to