Message ID | 39671143dab077dcaffec59bd7e4ea6f7edbd0ba.1548066706.git.pabeni@redhat.com |
---|---|
State | Changes Requested |
Delegated to: | BPF Maintainers |
Headers | show |
Series | [bpf,v2] bpftool: fix percpu maps updating | expand |
2019-01-21 11:33 UTC+0100 ~ Paolo Abeni <pabeni@redhat.com> > When updating a percpu map, bpftool currently copies the provided > value only into the first per CPU copy of the specified value, > all others instances are left zeroed. > > This change explicitly copies the user-provided bytes to all the > per CPU instances, keeping the sub-command syntax unchanged. > > v1 -> v2: > - rename the helper as per Quentin's suggestion > > Fixes: 71bb428fe2c1 ("tools: bpf: add bpftool") > Signed-off-by: Paolo Abeni <pabeni@redhat.com> Thanks a lot for the change! Another one below, though. > --- > tools/bpf/bpftool/map.c | 17 +++++++++++++++++ > 1 file changed, 17 insertions(+) > > diff --git a/tools/bpf/bpftool/map.c b/tools/bpf/bpftool/map.c > index 2037e3dc864b..27c51dbc887c 100644 > --- a/tools/bpf/bpftool/map.c > +++ b/tools/bpf/bpftool/map.c > @@ -347,6 +347,21 @@ static char **parse_bytes(char **argv, const char *name, unsigned char *val, > return argv + i; > } > > +/* on per cpu maps we must copy the provided value on all value instances */ > +static void fill_per_cpu_value(struct bpf_map_info *info, void *value, > + __u32 value_size) The last "value_size" argument is never used in your function (you just use info->value_type). I just realised it now, sorry :s. > +{ > + unsigned int i, n, step; > + > + if (!map_is_per_cpu(info->type)) > + return; > + > + n = get_possible_cpus(); > + step = round_up(info->value_size, 8); > + for (i = 1; i < n; i++) > + memcpy(value + i * step, value, info->value_size); > +} > + > static int parse_elem(char **argv, struct bpf_map_info *info, > void *key, void *value, __u32 key_size, __u32 value_size, > __u32 *flags, __u32 **value_fd) > @@ -426,6 +441,8 @@ static int parse_elem(char **argv, struct bpf_map_info *info, > argv = parse_bytes(argv, "value", value, value_size); > if (!argv) > return -1; > + > + fill_per_cpu_value(info, value, value_size); > } > > return parse_elem(argv, info, key, NULL, key_size, value_size, >
diff --git a/tools/bpf/bpftool/map.c b/tools/bpf/bpftool/map.c index 2037e3dc864b..27c51dbc887c 100644 --- a/tools/bpf/bpftool/map.c +++ b/tools/bpf/bpftool/map.c @@ -347,6 +347,21 @@ static char **parse_bytes(char **argv, const char *name, unsigned char *val, return argv + i; } +/* on per cpu maps we must copy the provided value on all value instances */ +static void fill_per_cpu_value(struct bpf_map_info *info, void *value, + __u32 value_size) +{ + unsigned int i, n, step; + + if (!map_is_per_cpu(info->type)) + return; + + n = get_possible_cpus(); + step = round_up(info->value_size, 8); + for (i = 1; i < n; i++) + memcpy(value + i * step, value, info->value_size); +} + static int parse_elem(char **argv, struct bpf_map_info *info, void *key, void *value, __u32 key_size, __u32 value_size, __u32 *flags, __u32 **value_fd) @@ -426,6 +441,8 @@ static int parse_elem(char **argv, struct bpf_map_info *info, argv = parse_bytes(argv, "value", value, value_size); if (!argv) return -1; + + fill_per_cpu_value(info, value, value_size); } return parse_elem(argv, info, key, NULL, key_size, value_size,
When updating a percpu map, bpftool currently copies the provided value only into the first per CPU copy of the specified value, all others instances are left zeroed. This change explicitly copies the user-provided bytes to all the per CPU instances, keeping the sub-command syntax unchanged. v1 -> v2: - rename the helper as per Quentin's suggestion Fixes: 71bb428fe2c1 ("tools: bpf: add bpftool") Signed-off-by: Paolo Abeni <pabeni@redhat.com> --- tools/bpf/bpftool/map.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+)