blob: 803f893550d64c03c6354acf88045821cc7fe171 [file] [log] [blame]
Kan Liangc84974e2015-09-04 04:58:31 -04001#include <string.h>
2#include <stdlib.h>
3#include <stdio.h>
4#include "tests.h"
5#include "util.h"
6#include "session.h"
7#include "evlist.h"
8#include "debug.h"
9
10#define TEMPL "/tmp/perf-test-XXXXXX"
11#define DATA_SIZE 10
12
13static int get_temp(char *path)
14{
15 int fd;
16
17 strcpy(path, TEMPL);
18
19 fd = mkstemp(path);
20 if (fd < 0) {
21 perror("mkstemp failed");
22 return -1;
23 }
24
25 close(fd);
26 return 0;
27}
28
29static int session_write_header(char *path)
30{
31 struct perf_session *session;
32 struct perf_data_file file = {
33 .path = path,
34 .mode = PERF_DATA_MODE_WRITE,
35 };
36
37 session = perf_session__new(&file, false, NULL);
38 TEST_ASSERT_VAL("can't get session", session);
39
40 session->evlist = perf_evlist__new_default();
41 TEST_ASSERT_VAL("can't get evlist", session->evlist);
42
43 perf_header__set_feat(&session->header, HEADER_CPU_TOPOLOGY);
44 perf_header__set_feat(&session->header, HEADER_NRCPUS);
45
46 session->header.data_size += DATA_SIZE;
47
48 TEST_ASSERT_VAL("failed to write header",
49 !perf_session__write_header(session, session->evlist, file.fd, true));
50
51 perf_session__delete(session);
52
53 return 0;
54}
55
56static int check_cpu_topology(char *path, struct cpu_map *map)
57{
58 struct perf_session *session;
59 struct perf_data_file file = {
60 .path = path,
61 .mode = PERF_DATA_MODE_READ,
62 };
63 int i;
64
65 session = perf_session__new(&file, false, NULL);
66 TEST_ASSERT_VAL("can't get session", session);
67
Jan Stancekda8a58b2017-02-17 12:10:26 +010068 for (i = 0; i < session->header.env.nr_cpus_avail; i++) {
69 if (!cpu_map__has(map, i))
70 continue;
Kan Liangc84974e2015-09-04 04:58:31 -040071 pr_debug("CPU %d, core %d, socket %d\n", i,
72 session->header.env.cpu[i].core_id,
73 session->header.env.cpu[i].socket_id);
74 }
75
76 for (i = 0; i < map->nr; i++) {
77 TEST_ASSERT_VAL("Core ID doesn't match",
Jiri Olsa1fe7a302015-10-16 12:41:15 +020078 (session->header.env.cpu[map->map[i]].core_id == (cpu_map__get_core(map, i, NULL) & 0xffff)));
Kan Liangc84974e2015-09-04 04:58:31 -040079
80 TEST_ASSERT_VAL("Socket ID doesn't match",
Jiri Olsa1fe7a302015-10-16 12:41:15 +020081 (session->header.env.cpu[map->map[i]].socket_id == cpu_map__get_socket(map, i, NULL)));
Kan Liangc84974e2015-09-04 04:58:31 -040082 }
83
84 perf_session__delete(session);
85
86 return 0;
87}
88
Arnaldo Carvalho de Melo721a1f52015-11-19 12:01:48 -030089int test_session_topology(int subtest __maybe_unused)
Kan Liangc84974e2015-09-04 04:58:31 -040090{
91 char path[PATH_MAX];
92 struct cpu_map *map;
93 int ret = -1;
94
95 TEST_ASSERT_VAL("can't get templ file", !get_temp(path));
96
97 pr_debug("templ file: %s\n", path);
98
99 if (session_write_header(path))
100 goto free_path;
101
102 map = cpu_map__new(NULL);
103 if (map == NULL) {
104 pr_debug("failed to get system cpumap\n");
105 goto free_path;
106 }
107
108 if (check_cpu_topology(path, map))
109 goto free_map;
110 ret = 0;
111
112free_map:
113 cpu_map__put(map);
114free_path:
115 unlink(path);
116 return ret;
117}