On Mon, Feb 8, 2021 at 1:00 PM Andrii Nakryiko <andrii.nakryiko@xxxxxxxxx> wrote: > > On Sat, Feb 6, 2021 at 9:06 AM Alexei Starovoitov > <alexei.starovoitov@xxxxxxxxx> wrote: > > > > From: Alexei Starovoitov <ast@xxxxxxxxxx> > > > > Since sleepable programs are now executing under migrate_disable > > the per-cpu maps are safe to use. Also made me wonder if PERF_EVENT_ARRAY map is usable in sleepable now? > > The map-in-map were ok to use in sleepable from the time sleepable > > progs were introduced. > > > > Note that non-preallocated maps are still not safe, since there is > > no rcu_read_lock yet in sleepable programs and dynamically allocated > > map elements are relying on rcu protection. The sleepable programs > > have rcu_read_lock_trace instead. That limitation will be addresses > > in the future. > > > > Signed-off-by: Alexei Starovoitov <ast@xxxxxxxxxx> > > --- > > Great. > > Acked-by: Andrii Nakryiko <andrii@xxxxxxxxxx> > > > kernel/bpf/hashtab.c | 4 ++-- > > kernel/bpf/verifier.c | 7 ++++++- > > 2 files changed, 8 insertions(+), 3 deletions(-) > > > > diff --git a/kernel/bpf/hashtab.c b/kernel/bpf/hashtab.c > > index c1ac7f964bc9..d63912e73ad9 100644 > > --- a/kernel/bpf/hashtab.c > > +++ b/kernel/bpf/hashtab.c > > @@ -1148,7 +1148,7 @@ static int __htab_percpu_map_update_elem(struct bpf_map *map, void *key, > > /* unknown flags */ > > return -EINVAL; > > > > - WARN_ON_ONCE(!rcu_read_lock_held()); > > + WARN_ON_ONCE(!rcu_read_lock_held() && !rcu_read_lock_trace_held()); > > > > key_size = map->key_size; > > > > @@ -1202,7 +1202,7 @@ static int __htab_lru_percpu_map_update_elem(struct bpf_map *map, void *key, > > /* unknown flags */ > > return -EINVAL; > > > > - WARN_ON_ONCE(!rcu_read_lock_held()); > > + WARN_ON_ONCE(!rcu_read_lock_held() && !rcu_read_lock_trace_held()); > > > > key_size = map->key_size; > > > > diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c > > index 4189edb41b73..9561f2af7710 100644 > > --- a/kernel/bpf/verifier.c > > +++ b/kernel/bpf/verifier.c > > @@ -10020,9 +10020,14 @@ static int check_map_prog_compatibility(struct bpf_verifier_env *env, > > case BPF_MAP_TYPE_HASH: > > case BPF_MAP_TYPE_LRU_HASH: > > case BPF_MAP_TYPE_ARRAY: > > + case BPF_MAP_TYPE_PERCPU_HASH: > > + case BPF_MAP_TYPE_PERCPU_ARRAY: > > + case BPF_MAP_TYPE_LRU_PERCPU_HASH: > > + case BPF_MAP_TYPE_ARRAY_OF_MAPS: > > + case BPF_MAP_TYPE_HASH_OF_MAPS: > > if (!is_preallocated_map(map)) { > > verbose(env, > > - "Sleepable programs can only use preallocated hash maps\n"); > > + "Sleepable programs can only use preallocated maps\n"); > > return -EINVAL; > > } > > break; > > -- > > 2.24.1 > >