Re: locking/atomic: Introduce atomic_try_cmpxchg()

2017-03-27 Thread Dmitry Vyukov
On Mon, Mar 27, 2017 at 2:16 PM, Peter Zijlstra wrote: > On Fri, Mar 24, 2017 at 01:44:00PM +0100, Dmitry Vyukov wrote: >> Hi, >> >> I've come across: >> >> commit a9ebf306f52c756c4f9e50ee9a60cd6389d71344 >> Author: Peter Zijlstra >> Date: Wed Feb 1 16:39:38 2017 +0100 >> locking/atomic: Int

Re: locking/atomic: Introduce atomic_try_cmpxchg()

2017-03-27 Thread Peter Zijlstra
On Fri, Mar 24, 2017 at 01:44:00PM +0100, Dmitry Vyukov wrote: > Hi, > > I've come across: > > commit a9ebf306f52c756c4f9e50ee9a60cd6389d71344 > Author: Peter Zijlstra > Date: Wed Feb 1 16:39:38 2017 +0100 > locking/atomic: Introduce atomic_try_cmpxchg() > > The primitive has subtle differ

Re: locking/atomic: Introduce atomic_try_cmpxchg()

2017-03-27 Thread Peter Zijlstra
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. > > > >

Re: locking/atomic: Introduce atomic_try_cmpxchg()

2017-03-25 Thread Linus Torvalds
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. > > 107305094540256 843776 16114541 f5e36d > defconfig-build/vm

Re: locking/atomic: Introduce atomic_try_cmpxchg()

2017-03-25 Thread Peter Zijlstra
On Sat, Mar 25, 2017 at 11:34:32AM -0700, Linus Torvalds wrote: > On Sat, Mar 25, 2017 at 11:28 AM, Linus Torvalds > wrote: > > > > Hmm. Sad. The label approach looked like it would match the semantics > > of cmpxchg perfectly, but it's not as optimal as it superficially > > would have seemed. >

Re: locking/atomic: Introduce atomic_try_cmpxchg()

2017-03-25 Thread Linus Torvalds
On Sat, Mar 25, 2017 at 11:20 AM, Peter Zijlstra wrote: > > Added above, a few bytes smaller than the shiny new one actually. Hmm. Sad. The label approach looked like it would match the semantics of cmpxchg perfectly, but it's not as optimal as it superficially would have seemed. And I assume th

Re: locking/atomic: Introduce atomic_try_cmpxchg()

2017-03-25 Thread Linus Torvalds
On Sat, Mar 25, 2017 at 11:28 AM, Linus Torvalds wrote: > > Hmm. Sad. The label approach looked like it would match the semantics > of cmpxchg perfectly, but it's not as optimal as it superficially > would have seemed. Oh, I just noticed that at least your other one didn't mark "success" as being

Re: locking/atomic: Introduce atomic_try_cmpxchg()

2017-03-25 Thread Peter Zijlstra
On Sat, Mar 25, 2017 at 11:00:44AM -0700, Linus Torvalds wrote: > On Sat, Mar 25, 2017 at 12:51 AM, Peter Zijlstra wrote: > > On Fri, Mar 24, 2017 at 10:23:29PM +0100, Peter Zijlstra wrote: > > > >> I'll try and redo the patches that landed in tip and see what it does > >> for total vmlinux size s

Re: locking/atomic: Introduce atomic_try_cmpxchg()

2017-03-25 Thread Linus Torvalds
On Sat, Mar 25, 2017 at 12:51 AM, Peter Zijlstra wrote: > On Fri, Mar 24, 2017 at 10:23:29PM +0100, Peter Zijlstra wrote: > >> I'll try and redo the patches that landed in tip and see what it does >> for total vmlinux size somewhere tomorrow. > >textdata bss dec hex filename >

Re: locking/atomic: Introduce atomic_try_cmpxchg()

2017-03-25 Thread Peter Zijlstra
On Fri, Mar 24, 2017 at 10:23:29PM +0100, Peter Zijlstra wrote: > I'll try and redo the patches that landed in tip and see what it does > for total vmlinux size somewhere tomorrow. textdata bss dec hex filename 107264134540256 843776 16110445 f5d36d defconfig-

Re: locking/atomic: Introduce atomic_try_cmpxchg()

