On Wed, Nov 4, 2020 at 3:26 AM David Verbeiren <david.verbeiren@xxxxxxxxxxxx> wrote: > > Zero-fill element values for all other cpus than current, just as > when not using prealloc. This is the only way the bpf program can > ensure known initial values for all cpus ('onallcpus' cannot be > set when coming from the bpf program). > > The scenario is: bpf program inserts some elements in a per-cpu > map, then deletes some (or userspace does). When later adding > new elements using bpf_map_update_elem(), the bpf program can > only set the value of the new elements for the current cpu. > When prealloc is enabled, previously deleted elements are re-used. > Without the fix, values for other cpus remain whatever they were > when the re-used entry was previously freed. > > A selftest is added to validate correct operation in above > scenario as well as in case of LRU per-cpu map element re-use. > > Fixes: 6c9059817432 ("bpf: pre-allocate hash map elements") > Acked-by: Matthieu Baerts <matthieu.baerts@xxxxxxxxxxxx> > Signed-off-by: David Verbeiren <david.verbeiren@xxxxxxxxxxxx> > --- > > Notes: > v4: > - Replaced racy "once" test by getpgid syscall with > check on pid. (Andrii) > - Copyright lines use /* */ (Andrii) Acked-by: Andrii Nakryiko <andrii@xxxxxxxxxx> > > v3: > - Added selftest that was initially provided as separate > patch, and reworked to > * use skeleton (Andrii, Song Liu) > * skip test if <=1 CPU (Song Liu) > > v2: > - Moved memset() to separate pcpu_init_value() function, > which replaces pcpu_copy_value() but delegates to it > for the cases where no memset() is needed (Andrii). > - This function now also avoids doing the memset() for > the current cpu for which the value must be set > anyhow (Andrii). > - Same pcpu_init_value() used for per-cpu LRU map > (Andrii). > > kernel/bpf/hashtab.c | 30 ++- > .../selftests/bpf/prog_tests/map_init.c | 214 ++++++++++++++++++ > .../selftests/bpf/progs/test_map_init.c | 33 +++ > 3 files changed, 275 insertions(+), 2 deletions(-) > create mode 100644 tools/testing/selftests/bpf/prog_tests/map_init.c > create mode 100644 tools/testing/selftests/bpf/progs/test_map_init.c > [...]