diff options
Diffstat (limited to 'tools/bpf/bpftool/map.c')
-rw-r--r-- | tools/bpf/bpftool/map.c | 33 |
1 files changed, 24 insertions, 9 deletions
diff --git a/tools/bpf/bpftool/map.c b/tools/bpf/bpftool/map.c index 2037e3dc864b..1ef1ee2280a2 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, | |||
347 | return argv + i; | 347 | return argv + i; |
348 | } | 348 | } |
349 | 349 | ||
350 | /* on per cpu maps we must copy the provided value on all value instances */ | ||
351 | static void fill_per_cpu_value(struct bpf_map_info *info, void *value) | ||
352 | { | ||
353 | unsigned int i, n, step; | ||
354 | |||
355 | if (!map_is_per_cpu(info->type)) | ||
356 | return; | ||
357 | |||
358 | n = get_possible_cpus(); | ||
359 | step = round_up(info->value_size, 8); | ||
360 | for (i = 1; i < n; i++) | ||
361 | memcpy(value + i * step, value, info->value_size); | ||
362 | } | ||
363 | |||
350 | static int parse_elem(char **argv, struct bpf_map_info *info, | 364 | static int parse_elem(char **argv, struct bpf_map_info *info, |
351 | void *key, void *value, __u32 key_size, __u32 value_size, | 365 | void *key, void *value, __u32 key_size, __u32 value_size, |
352 | __u32 *flags, __u32 **value_fd) | 366 | __u32 *flags, __u32 **value_fd) |
@@ -426,6 +440,8 @@ static int parse_elem(char **argv, struct bpf_map_info *info, | |||
426 | argv = parse_bytes(argv, "value", value, value_size); | 440 | argv = parse_bytes(argv, "value", value, value_size); |
427 | if (!argv) | 441 | if (!argv) |
428 | return -1; | 442 | return -1; |
443 | |||
444 | fill_per_cpu_value(info, value); | ||
429 | } | 445 | } |
430 | 446 | ||
431 | return parse_elem(argv, info, key, NULL, key_size, value_size, | 447 | return parse_elem(argv, info, key, NULL, key_size, value_size, |
@@ -497,10 +513,9 @@ static int show_map_close_json(int fd, struct bpf_map_info *info) | |||
497 | jsonw_uint_field(json_wtr, "owner_prog_type", | 513 | jsonw_uint_field(json_wtr, "owner_prog_type", |
498 | prog_type); | 514 | prog_type); |
499 | } | 515 | } |
500 | if (atoi(owner_jited)) | 516 | if (owner_jited) |
501 | jsonw_bool_field(json_wtr, "owner_jited", true); | 517 | jsonw_bool_field(json_wtr, "owner_jited", |
502 | else | 518 | !!atoi(owner_jited)); |
503 | jsonw_bool_field(json_wtr, "owner_jited", false); | ||
504 | 519 | ||
505 | free(owner_prog_type); | 520 | free(owner_prog_type); |
506 | free(owner_jited); | 521 | free(owner_jited); |
@@ -553,7 +568,8 @@ static int show_map_close_plain(int fd, struct bpf_map_info *info) | |||
553 | char *owner_prog_type = get_fdinfo(fd, "owner_prog_type"); | 568 | char *owner_prog_type = get_fdinfo(fd, "owner_prog_type"); |
554 | char *owner_jited = get_fdinfo(fd, "owner_jited"); | 569 | char *owner_jited = get_fdinfo(fd, "owner_jited"); |
555 | 570 | ||
556 | printf("\n\t"); | 571 | if (owner_prog_type || owner_jited) |
572 | printf("\n\t"); | ||
557 | if (owner_prog_type) { | 573 | if (owner_prog_type) { |
558 | unsigned int prog_type = atoi(owner_prog_type); | 574 | unsigned int prog_type = atoi(owner_prog_type); |
559 | 575 | ||
@@ -563,10 +579,9 @@ static int show_map_close_plain(int fd, struct bpf_map_info *info) | |||
563 | else | 579 | else |
564 | printf("owner_prog_type %d ", prog_type); | 580 | printf("owner_prog_type %d ", prog_type); |
565 | } | 581 | } |
566 | if (atoi(owner_jited)) | 582 | if (owner_jited) |
567 | printf("owner jited"); | 583 | printf("owner%s jited", |
568 | else | 584 | atoi(owner_jited) ? "" : " not"); |
569 | printf("owner not jited"); | ||
570 | 585 | ||
571 | free(owner_prog_type); | 586 | free(owner_prog_type); |
572 | free(owner_jited); | 587 | free(owner_jited); |