Commit b0ca5ecb authored by Paolo Abeni's avatar Paolo Abeni Committed by Daniel Borkmann

bpftool: fix percpu maps updating

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.

v2 -> v3:
 - drop unused argument, as per Quentin's suggestion
v1 -> v2:
 - rename the helper as per Quentin's suggestion

Fixes: 71bb428f ("tools: bpf: add bpftool")
Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
Reviewed-by: default avatarQuentin Monnet <quentin.monnet@netronome.com>
Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
parent 752bcf80
...@@ -347,6 +347,20 @@ static char **parse_bytes(char **argv, const char *name, unsigned char *val, ...@@ -347,6 +347,20 @@ static char **parse_bytes(char **argv, const char *name, unsigned char *val,
return argv + i; 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)
{
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, static int parse_elem(char **argv, struct bpf_map_info *info,
void *key, void *value, __u32 key_size, __u32 value_size, void *key, void *value, __u32 key_size, __u32 value_size,
__u32 *flags, __u32 **value_fd) __u32 *flags, __u32 **value_fd)
...@@ -426,6 +440,8 @@ static int parse_elem(char **argv, struct bpf_map_info *info, ...@@ -426,6 +440,8 @@ static int parse_elem(char **argv, struct bpf_map_info *info,
argv = parse_bytes(argv, "value", value, value_size); argv = parse_bytes(argv, "value", value, value_size);
if (!argv) if (!argv)
return -1; return -1;
fill_per_cpu_value(info, value);
} }
return parse_elem(argv, info, key, NULL, key_size, value_size, return parse_elem(argv, info, key, NULL, key_size, value_size,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment