All of lore.kernel.org
 help / color / mirror / Atom feed
From: will.deacon@arm.com (Will Deacon)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 2/2] arm64: bpf: add BPF XADD instruction
Date: Wed, 11 Nov 2015 16:23:41 +0000	[thread overview]
Message-ID: <20151111162341.GN9562@arm.com> (raw)
In-Reply-To: <56436420.9090401@iogearbox.net>

Hi Daniel,

Thanks for investigating this further.

On Wed, Nov 11, 2015 at 04:52:00PM +0100, Daniel Borkmann wrote:
> I played a bit around with eBPF code to assign the __sync_fetch_and_add()
> return value to a var and dump it to trace pipe, or use it as return code.
> llvm compiles it (with the result assignment) and it looks like:
> 
> [...]
> 206: (b7) r3 = 3
> 207: (db) lock *(u64 *)(r0 +0) += r3
> 208: (bf) r1 = r10
> 209: (07) r1 += -16
> 210: (b7) r2 = 10
> 211: (85) call 6 // r3 dumped here
> [...]
> 
> [...]
> 206: (b7) r5 = 3
> 207: (db) lock *(u64 *)(r0 +0) += r5
> 208: (bf) r1 = r10
> 209: (07) r1 += -16
> 210: (b7) r2 = 10
> 211: (b7) r3 = 43
> 212: (b7) r4 = 42
> 213: (85) call 6 // r5 dumped here
> [...]
> 
> [...]
> 11: (b7) r0 = 3
> 12: (db) lock *(u64 *)(r1 +0) += r0
> 13: (95) exit // r0 returned here
> [...]
> 
> What it seems is that we 'get back' the value (== 3 here in r3, r5, r0)
> that we're adding, at least that's what seems to be generated wrt
> register assignments. Hmm, the semantic differences of bpf target
> should be documented somewhere for people writing eBPF programs to
> be aware of.

If we're going to document it, a bug tracker might be a good place to
start. The behaviour, as it stands, is broken wrt the definition of the
__sync primitives. That is, there is no way to build __sync_fetch_and_add
out of BPF_XADD without changing its semantics.

We could fix this by either:

(1) Defining BPF_XADD to match __sync_fetch_and_add (including memory
    barriers).

(2) Introducing some new BPF_ atomics, that map to something like the
    C11 __atomic builtins and deprecating BPF_XADD in favour of these.

(3) Introducing new source-language intrinsics to match what BPF can do
    (unlikely to be popular).

As it stands, I'm not especially keen on adding BPF_XADD to the arm64
JIT backend until we have at least (1) and preferably (2) as well.

Will

WARNING: multiple messages have this Message-ID (diff)
From: Will Deacon <will.deacon@arm.com>
To: Daniel Borkmann <daniel@iogearbox.net>
Cc: Peter Zijlstra <peterz@infradead.org>,
	Arnd Bergmann <arnd@arndb.de>, "Shi, Yang" <yang.shi@linaro.org>,
	linaro-kernel@lists.linaro.org,
	Eric Dumazet <eric.dumazet@gmail.com>, Z Lim <zlim.lnx@gmail.com>,
	Alexei Starovoitov <ast@kernel.org>,
	LKML <linux-kernel@vger.kernel.org>,
	Network Development <netdev@vger.kernel.org>,
	Xi Wang <xi.wang@gmail.com>,
	Catalin Marinas <catalin.marinas@arm.com>,
	Alexei Starovoitov <alexei.starovoitov@gmail.com>,
	"linux-arm-kernel@lists.infradead.org" 
	<linux-arm-kernel@lists.infradead.org>,
	yhs@plumgrid.com, bblanco@plumgrid.com
Subject: Re: [PATCH 2/2] arm64: bpf: add BPF XADD instruction
Date: Wed, 11 Nov 2015 16:23:41 +0000	[thread overview]
Message-ID: <20151111162341.GN9562@arm.com> (raw)
In-Reply-To: <56436420.9090401@iogearbox.net>

Hi Daniel,

Thanks for investigating this further.

On Wed, Nov 11, 2015 at 04:52:00PM +0100, Daniel Borkmann wrote:
> I played a bit around with eBPF code to assign the __sync_fetch_and_add()
> return value to a var and dump it to trace pipe, or use it as return code.
> llvm compiles it (with the result assignment) and it looks like:
> 
> [...]
> 206: (b7) r3 = 3
> 207: (db) lock *(u64 *)(r0 +0) += r3
> 208: (bf) r1 = r10
> 209: (07) r1 += -16
> 210: (b7) r2 = 10
> 211: (85) call 6 // r3 dumped here
> [...]
> 
> [...]
> 206: (b7) r5 = 3
> 207: (db) lock *(u64 *)(r0 +0) += r5
> 208: (bf) r1 = r10
> 209: (07) r1 += -16
> 210: (b7) r2 = 10
> 211: (b7) r3 = 43
> 212: (b7) r4 = 42
> 213: (85) call 6 // r5 dumped here
> [...]
> 
> [...]
> 11: (b7) r0 = 3
> 12: (db) lock *(u64 *)(r1 +0) += r0
> 13: (95) exit // r0 returned here
> [...]
> 
> What it seems is that we 'get back' the value (== 3 here in r3, r5, r0)
> that we're adding, at least that's what seems to be generated wrt
> register assignments. Hmm, the semantic differences of bpf target
> should be documented somewhere for people writing eBPF programs to
> be aware of.

If we're going to document it, a bug tracker might be a good place to
start. The behaviour, as it stands, is broken wrt the definition of the
__sync primitives. That is, there is no way to build __sync_fetch_and_add
out of BPF_XADD without changing its semantics.

We could fix this by either:

