|
17 | 17 | #include "string2.h" |
18 | 18 | #include "strbuf.h" |
19 | 19 | #include "debug.h" |
20 | | -#include <api/fs/tracing_path.h> |
21 | | -#include <api/io_dir.h> |
22 | 20 | #include <perf/cpumap.h> |
23 | 21 | #include <util/parse-events-bison.h> |
24 | 22 | #include <util/parse-events-flex.h> |
25 | 23 | #include "pmu.h" |
26 | 24 | #include "pmus.h" |
| 25 | +#include "tp_pmu.h" |
27 | 26 | #include "asm/bug.h" |
28 | 27 | #include "ui/ui.h" |
29 | 28 | #include "util/parse-branch-options.h" |
|
33 | 32 | #include "util/stat.h" |
34 | 33 | #include "util/util.h" |
35 | 34 | #include "tracepoint.h" |
| 35 | +#include <api/fs/tracing_path.h> |
36 | 36 |
|
37 | 37 | #define MAX_NAME_LEN 100 |
38 | 38 |
|
@@ -599,105 +599,82 @@ static int add_tracepoint(struct parse_events_state *parse_state, |
599 | 599 | return 0; |
600 | 600 | } |
601 | 601 |
|
602 | | -static int add_tracepoint_multi_event(struct parse_events_state *parse_state, |
603 | | - struct list_head *list, |
604 | | - const char *sys_name, const char *evt_name, |
605 | | - struct parse_events_error *err, |
606 | | - struct parse_events_terms *head_config, YYLTYPE *loc) |
607 | | -{ |
608 | | - char *evt_path; |
609 | | - struct io_dirent64 *evt_ent; |
610 | | - struct io_dir evt_dir; |
611 | | - int ret = 0, found = 0; |
612 | | - |
613 | | - evt_path = get_events_file(sys_name); |
614 | | - if (!evt_path) { |
615 | | - tracepoint_error(err, errno, sys_name, evt_name, loc->first_column); |
616 | | - return -1; |
617 | | - } |
618 | | - io_dir__init(&evt_dir, open(evt_path, O_CLOEXEC | O_DIRECTORY | O_RDONLY)); |
619 | | - if (evt_dir.dirfd < 0) { |
620 | | - put_events_file(evt_path); |
621 | | - tracepoint_error(err, errno, sys_name, evt_name, loc->first_column); |
622 | | - return -1; |
623 | | - } |
| 602 | +struct add_tracepoint_multi_args { |
| 603 | + struct parse_events_state *parse_state; |
| 604 | + struct list_head *list; |
| 605 | + const char *sys_glob; |
| 606 | + const char *evt_glob; |
| 607 | + struct parse_events_error *err; |
| 608 | + struct parse_events_terms *head_config; |
| 609 | + YYLTYPE *loc; |
| 610 | + int found; |
| 611 | +}; |
624 | 612 |
|
625 | | - while (!ret && (evt_ent = io_dir__readdir(&evt_dir))) { |
626 | | - if (!strcmp(evt_ent->d_name, ".") |
627 | | - || !strcmp(evt_ent->d_name, "..") |
628 | | - || !strcmp(evt_ent->d_name, "enable") |
629 | | - || !strcmp(evt_ent->d_name, "filter")) |
630 | | - continue; |
| 613 | +static int add_tracepoint_multi_event_cb(void *state, const char *sys_name, const char *evt_name) |
| 614 | +{ |
| 615 | + struct add_tracepoint_multi_args *args = state; |
| 616 | + int ret; |
631 | 617 |
|
632 | | - if (!strglobmatch(evt_ent->d_name, evt_name)) |
633 | | - continue; |
| 618 | + if (!strglobmatch(evt_name, args->evt_glob)) |
| 619 | + return 0; |
634 | 620 |
|
635 | | - found++; |
| 621 | + args->found++; |
| 622 | + ret = add_tracepoint(args->parse_state, args->list, sys_name, evt_name, |
| 623 | + args->err, args->head_config, args->loc); |
636 | 624 |
|
637 | | - ret = add_tracepoint(parse_state, list, sys_name, evt_ent->d_name, |
638 | | - err, head_config, loc); |
639 | | - } |
| 625 | + return ret; |
| 626 | +} |
640 | 627 |
|
641 | | - if (!found) { |
642 | | - tracepoint_error(err, ENOENT, sys_name, evt_name, loc->first_column); |
643 | | - ret = -1; |
| 628 | +static int add_tracepoint_multi_event(struct add_tracepoint_multi_args *args, const char *sys_name) |
| 629 | +{ |
| 630 | + if (strpbrk(args->evt_glob, "*?") == NULL) { |
| 631 | + /* Not a glob. */ |
| 632 | + args->found++; |
| 633 | + return add_tracepoint(args->parse_state, args->list, sys_name, args->evt_glob, |
| 634 | + args->err, args->head_config, args->loc); |
644 | 635 | } |
645 | 636 |
|
646 | | - put_events_file(evt_path); |
647 | | - close(evt_dir.dirfd); |
648 | | - return ret; |
| 637 | + return tp_pmu__for_each_tp_event(sys_name, args, add_tracepoint_multi_event_cb); |
649 | 638 | } |
650 | 639 |
|
651 | | -static int add_tracepoint_event(struct parse_events_state *parse_state, |
652 | | - struct list_head *list, |
653 | | - const char *sys_name, const char *evt_name, |
654 | | - struct parse_events_error *err, |
655 | | - struct parse_events_terms *head_config, YYLTYPE *loc) |
| 640 | +static int add_tracepoint_multi_sys_cb(void *state, const char *sys_name) |
656 | 641 | { |
657 | | - return strpbrk(evt_name, "*?") ? |
658 | | - add_tracepoint_multi_event(parse_state, list, sys_name, evt_name, |
659 | | - err, head_config, loc) : |
660 | | - add_tracepoint(parse_state, list, sys_name, evt_name, |
661 | | - err, head_config, loc); |
| 642 | + struct add_tracepoint_multi_args *args = state; |
| 643 | + |
| 644 | + if (!strglobmatch(sys_name, args->sys_glob)) |
| 645 | + return 0; |
| 646 | + |
| 647 | + return add_tracepoint_multi_event(args, sys_name); |
662 | 648 | } |
663 | 649 |
|
664 | 650 | static int add_tracepoint_multi_sys(struct parse_events_state *parse_state, |
665 | 651 | struct list_head *list, |
666 | | - const char *sys_name, const char *evt_name, |
| 652 | + const char *sys_glob, const char *evt_glob, |
667 | 653 | struct parse_events_error *err, |
668 | 654 | struct parse_events_terms *head_config, YYLTYPE *loc) |
669 | 655 | { |
670 | | - struct io_dirent64 *events_ent; |
671 | | - struct io_dir events_dir; |
672 | | - int ret = 0; |
673 | | - char *events_dir_path = get_tracing_file("events"); |
| 656 | + struct add_tracepoint_multi_args args = { |
| 657 | + .parse_state = parse_state, |
| 658 | + .list = list, |
| 659 | + .sys_glob = sys_glob, |
| 660 | + .evt_glob = evt_glob, |
| 661 | + .err = err, |
| 662 | + .head_config = head_config, |
| 663 | + .loc = loc, |
| 664 | + .found = 0, |
| 665 | + }; |
| 666 | + int ret; |
674 | 667 |
|
675 | | - if (!events_dir_path) { |
676 | | - tracepoint_error(err, errno, sys_name, evt_name, loc->first_column); |
677 | | - return -1; |
| 668 | + if (strpbrk(sys_glob, "*?") == NULL) { |
| 669 | + /* Not a glob. */ |
| 670 | + ret = add_tracepoint_multi_event(&args, sys_glob); |
| 671 | + } else { |
| 672 | + ret = tp_pmu__for_each_tp_sys(&args, add_tracepoint_multi_sys_cb); |
678 | 673 | } |
679 | | - io_dir__init(&events_dir, open(events_dir_path, O_CLOEXEC | O_DIRECTORY | O_RDONLY)); |
680 | | - put_events_file(events_dir_path); |
681 | | - if (events_dir.dirfd < 0) { |
682 | | - tracepoint_error(err, errno, sys_name, evt_name, loc->first_column); |
683 | | - return -1; |
| 674 | + if (args.found == 0) { |
| 675 | + tracepoint_error(err, ENOENT, sys_glob, evt_glob, loc->first_column); |
| 676 | + return -ENOENT; |
684 | 677 | } |
685 | | - |
686 | | - while (!ret && (events_ent = io_dir__readdir(&events_dir))) { |
687 | | - if (!strcmp(events_ent->d_name, ".") |
688 | | - || !strcmp(events_ent->d_name, "..") |
689 | | - || !strcmp(events_ent->d_name, "enable") |
690 | | - || !strcmp(events_ent->d_name, "header_event") |
691 | | - || !strcmp(events_ent->d_name, "header_page")) |
692 | | - continue; |
693 | | - |
694 | | - if (!strglobmatch(events_ent->d_name, sys_name)) |
695 | | - continue; |
696 | | - |
697 | | - ret = add_tracepoint_event(parse_state, list, events_ent->d_name, |
698 | | - evt_name, err, head_config, loc); |
699 | | - } |
700 | | - close(events_dir.dirfd); |
701 | 678 | return ret; |
702 | 679 | } |
703 | 680 |
|
@@ -1406,12 +1383,8 @@ int parse_events_add_tracepoint(struct parse_events_state *parse_state, |
1406 | 1383 | return -EINVAL; |
1407 | 1384 | } |
1408 | 1385 |
|
1409 | | - if (strpbrk(sys, "*?")) |
1410 | | - return add_tracepoint_multi_sys(parse_state, list, sys, event, |
1411 | | - err, head_config, loc); |
1412 | | - else |
1413 | | - return add_tracepoint_event(parse_state, list, sys, event, |
1414 | | - err, head_config, loc); |
| 1386 | + return add_tracepoint_multi_sys(parse_state, list, sys, event, |
| 1387 | + err, head_config, loc); |
1415 | 1388 | } |
1416 | 1389 |
|
1417 | 1390 | static int __parse_events_add_numeric(struct parse_events_state *parse_state, |
|
0 commit comments