From owner-freebsd-current Sat Jul 10 14:41:29 1999 Delivered-To: freebsd-current@freebsd.org Received: from apollo.backplane.com (apollo.backplane.com [209.157.86.2]) by hub.freebsd.org (Postfix) with ESMTP id E4EB114C08 for ; Sat, 10 Jul 1999 14:41:27 -0700 (PDT) (envelope-from dillon@apollo.backplane.com) Received: (from dillon@localhost) by apollo.backplane.com (8.9.3/8.9.1) id OAA58697; Sat, 10 Jul 1999 14:41:26 -0700 (PDT) (envelope-from dillon) Date: Sat, 10 Jul 1999 14:41:26 -0700 (PDT) From: Matthew Dillon Message-Id: <199907102141.OAA58697@apollo.backplane.com> To: Alan Cox , Stephen McKay , Andrew Gallatin , freebsd-current@FreeBSD.ORG Subject: "objtrm" problem probably found (was Re: Stuck in "objtrm") Sender: owner-freebsd-current@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.ORG 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 To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-current" in the body of the message