|
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