mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	perf test: Add entry to test cpu topology
This patch test cpu core_id and socket_id which are stored in perf_env. Commiter note: # perf test topo 40: Test topology in session: Ok # perf test -v topo 40: Test topology in session: --- start --- test child forked, pid 31767 templ file: /tmp/perf-test-VTZ1PL CPU 0, core 0, socket 0 CPU 1, core 1, socket 0 CPU 2, core 0, socket 0 CPU 3, core 1, socket 0 test child finished with 0 ---- end ---- Test topology in session: Ok # Based-on-a-patch-by: Jiri Olsa <jolsa@kernel.org> Signed-off-by: Kan Liang <kan.liang@intel.com> Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Andi Kleen <ak@linux.intel.com> Cc: Jiri Olsa <jolsa@kernel.org> Link: http://lkml.kernel.org/r/1441357111-64522-1-git-send-email-kan.liang@intel.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
		
							parent
							
								
									fbf99625b8
								
							
						
					
					
						commit
						c84974ed9f
					
				
					 4 changed files with 121 additions and 0 deletions
				
			
		| 
						 | 
				
			
			@ -33,6 +33,7 @@ perf-y += parse-no-sample-id-all.o
 | 
			
		|||
perf-y += kmod-path.o
 | 
			
		||||
perf-y += thread-map.o
 | 
			
		||||
perf-y += llvm.o
 | 
			
		||||
perf-y += topology.o
 | 
			
		||||
 | 
			
		||||
perf-$(CONFIG_X86) += perf-time-to-tsc.o
 | 
			
		||||
ifdef CONFIG_AUXTRACE
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -186,6 +186,10 @@ static struct test {
 | 
			
		|||
	},
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
	{
 | 
			
		||||
		.desc = "Test topology in session",
 | 
			
		||||
		.func = test_session_topology,
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		.func = NULL,
 | 
			
		||||
	},
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -64,6 +64,7 @@ int test__kmod_path__parse(void);
 | 
			
		|||
int test__thread_map(void);
 | 
			
		||||
int test__llvm(void);
 | 
			
		||||
int test__insn_x86(void);
 | 
			
		||||
int test_session_topology(void);
 | 
			
		||||
 | 
			
		||||
#if defined(__x86_64__) || defined(__i386__) || defined(__arm__) || defined(__aarch64__)
 | 
			
		||||
#ifdef HAVE_DWARF_UNWIND_SUPPORT
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										115
									
								
								tools/perf/tests/topology.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										115
									
								
								tools/perf/tests/topology.c
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,115 @@
 | 
			
		|||
#include <string.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include "tests.h"
 | 
			
		||||
#include "util.h"
 | 
			
		||||
#include "session.h"
 | 
			
		||||
#include "evlist.h"
 | 
			
		||||
#include "debug.h"
 | 
			
		||||
 | 
			
		||||
#define TEMPL "/tmp/perf-test-XXXXXX"
 | 
			
		||||
#define DATA_SIZE	10
 | 
			
		||||
 | 
			
		||||
static int get_temp(char *path)
 | 
			
		||||
{
 | 
			
		||||
	int fd;
 | 
			
		||||
 | 
			
		||||
	strcpy(path, TEMPL);
 | 
			
		||||
 | 
			
		||||
	fd = mkstemp(path);
 | 
			
		||||
	if (fd < 0) {
 | 
			
		||||
		perror("mkstemp failed");
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	close(fd);
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int session_write_header(char *path)
 | 
			
		||||
{
 | 
			
		||||
	struct perf_session *session;
 | 
			
		||||
	struct perf_data_file file = {
 | 
			
		||||
		.path = path,
 | 
			
		||||
		.mode = PERF_DATA_MODE_WRITE,
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	session = perf_session__new(&file, false, NULL);
 | 
			
		||||
	TEST_ASSERT_VAL("can't get session", session);
 | 
			
		||||
 | 
			
		||||
	session->evlist = perf_evlist__new_default();
 | 
			
		||||
	TEST_ASSERT_VAL("can't get evlist", session->evlist);
 | 
			
		||||
 | 
			
		||||
	perf_header__set_feat(&session->header, HEADER_CPU_TOPOLOGY);
 | 
			
		||||
	perf_header__set_feat(&session->header, HEADER_NRCPUS);
 | 
			
		||||
 | 
			
		||||
	session->header.data_size += DATA_SIZE;
 | 
			
		||||
 | 
			
		||||
	TEST_ASSERT_VAL("failed to write header",
 | 
			
		||||
			!perf_session__write_header(session, session->evlist, file.fd, true));
 | 
			
		||||
 | 
			
		||||
	perf_session__delete(session);
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int check_cpu_topology(char *path, struct cpu_map *map)
 | 
			
		||||
{
 | 
			
		||||
	struct perf_session *session;
 | 
			
		||||
	struct perf_data_file file = {
 | 
			
		||||
		.path = path,
 | 
			
		||||
		.mode = PERF_DATA_MODE_READ,
 | 
			
		||||
	};
 | 
			
		||||
	int i;
 | 
			
		||||
 | 
			
		||||
	session = perf_session__new(&file, false, NULL);
 | 
			
		||||
	TEST_ASSERT_VAL("can't get session", session);
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i < session->header.env.nr_cpus_online; i++) {
 | 
			
		||||
		pr_debug("CPU %d, core %d, socket %d\n", i,
 | 
			
		||||
			 session->header.env.cpu[i].core_id,
 | 
			
		||||
			 session->header.env.cpu[i].socket_id);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i < map->nr; i++) {
 | 
			
		||||
		TEST_ASSERT_VAL("Core ID doesn't match",
 | 
			
		||||
			(session->header.env.cpu[map->map[i]].core_id == (cpu_map__get_core(map, i) & 0xffff)));
 | 
			
		||||
 | 
			
		||||
		TEST_ASSERT_VAL("Socket ID doesn't match",
 | 
			
		||||
			(session->header.env.cpu[map->map[i]].socket_id == cpu_map__get_socket(map, i)));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	perf_session__delete(session);
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int test_session_topology(void)
 | 
			
		||||
{
 | 
			
		||||
	char path[PATH_MAX];
 | 
			
		||||
	struct cpu_map *map;
 | 
			
		||||
	int ret = -1;
 | 
			
		||||
 | 
			
		||||
	TEST_ASSERT_VAL("can't get templ file", !get_temp(path));
 | 
			
		||||
 | 
			
		||||
	pr_debug("templ file: %s\n", path);
 | 
			
		||||
 | 
			
		||||
	if (session_write_header(path))
 | 
			
		||||
		goto free_path;
 | 
			
		||||
 | 
			
		||||
	map = cpu_map__new(NULL);
 | 
			
		||||
	if (map == NULL) {
 | 
			
		||||
		pr_debug("failed to get system cpumap\n");
 | 
			
		||||
		goto free_path;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (check_cpu_topology(path, map))
 | 
			
		||||
		goto free_map;
 | 
			
		||||
	ret = 0;
 | 
			
		||||
 | 
			
		||||
free_map:
 | 
			
		||||
	cpu_map__put(map);
 | 
			
		||||
free_path:
 | 
			
		||||
	unlink(path);
 | 
			
		||||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in a new issue