2017-03-24 Thread Peter Zijlstra
On Fri, Mar 24, 2017 at 12:17:28PM -0700, Linus Torvalds wrote: > On Fri, Mar 24, 2017 at 11:45 AM, Andy Lutomirski wrote: > > > > Is there some hack like if __builtin_is_unescaped(*val) *val = old; > > that would work? > > See my recent email suggesting a completely different interface, which >

Re: locking/atomic: Introduce atomic_try_cmpxchg()

2017-03-24 Thread Peter Zijlstra
On Fri, Mar 24, 2017 at 01:27:49PM -0700, Andy Lutomirski wrote: > On Fri, Mar 24, 2017 at 1:22 PM, Peter Zijlstra wrote: > > On Fri, Mar 24, 2017 at 11:45:46AM -0700, Andy Lutomirski wrote: > >> After playing with it a bit, I found some of the problem: you're > >> passing val into EXCEPTION_VALUE

Re: locking/atomic: Introduce atomic_try_cmpxchg()

2017-03-24 Thread Linus Torvalds
On Fri, Mar 24, 2017 at 1:46 PM, Peter Zijlstra wrote: > > I certainly like it better, but so far I'm having trouble reproducing > your results. What compiler version are you on? I have: gcc version 6.3.1 20161221 (Red Hat 6.3.1-1) (GCC) from gcc-6.3.1-1.fc24.x86_64 and I'm attaching

Re: locking/atomic: Introduce atomic_try_cmpxchg()

2017-03-24 Thread Peter Zijlstra
On Fri, Mar 24, 2017 at 12:08:32PM -0700, Linus Torvalds wrote: > On Fri, Mar 24, 2017 at 10:23 AM, Peter Zijlstra wrote: > > > > I tried a few variants, but nothing really made it better. > > So I really hate how your thing has two return values, and fakes the > second one using the pointer valu

Re: locking/atomic: Introduce atomic_try_cmpxchg()

2017-03-24 Thread Andy Lutomirski
On Fri, Mar 24, 2017 at 1:22 PM, Peter Zijlstra wrote: > On Fri, Mar 24, 2017 at 11:45:46AM -0700, Andy Lutomirski wrote: >> After playing with it a bit, I found some of the problem: you're >> passing val into EXCEPTION_VALUE, which keeps it live. If I get rid >> of that, the generated code is gr

Re: locking/atomic: Introduce atomic_try_cmpxchg()

2017-03-24 Thread Peter Zijlstra
On Fri, Mar 24, 2017 at 11:45:46AM -0700, Andy Lutomirski wrote: > After playing with it a bit, I found some of the problem: you're > passing val into EXCEPTION_VALUE, which keeps it live. If I get rid > of that, the generated code is great. Right, so I needed that because I land on ud2 through 2

Re: locking/atomic: Introduce atomic_try_cmpxchg()

2017-03-24 Thread Andy Lutomirski
On Fri, Mar 24, 2017 at 1:14 PM, Peter Zijlstra wrote: > On Fri, Mar 24, 2017 at 12:16:11PM -0700, Andy Lutomirski wrote: >> On Fri, Mar 24, 2017 at 11:13 AM, Peter Zijlstra >> wrote: > >> > Not to mention we cannot use the C11 atomics in kernel because we want >> > to be able to runtime patch L

Re: locking/atomic: Introduce atomic_try_cmpxchg()

2017-03-24 Thread Peter Zijlstra
On Fri, Mar 24, 2017 at 12:20:37PM -0700, Linus Torvalds wrote: > I doubt it's a show-stopper, if only because nobody cares about UP any > more. Not even the embedded world does. For some obscure reason we recently introduced a variant for virt people. Where it would need memory barriers against t

Re: locking/atomic: Introduce atomic_try_cmpxchg()

2017-03-24 Thread Peter Zijlstra
On Fri, Mar 24, 2017 at 12:16:11PM -0700, Andy Lutomirski wrote: > On Fri, Mar 24, 2017 at 11:13 AM, Peter Zijlstra wrote: > > Not to mention we cannot use the C11 atomics in kernel because we want > > to be able to runtime patch LOCK prefixes when only 1 CPU is available. > > Is this really a s

Re: locking/atomic: Introduce atomic_try_cmpxchg()

