Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752426AbbKKSbf (ORCPT ); Wed, 11 Nov 2015 13:31:35 -0500 Received: from casper.infradead.org ([85.118.1.10]:51589 "EHLO casper.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752098AbbKKSbc (ORCPT ); Wed, 11 Nov 2015 13:31:32 -0500 Date: Wed, 11 Nov 2015 19:31:28 +0100 From: Peter Zijlstra To: Alexei Starovoitov Cc: David Miller , will.deacon@arm.com, daniel@iogearbox.net, arnd@arndb.de, yang.shi@linaro.org, linaro-kernel@lists.linaro.org, eric.dumazet@gmail.com, zlim.lnx@gmail.com, ast@kernel.org, linux-kernel@vger.kernel.org, netdev@vger.kernel.org, xi.wang@gmail.com, catalin.marinas@arm.com, linux-arm-kernel@lists.infradead.org, yhs@plumgrid.com, bblanco@plumgrid.com Subject: Re: [PATCH 2/2] arm64: bpf: add BPF XADD instruction Message-ID: <20151111183128.GS17308@twins.programming.kicks-ass.net> References: <56436420.9090401@iogearbox.net> <20151111162341.GN9562@arm.com> <20151111172659.GA86334@ast-mbp.thefacebook.com> <20151111.123548.1039494689070388545.davem@davemloft.net> <20151111175741.GR17308@twins.programming.kicks-ass.net> <20151111181132.GA90947@ast-mbp.thefacebook.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20151111181132.GA90947@ast-mbp.thefacebook.com> User-Agent: Mutt/1.5.21 (2012-12-30) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 4093 Lines: 98 On Wed, Nov 11, 2015 at 10:11:33AM -0800, Alexei Starovoitov wrote: > On Wed, Nov 11, 2015 at 06:57:41PM +0100, Peter Zijlstra wrote: > > On Wed, Nov 11, 2015 at 12:35:48PM -0500, David Miller wrote: > > > From: Alexei Starovoitov > > > Date: Wed, 11 Nov 2015 09:27:00 -0800 > > > > > > > BPF_XADD == atomic_add() in kernel. period. > > > > we are not going to deprecate it or introduce something else. > > > > > > Agreed, it makes no sense to try and tie C99 or whatever atomic > > > semantics to something that is already clearly defined to have > > > exactly kernel atomic_add() semantics. > > > > Dave, this really doesn't make any sense to me. __sync primitives have > > well defined semantics and (e)BPF is violating this. > > bpf_xadd was never meant to be __sync_fetch_and_add equivalent. > From the day one it meant to be atomic_add() as kernel does it. > I did piggy back on __sync in the llvm backend because it was the quick > and dirty way to move forward. > In retrospect I should have introduced a clean intrinstic for that instead, > but it's not too late to do it now. user space we can change at any time > unlike kernel. I would argue that breaking userspace (language in this case) is equally bad. Programs that used to work will now no longer work. > > Furthermore, the fetch_and_add (or XADD) name has well defined > > semantics, which (e)BPF also violates. > > bpf_xadd also didn't meant to be 'fetch'. It was void return from the beginning. Then why the 'X'? The XADD name, does and always has meant: eXchange-ADD, this means it must have a return value. You using the XADD name for something that is not in fact XADD is just wrong. > > Atomicy is hard enough as it is, backends giving random interpretations > > to them isn't helping anybody. > > no randomness. You mean every other backend translating __sync_fetch_and_add() differently than you isn't random on your part? > bpf_xadd == atomic_add() in kernel. > imo that is the simplest and cleanest intepretantion one can have, no? Wrong though, if you'd named it BPF_ADD, sure, XADD, not so much. That is 'randomly' co-opting something that has well defined meaning and semantics with something else. > > It also baffles me that Alexei is seemingly unwilling to change/rev the > > (e)BPF instructions, which would be invisible to the regular user, he > > does want to change the language itself, which will impact all > > 'scripts'. > > well, we cannot change it in kernel because it's ABI. You can always rev it. Introduce a new set, and wait for users of the old set to die, then remove it. We do that all the time with Linux ABI. > I'm not against adding new insns. We definitely can, but let's figure out why? > Is anything broken? No. Yes, __sync_fetch_and_add() is broken when pulled through the eBPF backend. > So what new insns make sense? Depends a bit on how fancy you want to go. If you want to support weakly ordered architectures at full speed you'll need more (and more complexity) than if you decide to not go that way. The simplest option would be a fully ordered compare-and-swap operation. That is enough to implement everything else (at a cost). The other extreme is a weak ll/sc with an optimizer pass recognising various forms to translate into 'better' native instructions. > Add new one that does 'fetch_and_add' ? What is the real use case it > will be used for? Look at all the atomic_{add,dec}_return*() users in the kernel. A typical example would be a reader-writer lock implementations. See include/asm-generic/rwsem.h for examples. > Adding new intrinsic to llvm is not a big deal. I'll add it as soon > as I have time to work on it or if somebody beats me to it I would be > glad to test it and apply it. This isn't a speed coding contest. You want to think about this properly. -- 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/