Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752868AbdC0Jxh (ORCPT ); Mon, 27 Mar 2017 05:53:37 -0400 Received: from merlin.infradead.org ([205.233.59.134]:48232 "EHLO merlin.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752532AbdC0Jtq (ORCPT ); Mon, 27 Mar 2017 05:49:46 -0400 Date: Mon, 27 Mar 2017 11:48:44 +0200 From: Peter Zijlstra To: Linus Torvalds Cc: Andy Lutomirski , Dmitry Vyukov , Andrew Morton , Andy Lutomirski , Borislav Petkov , Brian Gerst , Denys Vlasenko , "H. Peter Anvin" , Josh Poimboeuf , Paul McKenney , Thomas Gleixner , Ingo Molnar , LKML Subject: Re: locking/atomic: Introduce atomic_try_cmpxchg() Message-ID: <20170327094844.hx3efllvwuha7dyj@hirez.programming.kicks-ass.net> References: <20170324212329.GC5680@worktop> <20170325075156.GF32474@worktop> <20170325182023.qfnj6vaixibbgbmd@hirez.programming.kicks-ass.net> <20170325211330.duvzsioxs5ll4qbe@hirez.programming.kicks-ass.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: NeoMutt/20170113 (1.7.2) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1732 Lines: 57 On Sat, Mar 25, 2017 at 03:08:10PM -0700, Linus Torvalds wrote: > On Sat, Mar 25, 2017 at 2:13 PM, Peter Zijlstra wrote: > > On Sat, Mar 25, 2017 at 11:34:32AM -0700, Linus Torvalds wrote: > >> > >> Oh, I just noticed that at least your other one didn't mark "success" > >> as being likely. > > > > 10730509 4540256 843776 16114541 f5e36d defconfig-build/vmlinux > > Ok, that seems to be the exact same size as with the patch using the > "goto label" approach. So maybe the code generation is the same now. OK, so I went and build myself a GCC-7 compiler and constructed the below table. From this I would propose we do the "try_cmpxchg + if" thing, also below. Because, while the interface is icky, it is what C11 does for this construct. GCC-6.3.0: 10735757 (cmpxchg) 10726413 (try_cmpxchg) 10730701 (try_cmpxchg + likely) 10730509 (try_cmpxchg + if) 10730445 (try_cmpxchg-linus) GCC-7 (20170327): 10709514 (cmpxchg) 10704266 (try_cmpxchg) 10704458 (try_cmpxchg + likely) 10704266 (try_cmpxchg + if) 10704394 (try_cmpxchg-linus) --- arch/x86/include/asm/cmpxchg.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/arch/x86/include/asm/cmpxchg.h b/arch/x86/include/asm/cmpxchg.h index fb961db..d90296d 100644 --- a/arch/x86/include/asm/cmpxchg.h +++ b/arch/x86/include/asm/cmpxchg.h @@ -212,8 +212,9 @@ extern void __add_wrong_size(void) default: \ __cmpxchg_wrong_size(); \ } \ - *_old = __old; \ - success; \ + if (unlikely(!success)) \ + *_old = __old; \ + likely(success); \ }) #define __try_cmpxchg(ptr, pold, new, size) \