(1) Defining BPF_XADD to match __sync_fetch_and_add (including memory
    barriers).

(2) Introducing some new BPF_ atomics, that map to something like the
    C11 __atomic builtins and deprecating BPF_XADD in favour of these.

(3) Introducing new source-language intrinsics to match what BPF can do
    (unlikely to be popular).

As it stands, I'm not especially keen on adding BPF_XADD to the arm64
JIT backend until we have at least (1) and preferably (2) as well.

Will

  reply	other threads:[~2015-11-11 16:23 UTC|newest]

Thread overview: 86+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-11-10 22:41 [PATCH 0/2] arm64: bpf: add BPF_ST and BPF_XADD instructions support Yang Shi
2015-11-10 22:41 ` Yang Shi
2015-11-10 22:41 ` Yang Shi
2015-11-10 22:41 ` [PATCH 1/2] arm64: bpf: add 'store immediate' instruction Yang Shi
2015-11-10 22:41   ` Yang Shi
2015-11-11  2:45   ` Z Lim
2015-11-11  2:45     ` Z Lim
2015-11-11 12:12     ` Will Deacon
2015-11-11 12:12       ` Will Deacon
2015-11-11 12:39       ` Will Deacon
2015-11-11 12:39         ` Will Deacon
2015-11-12 19:33         ` Shi, Yang
2015-11-12 19:33           ` Shi, Yang
2015-11-13  3:45           ` Z Lim
2015-11-13  3:45             ` Z Lim
2015-11-23 19:34             ` Shi, Yang
2015-11-23 19:34               ` Shi, Yang
2015-11-10 22:41 ` [PATCH 2/2] arm64: bpf: add BPF XADD instruction Yang Shi
2015-11-10 22:41   ` Yang Shi
2015-11-11  0:08   ` Eric Dumazet
2015-11-11  0:08     ` Eric Dumazet
2015-11-11  0:26     ` Shi, Yang
2015-11-11  0:26       ` Shi, Yang
2015-11-11  0:42       ` Alexei Starovoitov
2015-11-11  0:42         ` Alexei Starovoitov
2015-11-11  2:52         ` Z Lim
2015-11-11  2:52           ` Z Lim
2015-11-11  8:49           ` Arnd Bergmann
2015-11-11  8:49             ` Arnd Bergmann
2015-11-11 10:24             ` Will Deacon
2015-11-11 10:24               ` Will Deacon
2015-11-11 10:42               ` Daniel Borkmann
2015-11-11 10:42                 ` Daniel Borkmann
2015-11-11 11:58                 ` Will Deacon
2015-11-11 11:58                   ` Will Deacon
2015-11-11 12:21                   ` Daniel Borkmann
2015-11-11 12:21                     ` Daniel Borkmann
2015-11-11 12:38                     ` Will Deacon
2015-11-11 12:38                       ` Will Deacon
2015-11-11 12:58                       ` Peter Zijlstra
2015-11-11 12:58                         ` Peter Zijlstra
2015-11-11 15:52                         ` Daniel Borkmann
2015-11-11 15:52                           ` Daniel Borkmann
2015-11-11 16:23                           ` Will Deacon [this message]
2015-11-11 16:23                             ` Will Deacon
2015-11-11 17:27                             ` Alexei Starovoitov
2015-11-11 17:27                               ` Alexei Starovoitov
2015-11-11 17:35                               ` David Miller
2015-11-11 17:35                                 ` David Miller
2015-11-11 17:44                                 ` Will Deacon
2015-11-11 17:44                                   ` Will Deacon
2015-11-11 19:01                                   ` David Miller
2015-11-11 19:01                                     ` David Miller
2015-11-11 17:57                                 ` Peter Zijlstra
2015-11-11 17:57                                   ` Peter Zijlstra
2015-11-11 18:11                                   ` Alexei Starovoitov
2015-11-11 18:11                                     ` Alexei Starovoitov
2015-11-11 18:31                                     ` Peter Zijlstra
2015-11-11 18:31                                       ` Peter Zijlstra
2015-11-11 18:41                                       ` Peter Zijlstra
2015-11-11 18:41                                         ` Peter Zijlstra
2015-11-11 18:44                                       ` Peter Zijlstra
2015-11-11 18:44                                         ` Peter Zijlstra
2015-11-11 18:54                                         ` Peter Zijlstra
2015-11-11 18:54                                           ` Peter Zijlstra
2015-11-11 19:55                                           ` Alexei Starovoitov
2015-11-11 19:55                                             ` Alexei Starovoitov
2015-11-11 22:21                                             ` Peter Zijlstra
2015-11-11 22:21                                               ` Peter Zijlstra
2015-11-11 23:40                                               ` Alexei Starovoitov
2015-11-11 23:40                                                 ` Alexei Starovoitov
2015-11-11 23:40                                                 ` Alexei Starovoitov
2015-11-12  8:57                                                 ` Peter Zijlstra
2015-11-12  8:57                                                   ` Peter Zijlstra
2015-11-11 18:50                                       ` Daniel Borkmann
2015-11-11 18:50                                         ` Daniel Borkmann
2015-11-11 19:04                                         ` David Miller
2015-11-11 19:04                                           ` David Miller
2015-11-11 19:23                                         ` Peter Zijlstra
2015-11-11 19:23                                           ` Peter Zijlstra
2015-11-11 19:41                                           ` Daniel Borkmann
2015-11-11 19:41                                             ` Daniel Borkmann
2015-11-11 18:46                                     ` Will Deacon
2015-11-11 18:46                                       ` Will Deacon
2015-11-11 19:01                                     ` David Miller
2015-11-11 19:01                                       ` David Miller

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20151111162341.GN9562@arm.com \
    --to=will.deacon@arm.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.