Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S938446AbXHPDs5 (ORCPT ); Wed, 15 Aug 2007 23:48:57 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S933158AbXHPDsl (ORCPT ); Wed, 15 Aug 2007 23:48:41 -0400 Received: from ozlabs.org ([203.10.76.45]:52759 "EHLO ozlabs.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755719AbXHPDsj (ORCPT ); Wed, 15 Aug 2007 23:48:39 -0400 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-ID: <18115.51472.408193.332905@cargo.ozlabs.ibm.com> Date: Thu, 16 Aug 2007 13:48:32 +1000 From: Paul Mackerras To: Herbert Xu Cc: Christoph Lameter , Satyam Sharma , "Paul E. McKenney" , Stefan Richter , Chris Snook , Linux Kernel Mailing List , linux-arch@vger.kernel.org, Linus Torvalds , netdev@vger.kernel.org, Andrew Morton , ak@suse.de, heiko.carstens@de.ibm.com, davem@davemloft.net, schwidefsky@de.ibm.com, wensong@linux-vs.org, horms@verge.net.au, wjiang@resilience.com, cfriesen@nortel.com, zlynx@acm.org, rpjday@mindspring.com, jesper.juhl@gmail.com, segher@kernel.crashing.org Subject: Re: [PATCH 0/24] make atomic_read() behave consistently across all architectures In-Reply-To: <20070816033343.GA31844@gondor.apana.org.au> References: <20070816003948.GY9645@linux.vnet.ibm.com> <20070816005348.GA9645@linux.vnet.ibm.com> <20070816011414.GC9645@linux.vnet.ibm.com> <20070816020851.GA30809@gondor.apana.org.au> <18115.49946.522011.832468@cargo.ozlabs.ibm.com> <20070816033343.GA31844@gondor.apana.org.au> X-Mailer: VM 7.19 under Emacs 21.4.1 Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1689 Lines: 41 Herbert Xu writes: > If you're referring to the code in sk_stream_mem_schedule > then it's working as intended. The atomicity guarantees You mean it's intended that *sk->sk_prot->memory_pressure can end up as 1 when sk->sk_prot->memory_allocated is small (less than ->sysctl_mem[0]), or as 0 when ->memory_allocated is large (greater than ->sysctl_mem[2])? Because that's the effect of the current code. If so I wonder why you bother computing it. > that the atomic_add/atomic_sub won't be seen in parts by > other readers. > > We certainly do not need to see other atomic_add/atomic_sub > operations immediately. > > If you're referring to another code snippet please cite. > > > I'd go so far as to say that anywhere where you want a non-"volatile" > > atomic_read, either your code is buggy, or else an int would work just > > as well. > > An int won't work here because += and -= do not have the > atomicity guarantees that atomic_add/atomic_sub do. In > particular, this may cause an atomic_read on another CPU > to give a bogus reading. The point is that guaranteeing the atomicity of the increment or decrement does not suffice to make the code race-free. In this case the race arises from the fact that reading ->memory_allocated and setting *->memory_pressure are separate operations. To make that code work properly you need a lock. And once you have the lock an ordinary int would suffice for ->memory_allocated. Paul. - 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/