0001
0002 #include "parse-events.h"
0003 #include "pmu.h"
0004 #include "tests.h"
0005 #include <errno.h>
0006 #include <stdio.h>
0007 #include <linux/kernel.h>
0008 #include <linux/limits.h>
0009
0010
0011 static struct test_format {
0012 const char *name;
0013 const char *value;
0014 } test_formats[] = {
0015 { "krava01", "config:0-1,62-63\n", },
0016 { "krava02", "config:10-17\n", },
0017 { "krava03", "config:5\n", },
0018 { "krava11", "config1:0,2,4,6,8,20-28\n", },
0019 { "krava12", "config1:63\n", },
0020 { "krava13", "config1:45-47\n", },
0021 { "krava21", "config2:0-3,10-13,20-23,30-33,40-43,50-53,60-63\n", },
0022 { "krava22", "config2:8,18,48,58\n", },
0023 { "krava23", "config2:28-29,38\n", },
0024 };
0025
0026
0027 static struct parse_events_term test_terms[] = {
0028 {
0029 .config = (char *) "krava01",
0030 .val.num = 15,
0031 .type_val = PARSE_EVENTS__TERM_TYPE_NUM,
0032 .type_term = PARSE_EVENTS__TERM_TYPE_USER,
0033 },
0034 {
0035 .config = (char *) "krava02",
0036 .val.num = 170,
0037 .type_val = PARSE_EVENTS__TERM_TYPE_NUM,
0038 .type_term = PARSE_EVENTS__TERM_TYPE_USER,
0039 },
0040 {
0041 .config = (char *) "krava03",
0042 .val.num = 1,
0043 .type_val = PARSE_EVENTS__TERM_TYPE_NUM,
0044 .type_term = PARSE_EVENTS__TERM_TYPE_USER,
0045 },
0046 {
0047 .config = (char *) "krava11",
0048 .val.num = 27,
0049 .type_val = PARSE_EVENTS__TERM_TYPE_NUM,
0050 .type_term = PARSE_EVENTS__TERM_TYPE_USER,
0051 },
0052 {
0053 .config = (char *) "krava12",
0054 .val.num = 1,
0055 .type_val = PARSE_EVENTS__TERM_TYPE_NUM,
0056 .type_term = PARSE_EVENTS__TERM_TYPE_USER,
0057 },
0058 {
0059 .config = (char *) "krava13",
0060 .val.num = 2,
0061 .type_val = PARSE_EVENTS__TERM_TYPE_NUM,
0062 .type_term = PARSE_EVENTS__TERM_TYPE_USER,
0063 },
0064 {
0065 .config = (char *) "krava21",
0066 .val.num = 119,
0067 .type_val = PARSE_EVENTS__TERM_TYPE_NUM,
0068 .type_term = PARSE_EVENTS__TERM_TYPE_USER,
0069 },
0070 {
0071 .config = (char *) "krava22",
0072 .val.num = 11,
0073 .type_val = PARSE_EVENTS__TERM_TYPE_NUM,
0074 .type_term = PARSE_EVENTS__TERM_TYPE_USER,
0075 },
0076 {
0077 .config = (char *) "krava23",
0078 .val.num = 2,
0079 .type_val = PARSE_EVENTS__TERM_TYPE_NUM,
0080 .type_term = PARSE_EVENTS__TERM_TYPE_USER,
0081 },
0082 };
0083
0084
0085
0086
0087
0088 static char *test_format_dir_get(void)
0089 {
0090 static char dir[PATH_MAX];
0091 unsigned int i;
0092
0093 snprintf(dir, PATH_MAX, "/tmp/perf-pmu-test-format-XXXXXX");
0094 if (!mkdtemp(dir))
0095 return NULL;
0096
0097 for (i = 0; i < ARRAY_SIZE(test_formats); i++) {
0098 static char name[PATH_MAX];
0099 struct test_format *format = &test_formats[i];
0100 FILE *file;
0101
0102 scnprintf(name, PATH_MAX, "%s/%s", dir, format->name);
0103
0104 file = fopen(name, "w");
0105 if (!file)
0106 return NULL;
0107
0108 if (1 != fwrite(format->value, strlen(format->value), 1, file))
0109 break;
0110
0111 fclose(file);
0112 }
0113
0114 return dir;
0115 }
0116
0117
0118 static int test_format_dir_put(char *dir)
0119 {
0120 char buf[PATH_MAX];
0121 snprintf(buf, PATH_MAX, "rm -f %s/*\n", dir);
0122 if (system(buf))
0123 return -1;
0124
0125 snprintf(buf, PATH_MAX, "rmdir %s\n", dir);
0126 return system(buf);
0127 }
0128
0129 static struct list_head *test_terms_list(void)
0130 {
0131 static LIST_HEAD(terms);
0132 unsigned int i;
0133
0134 for (i = 0; i < ARRAY_SIZE(test_terms); i++)
0135 list_add_tail(&test_terms[i].list, &terms);
0136
0137 return &terms;
0138 }
0139
0140 static int test__pmu(struct test_suite *test __maybe_unused, int subtest __maybe_unused)
0141 {
0142 char *format = test_format_dir_get();
0143 LIST_HEAD(formats);
0144 struct list_head *terms = test_terms_list();
0145 int ret;
0146
0147 if (!format)
0148 return -EINVAL;
0149
0150 do {
0151 struct perf_event_attr attr;
0152
0153 memset(&attr, 0, sizeof(attr));
0154
0155 ret = perf_pmu__format_parse(format, &formats);
0156 if (ret)
0157 break;
0158
0159 ret = perf_pmu__config_terms("perf-pmu-test", &formats, &attr,
0160 terms, false, NULL);
0161 if (ret)
0162 break;
0163
0164 ret = -EINVAL;
0165
0166 if (attr.config != 0xc00000000002a823)
0167 break;
0168 if (attr.config1 != 0x8000400000000145)
0169 break;
0170 if (attr.config2 != 0x0400000020041d07)
0171 break;
0172
0173 ret = 0;
0174 } while (0);
0175
0176 perf_pmu__del_formats(&formats);
0177 test_format_dir_put(format);
0178 return ret;
0179 }
0180
0181 DEFINE_SUITE("Parse perf pmu format", pmu);