|
|
@@ -370,6 +370,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)
|
|
|
@@ -449,6 +463,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,
|