diff options
Diffstat (limited to 'tools/perf/builtin-test.c')
-rw-r--r-- | tools/perf/builtin-test.c | 174 |
1 files changed, 169 insertions, 5 deletions
diff --git a/tools/perf/builtin-test.c b/tools/perf/builtin-test.c index 3e087ce8daa6..1c5b9801ac61 100644 --- a/tools/perf/builtin-test.c +++ b/tools/perf/builtin-test.c | |||
@@ -13,6 +13,7 @@ | |||
13 | #include "util/parse-events.h" | 13 | #include "util/parse-events.h" |
14 | #include "util/symbol.h" | 14 | #include "util/symbol.h" |
15 | #include "util/thread_map.h" | 15 | #include "util/thread_map.h" |
16 | #include "util/pmu.h" | ||
16 | #include "../../include/linux/hw_breakpoint.h" | 17 | #include "../../include/linux/hw_breakpoint.h" |
17 | 18 | ||
18 | #include <sys/mman.h> | 19 | #include <sys/mman.h> |
@@ -650,7 +651,7 @@ static int test__checkevent_raw(struct perf_evlist *evlist) | |||
650 | 651 | ||
651 | TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries); | 652 | TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries); |
652 | TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type); | 653 | TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type); |
653 | TEST_ASSERT_VAL("wrong config", 1 == evsel->attr.config); | 654 | TEST_ASSERT_VAL("wrong config", 0x1a == evsel->attr.config); |
654 | return 0; | 655 | return 0; |
655 | } | 656 | } |
656 | 657 | ||
@@ -677,6 +678,24 @@ static int test__checkevent_symbolic_name(struct perf_evlist *evlist) | |||
677 | return 0; | 678 | return 0; |
678 | } | 679 | } |
679 | 680 | ||
681 | static int test__checkevent_symbolic_name_config(struct perf_evlist *evlist) | ||
682 | { | ||
683 | struct perf_evsel *evsel = list_entry(evlist->entries.next, | ||
684 | struct perf_evsel, node); | ||
685 | |||
686 | TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries); | ||
687 | TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type); | ||
688 | TEST_ASSERT_VAL("wrong config", | ||
689 | PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config); | ||
690 | TEST_ASSERT_VAL("wrong period", | ||
691 | 100000 == evsel->attr.sample_period); | ||
692 | TEST_ASSERT_VAL("wrong config1", | ||
693 | 0 == evsel->attr.config1); | ||
694 | TEST_ASSERT_VAL("wrong config2", | ||
695 | 1 == evsel->attr.config2); | ||
696 | return 0; | ||
697 | } | ||
698 | |||
680 | static int test__checkevent_symbolic_alias(struct perf_evlist *evlist) | 699 | static int test__checkevent_symbolic_alias(struct perf_evlist *evlist) |
681 | { | 700 | { |
682 | struct perf_evsel *evsel = list_entry(evlist->entries.next, | 701 | struct perf_evsel *evsel = list_entry(evlist->entries.next, |
@@ -858,6 +877,115 @@ static int test__checkevent_genhw_modifier(struct perf_evlist *evlist) | |||
858 | return test__checkevent_genhw(evlist); | 877 | return test__checkevent_genhw(evlist); |
859 | } | 878 | } |
860 | 879 | ||
880 | static int test__checkevent_breakpoint_modifier(struct perf_evlist *evlist) | ||
881 | { | ||
882 | struct perf_evsel *evsel = list_entry(evlist->entries.next, | ||
883 | struct perf_evsel, node); | ||
884 | |||
885 | TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user); | ||
886 | TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel); | ||
887 | TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv); | ||
888 | TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip); | ||
889 | |||
890 | return test__checkevent_breakpoint(evlist); | ||
891 | } | ||
892 | |||
893 | static int test__checkevent_breakpoint_x_modifier(struct perf_evlist *evlist) | ||
894 | { | ||
895 | struct perf_evsel *evsel = list_entry(evlist->entries.next, | ||
896 | struct perf_evsel, node); | ||
897 | |||
898 | TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user); | ||
899 | TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel); | ||
900 | TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv); | ||
901 | TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip); | ||
902 | |||
903 | return test__checkevent_breakpoint_x(evlist); | ||
904 | } | ||
905 | |||
906 | static int test__checkevent_breakpoint_r_modifier(struct perf_evlist *evlist) | ||
907 | { | ||
908 | struct perf_evsel *evsel = list_entry(evlist->entries.next, | ||
909 | struct perf_evsel, node); | ||
910 | |||
911 | TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user); | ||
912 | TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel); | ||
913 | TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv); | ||
914 | TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip); | ||
915 | |||
916 | return test__checkevent_breakpoint_r(evlist); | ||
917 | } | ||
918 | |||
919 | static int test__checkevent_breakpoint_w_modifier(struct perf_evlist *evlist) | ||
920 | { | ||
921 | struct perf_evsel *evsel = list_entry(evlist->entries.next, | ||
922 | struct perf_evsel, node); | ||
923 | |||
924 | TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user); | ||
925 | TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel); | ||
926 | TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv); | ||
927 | TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip); | ||
928 | |||
929 | return test__checkevent_breakpoint_w(evlist); | ||
930 | } | ||
931 | |||
932 | static int test__checkevent_pmu(struct perf_evlist *evlist) | ||
933 | { | ||
934 | |||
935 | struct perf_evsel *evsel = list_entry(evlist->entries.next, | ||
936 | struct perf_evsel, node); | ||
937 | |||
938 | TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries); | ||
939 | TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type); | ||
940 | TEST_ASSERT_VAL("wrong config", 10 == evsel->attr.config); | ||
941 | TEST_ASSERT_VAL("wrong config1", 1 == evsel->attr.config1); | ||
942 | TEST_ASSERT_VAL("wrong config2", 3 == evsel->attr.config2); | ||
943 | TEST_ASSERT_VAL("wrong period", 1000 == evsel->attr.sample_period); | ||
944 | |||
945 | return 0; | ||
946 | } | ||
947 | |||
948 | static int test__checkevent_list(struct perf_evlist *evlist) | ||
949 | { | ||
950 | struct perf_evsel *evsel; | ||
951 | |||
952 | TEST_ASSERT_VAL("wrong number of entries", 3 == evlist->nr_entries); | ||
953 | |||
954 | /* r1 */ | ||
955 | evsel = list_entry(evlist->entries.next, struct perf_evsel, node); | ||
956 | TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type); | ||
957 | TEST_ASSERT_VAL("wrong config", 1 == evsel->attr.config); | ||
958 | TEST_ASSERT_VAL("wrong config1", 0 == evsel->attr.config1); | ||
959 | TEST_ASSERT_VAL("wrong config2", 0 == evsel->attr.config2); | ||
960 | TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user); | ||
961 | TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel); | ||
962 | TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv); | ||
963 | TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip); | ||
964 | |||
965 | /* syscalls:sys_enter_open:k */ | ||
966 | evsel = list_entry(evsel->node.next, struct perf_evsel, node); | ||
967 | TEST_ASSERT_VAL("wrong type", PERF_TYPE_TRACEPOINT == evsel->attr.type); | ||
968 | TEST_ASSERT_VAL("wrong sample_type", | ||
969 | (PERF_SAMPLE_RAW | PERF_SAMPLE_TIME | PERF_SAMPLE_CPU) == | ||
970 | evsel->attr.sample_type); | ||
971 | TEST_ASSERT_VAL("wrong sample_period", 1 == evsel->attr.sample_period); | ||
972 | TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user); | ||
973 | TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel); | ||
974 | TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv); | ||
975 | TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip); | ||
976 | |||
977 | /* 1:1:hp */ | ||
978 | evsel = list_entry(evsel->node.next, struct perf_evsel, node); | ||
979 | TEST_ASSERT_VAL("wrong type", 1 == evsel->attr.type); | ||
980 | TEST_ASSERT_VAL("wrong config", 1 == evsel->attr.config); | ||
981 | TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user); | ||
982 | TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel); | ||
983 | TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv); | ||
984 | TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip); | ||
985 | |||
986 | return 0; | ||
987 | } | ||
988 | |||
861 | static struct test__event_st { | 989 | static struct test__event_st { |
862 | const char *name; | 990 | const char *name; |
863 | __u32 type; | 991 | __u32 type; |
@@ -872,7 +1000,7 @@ static struct test__event_st { | |||
872 | .check = test__checkevent_tracepoint_multi, | 1000 | .check = test__checkevent_tracepoint_multi, |
873 | }, | 1001 | }, |
874 | { | 1002 | { |
875 | .name = "r1", | 1003 | .name = "r1a", |
876 | .check = test__checkevent_raw, | 1004 | .check = test__checkevent_raw, |
877 | }, | 1005 | }, |
878 | { | 1006 | { |
@@ -884,6 +1012,10 @@ static struct test__event_st { | |||
884 | .check = test__checkevent_symbolic_name, | 1012 | .check = test__checkevent_symbolic_name, |
885 | }, | 1013 | }, |
886 | { | 1014 | { |
1015 | .name = "cycles/period=100000,config2/", | ||
1016 | .check = test__checkevent_symbolic_name_config, | ||
1017 | }, | ||
1018 | { | ||
887 | .name = "faults", | 1019 | .name = "faults", |
888 | .check = test__checkevent_symbolic_alias, | 1020 | .check = test__checkevent_symbolic_alias, |
889 | }, | 1021 | }, |
@@ -916,7 +1048,7 @@ static struct test__event_st { | |||
916 | .check = test__checkevent_tracepoint_multi_modifier, | 1048 | .check = test__checkevent_tracepoint_multi_modifier, |
917 | }, | 1049 | }, |
918 | { | 1050 | { |
919 | .name = "r1:kp", | 1051 | .name = "r1a:kp", |
920 | .check = test__checkevent_raw_modifier, | 1052 | .check = test__checkevent_raw_modifier, |
921 | }, | 1053 | }, |
922 | { | 1054 | { |
@@ -935,6 +1067,30 @@ static struct test__event_st { | |||
935 | .name = "L1-dcache-load-miss:kp", | 1067 | .name = "L1-dcache-load-miss:kp", |
936 | .check = test__checkevent_genhw_modifier, | 1068 | .check = test__checkevent_genhw_modifier, |
937 | }, | 1069 | }, |
1070 | { | ||
1071 | .name = "mem:0:u", | ||
1072 | .check = test__checkevent_breakpoint_modifier, | ||
1073 | }, | ||
1074 | { | ||
1075 | .name = "mem:0:x:k", | ||
1076 | .check = test__checkevent_breakpoint_x_modifier, | ||
1077 | }, | ||
1078 | { | ||
1079 | .name = "mem:0:r:hp", | ||
1080 | .check = test__checkevent_breakpoint_r_modifier, | ||
1081 | }, | ||
1082 | { | ||
1083 | .name = "mem:0:w:up", | ||
1084 | .check = test__checkevent_breakpoint_w_modifier, | ||
1085 | }, | ||
1086 | { | ||
1087 | .name = "cpu/config=10,config1,config2=3,period=1000/u", | ||
1088 | .check = test__checkevent_pmu, | ||
1089 | }, | ||
1090 | { | ||
1091 | .name = "r1,syscalls:sys_enter_open:k,1:1:hp", | ||
1092 | .check = test__checkevent_list, | ||
1093 | }, | ||
938 | }; | 1094 | }; |
939 | 1095 | ||
940 | #define TEST__EVENTS_CNT (sizeof(test__events) / sizeof(struct test__event_st)) | 1096 | #define TEST__EVENTS_CNT (sizeof(test__events) / sizeof(struct test__event_st)) |
@@ -960,10 +1116,9 @@ static int test__parse_events(void) | |||
960 | } | 1116 | } |
961 | 1117 | ||
962 | ret = e->check(evlist); | 1118 | ret = e->check(evlist); |
1119 | perf_evlist__delete(evlist); | ||
963 | if (ret) | 1120 | if (ret) |
964 | break; | 1121 | break; |
965 | |||
966 | perf_evlist__delete(evlist); | ||
967 | } | 1122 | } |
968 | 1123 | ||
969 | return ret; | 1124 | return ret; |
@@ -1462,6 +1617,11 @@ static int test__rdpmc(void) | |||
1462 | 1617 | ||
1463 | #endif | 1618 | #endif |
1464 | 1619 | ||
1620 | static int test__perf_pmu(void) | ||
1621 | { | ||
1622 | return perf_pmu__test(); | ||
1623 | } | ||
1624 | |||
1465 | static struct test { | 1625 | static struct test { |
1466 | const char *desc; | 1626 | const char *desc; |
1467 | int (*func)(void); | 1627 | int (*func)(void); |
@@ -1497,6 +1657,10 @@ static struct test { | |||
1497 | .func = test__PERF_RECORD, | 1657 | .func = test__PERF_RECORD, |
1498 | }, | 1658 | }, |
1499 | { | 1659 | { |
1660 | .desc = "Test perf pmu format parsing", | ||
1661 | .func = test__perf_pmu, | ||
1662 | }, | ||
1663 | { | ||
1500 | .func = NULL, | 1664 | .func = NULL, |
1501 | }, | 1665 | }, |
1502 | }; | 1666 | }; |