2017-03-24 Thread Andy Lutomirski
On Fri, Mar 24, 2017 at 12:20 PM, Linus Torvalds wrote: > On Fri, Mar 24, 2017 at 12:16 PM, Andy Lutomirski wrote: >>> >>> Not to mention we cannot use the C11 atomics in kernel because we want >>> to be able to runtime patch LOCK prefixes when only 1 CPU is available. >> >> Is this really a show

Re: locking/atomic: Introduce atomic_try_cmpxchg()

2017-03-24 Thread Linus Torvalds
On Fri, Mar 24, 2017 at 12:16 PM, Andy Lutomirski wrote: >> >> Not to mention we cannot use the C11 atomics in kernel because we want >> to be able to runtime patch LOCK prefixes when only 1 CPU is available. > > Is this really a show-stopper? I bet that objtool could be persuaded > to emit a lis

Re: locking/atomic: Introduce atomic_try_cmpxchg()

2017-03-24 Thread Linus Torvalds
On Fri, Mar 24, 2017 at 11:45 AM, Andy Lutomirski wrote: > > Is there some hack like if __builtin_is_unescaped(*val) *val = old; > that would work? See my recent email suggesting a completely different interface, which avoids this problem. My interface generates: : 0: 8b 07

Re: locking/atomic: Introduce atomic_try_cmpxchg()

2017-03-24 Thread Andy Lutomirski
On Fri, Mar 24, 2017 at 11:13 AM, Peter Zijlstra wrote: > On Fri, Mar 24, 2017 at 07:08:38PM +0100, Peter Zijlstra wrote: >> On Fri, Mar 24, 2017 at 06:51:15PM +0100, Dmitry Vyukov wrote: >> > On Fri, Mar 24, 2017 at 6:23 PM, Peter Zijlstra >> > wrote: >> > > On Fri, Mar 24, 2017 at 09:54:46AM -

Re: locking/atomic: Introduce atomic_try_cmpxchg()

2017-03-24 Thread Linus Torvalds
On Fri, Mar 24, 2017 at 10:23 AM, Peter Zijlstra wrote: > > I tried a few variants, but nothing really made it better. So I really hate how your thing has two return values, and fakes the second one using the pointer value. I dislike it for two different reasons: - it's bad for type checking: i

Re: locking/atomic: Introduce atomic_try_cmpxchg()

2017-03-24 Thread Andy Lutomirski
On Fri, Mar 24, 2017 at 10:23 AM, Peter Zijlstra wrote: > On Fri, Mar 24, 2017 at 09:54:46AM -0700, Andy Lutomirski wrote: >> > So the first snipped I tested regressed like so: >> > >> > >> > : >> > : >> >0: 8b 07

Re: locking/atomic: Introduce atomic_try_cmpxchg()

2017-03-24 Thread Dmitry Vyukov
On Fri, Mar 24, 2017 at 7:08 PM, Peter Zijlstra wrote: > On Fri, Mar 24, 2017 at 06:51:15PM +0100, Dmitry Vyukov wrote: >> On Fri, Mar 24, 2017 at 6:23 PM, Peter Zijlstra wrote: >> > On Fri, Mar 24, 2017 at 09:54:46AM -0700, Andy Lutomirski wrote: >> >> > So the first snipped I tested regressed l

Re: locking/atomic: Introduce atomic_try_cmpxchg()

2017-03-24 Thread Peter Zijlstra
On Fri, Mar 24, 2017 at 06:23:42PM +0100, Peter Zijlstra wrote: > I tried a few variants, but nothing really made it better. > > Find the tiny.c file below; I'm using: > > gcc (Debian 6.3.0-5) 6.3.0 20170124 > > it has both an inline and an stmt-expr try_cmpxchg variant to play with; > the 'ex

Re: locking/atomic: Introduce atomic_try_cmpxchg()

2017-03-24 Thread Peter Zijlstra
On Fri, Mar 24, 2017 at 07:08:38PM +0100, Peter Zijlstra wrote: > On Fri, Mar 24, 2017 at 06:51:15PM +0100, Dmitry Vyukov wrote: > > On Fri, Mar 24, 2017 at 6:23 PM, Peter Zijlstra > > wrote: > > > On Fri, Mar 24, 2017 at 09:54:46AM -0700, Andy Lutomirski wrote: > > >> > So the first snipped I te

