Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751748AbWCCWhA (ORCPT ); Fri, 3 Mar 2006 17:37:00 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1751753AbWCCWhA (ORCPT ); Fri, 3 Mar 2006 17:37:00 -0500 Received: from smtp.osdl.org ([65.172.181.4]:24231 "EHLO smtp.osdl.org") by vger.kernel.org with ESMTP id S1751748AbWCCWg7 (ORCPT ); Fri, 3 Mar 2006 17:36:59 -0500 Date: Fri, 3 Mar 2006 14:36:34 -0800 (PST) From: Linus Torvalds To: Benjamin LaHaise cc: David Howells , Andrew Morton , ak@suse.de, mingo@redhat.com, jblunck@suse.de, matthew@wil.cx, linux-arch@vger.kernel.org, linuxppc64-dev@ozlabs.org, Linux Kernel Mailing List Subject: Re: Memory barriers and spin_unlock safety In-Reply-To: Message-ID: References: <32518.1141401780@warthog.cambridge.redhat.com> <1146.1141404346@warthog.cambridge.redhat.com> <5041.1141417027@warthog.cambridge.redhat.com> <20060303215114.GA13893@linux.intel.com> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1216 Lines: 41 On Fri, 3 Mar 2006, Linus Torvalds wrote: > > I suspect you have some bug in your implementation. I think Dekker's > algorithm depends on the reads and writes being ordered, and you don't > seem to do that. IOW, I think you need a full memory barrier after the "lock->turn = cpu ^ 1;" and you should have a "smp_rmb()" in between your reads of "lock->flags[cpu ^ 1]" and "lock->turn" to give the ordering that Dekker (or Peterson) expects. IOW, the code should be something like lock->flags[other] = 1; smp_wmb(); lock->turn = other smp_mb(); while (lock->turn == cpu) { smp_rmb(); if (!lock->flags[other]) break; } where the wmb's are no-ops on x86, but the rmb's certainly are not. I _suspect_ that the fact that it starts working with an 'sfence' in there somewhere is just because the sfence ends up being "serializing enough" that it just happens to work, but that it has nothing to do with the current kernel wmb() being wrong. Linus - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/