Re: [PATCH bpf-next 1/9] bpf: introduce bpf_spin_lock

2019-01-17 Thread Alexei Starovoitov
On Thu, Jan 17, 2019 at 12:27:55PM +0100, Daniel Borkmann wrote: > > Was thinking something like this, in very rough pseudo code: > > Prog A (normal spin lock use of mapA): > > val = bpf_map_lookup_elem(&mapA, &key); > if (val) { > bpf_spin_lock(&val->lock); > [...] > bpf_spin_un

Re: [PATCH bpf-next 1/9] bpf: introduce bpf_spin_lock

2019-01-17 Thread Daniel Borkmann
On 01/17/2019 02:16 AM, Alexei Starovoitov wrote: > On Thu, Jan 17, 2019 at 01:21:32AM +0100, Daniel Borkmann wrote: >> On 01/17/2019 12:30 AM, Alexei Starovoitov wrote: >>> On Thu, Jan 17, 2019 at 12:16:44AM +0100, Daniel Borkmann wrote: On 01/16/2019 11:48 PM, Daniel Borkmann wrote: > On

Re: [PATCH bpf-next 1/9] bpf: introduce bpf_spin_lock

2019-01-16 Thread Alexei Starovoitov
On Thu, Jan 17, 2019 at 01:21:32AM +0100, Daniel Borkmann wrote: > On 01/17/2019 12:30 AM, Alexei Starovoitov wrote: > > On Thu, Jan 17, 2019 at 12:16:44AM +0100, Daniel Borkmann wrote: > >> On 01/16/2019 11:48 PM, Daniel Borkmann wrote: > >>> On 01/16/2019 06:08 AM, Alexei Starovoitov wrote: > >>

Re: [PATCH bpf-next 1/9] bpf: introduce bpf_spin_lock

2019-01-16 Thread Alexei Starovoitov
On Thu, Jan 17, 2019 at 12:16:18AM +, Martin Lau wrote: > On Tue, Jan 15, 2019 at 09:08:22PM -0800, Alexei Starovoitov wrote: > [ ... ] > > > +/* copy everything but bpf_spin_lock */ > > +static inline void copy_map_value(struct bpf_map *map, void *dst, void > > *src) > > +{ > > + if (unlik

Re: [PATCH bpf-next 1/9] bpf: introduce bpf_spin_lock

2019-01-16 Thread Daniel Borkmann
On 01/17/2019 12:30 AM, Alexei Starovoitov wrote: > On Thu, Jan 17, 2019 at 12:16:44AM +0100, Daniel Borkmann wrote: >> On 01/16/2019 11:48 PM, Daniel Borkmann wrote: >>> On 01/16/2019 06:08 AM, Alexei Starovoitov wrote: >> [...] @@ -6096,6 +6226,11 @@ static int do_check(struct bpf_verifier_e

Re: [PATCH bpf-next 1/9] bpf: introduce bpf_spin_lock

2019-01-16 Thread Martin Lau
On Tue, Jan 15, 2019 at 09:08:22PM -0800, Alexei Starovoitov wrote: [ ... ] > +/* copy everything but bpf_spin_lock */ > +static inline void copy_map_value(struct bpf_map *map, void *dst, void *src) > +{ > + if (unlikely(map_value_has_spin_lock(map))) { > + u32 off = map->spin_lock

Re: [PATCH bpf-next 1/9] bpf: introduce bpf_spin_lock

2019-01-16 Thread Alexei Starovoitov
On Thu, Jan 17, 2019 at 12:16:44AM +0100, Daniel Borkmann wrote: > On 01/16/2019 11:48 PM, Daniel Borkmann wrote: > > On 01/16/2019 06:08 AM, Alexei Starovoitov wrote: > [...] > >> @@ -6096,6 +6226,11 @@ static int do_check(struct bpf_verifier_env *env) > >>retur

Re: [PATCH bpf-next 1/9] bpf: introduce bpf_spin_lock

2019-01-16 Thread Alexei Starovoitov
On Wed, Jan 16, 2019 at 11:48:15PM +0100, Daniel Borkmann wrote: > > I think if I'm not mistaken there should still be a possibility for causing a > deadlock, namely if in the middle of the critical section I'm using an LD_ABS > or LD_IND instruction with oob index such that I cause an implicit re

Re: [PATCH bpf-next 1/9] bpf: introduce bpf_spin_lock

2019-01-16 Thread Daniel Borkmann
On 01/16/2019 11:48 PM, Daniel Borkmann wrote: > On 01/16/2019 06:08 AM, Alexei Starovoitov wrote: [...] >> @@ -6096,6 +6226,11 @@ static int do_check(struct bpf_verifier_env *env) >> return -EINVAL; >> } >> >> +

Re: [PATCH bpf-next 1/9] bpf: introduce bpf_spin_lock

2019-01-16 Thread Daniel Borkmann
On 01/16/2019 06:08 AM, Alexei Starovoitov wrote: > Introduce 'struct bpf_spin_lock' and bpf_spin_lock/unlock() helpers to let > bpf program serialize access to other variables. > > Example: > struct hash_elem { > int cnt; > struct bpf_spin_lock lock; > }; > struct hash_elem * val = bpf_ma

[PATCH bpf-next 1/9] bpf: introduce bpf_spin_lock

2019-01-15 Thread Alexei Starovoitov
Introduce 'struct bpf_spin_lock' and bpf_spin_lock/unlock() helpers to let bpf program serialize access to other variables. Example: struct hash_elem { int cnt; struct bpf_spin_lock lock; }; struct hash_elem * val = bpf_map_lookup_elem(&hash_map, &key); if (val) { bpf_spin_lock(&val->l