Re: locking/atomic: Introduce atomic_try_cmpxchg()

2017-03-24 Thread Peter Zijlstra
On Fri, Mar 24, 2017 at 06:51:15PM +0100, Dmitry Vyukov wrote: > On Fri, Mar 24, 2017 at 6:23 PM, Peter Zijlstra wrote: > > On Fri, Mar 24, 2017 at 09:54:46AM -0700, Andy Lutomirski wrote: > >> > So the first snipped I tested regressed like so: > >> > > >> > > >> > :

Re: locking/atomic: Introduce atomic_try_cmpxchg()

2017-03-24 Thread Peter Zijlstra
On Fri, Mar 24, 2017 at 07:00:25PM +0100, Peter Zijlstra wrote: > static inline bool try_cmpxchg2(unsigned int *ptr, unsigned int *val, > unsigned int new) > { > unsigned int old = *val; > bool success; > > asm volatile goto("lock cmpxchgl %[new], %[ptr]; " >

Re: locking/atomic: Introduce atomic_try_cmpxchg()

2017-03-24 Thread Dmitry Vyukov
On Fri, Mar 24, 2017 at 6:23 PM, Peter Zijlstra wrote: > On Fri, Mar 24, 2017 at 09:54:46AM -0700, Andy Lutomirski wrote: >> > So the first snipped I tested regressed like so: >> > >> > >> > : >> > : >> >0: 8b 07

Re: locking/atomic: Introduce atomic_try_cmpxchg()

2017-03-24 Thread Peter Zijlstra
On Fri, Mar 24, 2017 at 09:54:46AM -0700, Andy Lutomirski wrote: > > So the first snipped I tested regressed like so: > > > > > > : > > : > >0: 8b 07 mov(%rdi),%eax 0: 8b > > 17

Re: locking/atomic: Introduce atomic_try_cmpxchg()

2017-03-24 Thread Andy Lutomirski
On Fri, Mar 24, 2017 at 9:41 AM, Peter Zijlstra wrote: > On Fri, Mar 24, 2017 at 03:21:40PM +0100, Peter Zijlstra wrote: >> On Fri, Mar 24, 2017 at 01:44:00PM +0100, Dmitry Vyukov wrote: > >> > So I would suggest to change it to a safer and less surprising >> > alternative: >> > >> > diff --git a/

Re: locking/atomic: Introduce atomic_try_cmpxchg()

2017-03-24 Thread Peter Zijlstra
On Fri, Mar 24, 2017 at 03:21:40PM +0100, Peter Zijlstra wrote: > On Fri, Mar 24, 2017 at 01:44:00PM +0100, Dmitry Vyukov wrote: > > So I would suggest to change it to a safer and less surprising > > alternative: > > > > diff --git a/arch/x86/include/asm/cmpxchg.h b/arch/x86/include/asm/cmpxchg.h

Re: locking/atomic: Introduce atomic_try_cmpxchg()

2017-03-24 Thread Dmitry Vyukov
On Fri, Mar 24, 2017 at 3:21 PM, Peter Zijlstra wrote: > On Fri, Mar 24, 2017 at 01:44:00PM +0100, Dmitry Vyukov wrote: >> >> The primitive has subtle difference with all other implementation that >> I know of, and can lead to very subtle bugs. Some time ago I've spent >> several days debugging a

Re: locking/atomic: Introduce atomic_try_cmpxchg()

2017-03-24 Thread Peter Zijlstra
On Fri, Mar 24, 2017 at 01:44:00PM +0100, Dmitry Vyukov wrote: > > The primitive has subtle difference with all other implementation that > I know of, and can lead to very subtle bugs. Some time ago I've spent > several days debugging a memory corruption caused by similar > implementation. Conside

re: locking/atomic: Introduce atomic_try_cmpxchg()

2017-03-24 Thread Dmitry Vyukov
Hi, I've come across: commit a9ebf306f52c756c4f9e50ee9a60cd6389d71344 Author: Peter Zijlstra Date: Wed Feb 1 16:39:38 2017 +0100 locking/atomic: Introduce atomic_try_cmpxchg() The primitive has subtle difference with all other implementation that I know of, and can lead to very subtle bugs