Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.5.6.
  1#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
 68	for (i = 0; i < session->header.env.nr_cpus_online; i++) {
 69		pr_debug("CPU %d, core %d, socket %d\n", i,
 70			 session->header.env.cpu[i].core_id,
 71			 session->header.env.cpu[i].socket_id);
 72	}
 73
 74	for (i = 0; i < map->nr; i++) {
 75		TEST_ASSERT_VAL("Core ID doesn't match",
 76			(session->header.env.cpu[map->map[i]].core_id == (cpu_map__get_core(map, i, NULL) & 0xffff)));
 77
 78		TEST_ASSERT_VAL("Socket ID doesn't match",
 79			(session->header.env.cpu[map->map[i]].socket_id == cpu_map__get_socket(map, i, NULL)));
 80	}
 81
 82	perf_session__delete(session);
 83
 84	return 0;
 85}
 86
 87int test_session_topology(int subtest __maybe_unused)
 88{
 89	char path[PATH_MAX];
 90	struct cpu_map *map;
 91	int ret = -1;
 92
 93	TEST_ASSERT_VAL("can't get templ file", !get_temp(path));
 94
 95	pr_debug("templ file: %s\n", path);
 96
 97	if (session_write_header(path))
 98		goto free_path;
 99
100	map = cpu_map__new(NULL);
101	if (map == NULL) {
102		pr_debug("failed to get system cpumap\n");
103		goto free_path;
104	}
105
106	if (check_cpu_topology(path, map))
107		goto free_map;
108	ret = 0;
109
110free_map:
111	cpu_map__put(map);
112free_path:
113	unlink(path);
114	return ret;
115}