Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1750829AbWIYHrd (ORCPT ); Mon, 25 Sep 2006 03:47:33 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1750898AbWIYHrd (ORCPT ); Mon, 25 Sep 2006 03:47:33 -0400 Received: from mail.renesas.com ([202.234.163.13]:43209 "EHLO mail03.idc.renesas.com") by vger.kernel.org with ESMTP id S1750829AbWIYHrd (ORCPT ); Mon, 25 Sep 2006 03:47:33 -0400 Date: Mon, 25 Sep 2006 16:47:22 +0900 From: Hirokazu Takata Subject: Re: [PATCH] m32r: Revise __raw_read_trylock() In-reply-to: <20060924062036.GB30273@parisc-linux.org> To: Matthew Wilcox Cc: Hirokazu Takata , Andrew Morton , linux-kernel@vger.kernel.org Message-id: MIME-version: 1.0 (generated by SEMI 1.14.6 - "Maruoka") Content-type: text/plain; charset=US-ASCII User-Agent: Wanderlust/2.14.0 (Africa) Emacs/21.4 Mule/5.0 (SAKAKI) References: <20060924062036.GB30273@parisc-linux.org> Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2427 Lines: 87 From: Matthew Wilcox Subject: Re: [PATCH] m32r: Revise __raw_read_trylock() Date: Sun, 24 Sep 2006 00:20:36 -0600 > On Fri, Sep 22, 2006 at 03:29:53PM +0900, Hirokazu Takata wrote: > > > > -#define __raw_read_trylock(lock) generic__raw_read_trylock(lock) > > +static inline int __raw_read_trylock(raw_rwlock_t *lock) > > +{ > > + atomic_t *count = (atomic_t*)lock; > > + atomic_dec(count); > > + if (atomic_read(count) >= 0) > > + return 1; > > + atomic_inc(count); > > + return 0; > > +} > > > > Is there a race here between __raw_read_trylock and __raw_write_trylock? > > CPU A CPU B > __raw_read_trylock > atomic_dec(count); > __raw_write_trylock > atomic_sub_and_test(RW_LOCK_BIAS, count) > atomic_read(count) Indeed, it is a possible race. > It'd be fairly harmless as neither would manage to get the lock. But > I think it's not too hard to fix. Seems to me you want to do: I agree with you. As you said, I think the above case is harmless. > static inline int __raw_read_trylock(raw_rwlock_t *lock) > { > atomic_t *count = (atomic_t*)lock; > if (atomic_dec_return(count) >= 0) > return 1; > atomic_inc(count); > return 0; > } > > eliminating the race. > All right, I think this fix is preferable. Andrew, please drop and replace the previous my patch with the following Matthew's fix. Thank you. Signed-off-by: Hirokazu Takata Cc: Matthew Wilcox -- include/asm-m32r/spinlock.h | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/include/asm-m32r/spinlock.h b/include/asm-m32r/spinlock.h index f94c1a6..f9f9072 100644 --- a/include/asm-m32r/spinlock.h +++ b/include/asm-m32r/spinlock.h @@ -298,7 +298,14 @@ #endif /* CONFIG_CHIP_M32700_TS1 */ ); } -#define __raw_read_trylock(lock) generic__raw_read_trylock(lock) +static inline int __raw_read_trylock(raw_rwlock_t *lock) +{ + atomic_t *count = (atomic_t*)lock; + if (atomic_dec_return(count) >= 0) + return 1; + atomic_inc(count); + return 0; +} static inline int __raw_write_trylock(raw_rwlock_t *lock) { -- Hirokazu Takata Linux/M32R Project: http://www.linux-m32r.org/ - 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/