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); |
