diff mbox series

[bpf,v3] bpftool: fix percpu maps updating

Message ID 2aa43d94db61dc2644bc18a47fba2889ec93bf3e.1548069694.git.pabeni@redhat.com
State Accepted
Delegated to: BPF Maintainers
Headers show
Series [bpf,v3] bpftool: fix percpu maps updating | expand

Commit Message

Paolo Abeni Jan. 21, 2019, 11:36 a.m. UTC
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: 71bb428fe2c1 ("tools: bpf: add bpftool")
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
---
 tools/bpf/bpftool/map.c | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

Comments

Quentin Monnet Jan. 21, 2019, 11:47 a.m. UTC | #1
2019-01-21 12:36 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.
> 
> v2 -> v3:
>  - drop unused argument, as per Quentin's suggestion
> v1 -> v2:
>  - rename the helper as per Quentin's suggestion
> 
> Fixes: 71bb428fe2c1 ("tools: bpf: add bpftool")
> Signed-off-by: Paolo Abeni <pabeni@redhat.com>

All good for me this time, thanks!

Reviewed-by: Quentin Monnet <quentin.monnet@netronome.com>
Daniel Borkmann Jan. 23, 2019, 8:59 a.m. UTC | #2
On 01/21/2019 12:36 PM, Paolo Abeni wrote:
> 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: 71bb428fe2c1 ("tools: bpf: add bpftool")
> Signed-off-by: Paolo Abeni <pabeni@redhat.com>

Applied to bpf, thanks!
diff mbox series

Patch

diff --git a/tools/bpf/bpftool/map.c b/tools/bpf/bpftool/map.c
index 2037e3dc864b..29a3468c6cf6 100644
--- a/tools/bpf/bpftool/map.c
+++ b/tools/bpf/bpftool/map.c
@@ -347,6 +347,20 @@  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)
+{
+	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 +440,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);
 		}
 
 		return parse_elem(argv, info, key, NULL, key_size, value_size,