/* On platforms with large numbers of CPUs process_cpu_topology() *mightissueanerrorwhilereadingtheperf.datafilesection *HEADER_CPU_TOPOLOGYandthecpu_topology_mappointedtobymember *cpuisaNULLpointer. *Example:Ons390 *CPU0isoncore_id0andphysical_package_id6 *CPU1isoncore_id1andphysical_package_id3 * *Core_idandphysical_package_idareplatformandarchitecture *dependentandmighthavehighernumbersthantheCPUid. *Thisactuallydependsontheconfiguration. * *Inthiscaseprocess_cpu_topology()printserrormessage: *"socket_idnumberistoobig.Youmayneedtoupgradethe *perftool." * *Thisisthereasonwhythistestmightbeskipped.aarch64and *s390alwayswritethispartoftheheader,evenwhentheabove *conditionistrue(seedo_core_id_testinheader.c).Soalways *runthistestonthoseplatforms.
*/ if (!env->cpu && strncmp(env->arch, "s390", 4) && strncmp(env->arch, "aarch64", 7)) return TEST_SKIP;
/* *InpowerpcpSeriesplatform,notallthetopologyinformation *areexposedviasysfs.Duetorestriction,detaillike *physical_package_idwillbesetto-1.Henceskipthis *testifphysical_package_idreturns-1forcpufromperf_cpu_map.
*/ if (!strncmp(env->arch, "ppc64le", 7)) { if (cpu__get_socket_id(perf_cpu_map__cpu(map, 0)) == -1) return TEST_SKIP;
}
TEST_ASSERT_VAL("Session header CPU map not set", env->cpu);
for (i = 0; i < env->nr_cpus_avail; i++) {
cpu.cpu = i; if (!perf_cpu_map__has(map, cpu)) continue;
pr_debug("CPU %d, core %d, socket %d\n", i,
env->cpu[i].core_id,
env->cpu[i].socket_id);
}
// Test that CPU ID contains socket, die, core and CPU
perf_cpu_map__for_each_cpu(cpu, i, map) {
id = aggr_cpu_id__cpu(cpu, NULL);
TEST_ASSERT_VAL("Cpu map - CPU ID doesn't match",
cpu.cpu == id.cpu.cpu);
TEST_ASSERT_VAL("Cpu map - Core ID doesn't match",
env->cpu[cpu.cpu].core_id == id.core);
TEST_ASSERT_VAL("Cpu map - Socket ID doesn't match",
env->cpu[cpu.cpu].socket_id == id.socket);
TEST_ASSERT_VAL("Cpu map - Die ID doesn't match",
env->cpu[cpu.cpu].die_id == id.die);
TEST_ASSERT_VAL("Cpu map - Node ID is set", id.node == -1);
TEST_ASSERT_VAL("Cpu map - Thread IDX is set", id.thread_idx == -1);
}
// Test that core ID contains socket, die and core
perf_cpu_map__for_each_cpu(cpu, i, map) {
id = aggr_cpu_id__core(cpu, NULL);
TEST_ASSERT_VAL("Core map - Core ID doesn't match",
env->cpu[cpu.cpu].core_id == id.core);
TEST_ASSERT_VAL("Core map - Socket ID doesn't match",
env->cpu[cpu.cpu].socket_id == id.socket);
TEST_ASSERT_VAL("Core map - Die ID doesn't match",
env->cpu[cpu.cpu].die_id == id.die);
TEST_ASSERT_VAL("Core map - Node ID is set", id.node == -1);
TEST_ASSERT_VAL("Core map - Thread IDX is set", id.thread_idx == -1);
}
// Test that die ID contains socket and die
perf_cpu_map__for_each_cpu(cpu, i, map) {
id = aggr_cpu_id__die(cpu, NULL);
TEST_ASSERT_VAL("Die map - Socket ID doesn't match",
env->cpu[cpu.cpu].socket_id == id.socket);
TEST_ASSERT_VAL("Die map - Die ID doesn't match",
env->cpu[cpu.cpu].die_id == id.die);
TEST_ASSERT_VAL("Die map - Node ID is set", id.node == -1);
TEST_ASSERT_VAL("Die map - Core is set", id.core == -1);
TEST_ASSERT_VAL("Die map - CPU is set", id.cpu.cpu == -1);
TEST_ASSERT_VAL("Die map - Thread IDX is set", id.thread_idx == -1);
}
// Test that socket ID contains only socket
perf_cpu_map__for_each_cpu(cpu, i, map) {
id = aggr_cpu_id__socket(cpu, NULL);
TEST_ASSERT_VAL("Socket map - Socket ID doesn't match",
env->cpu[cpu.cpu].socket_id == id.socket);
TEST_ASSERT_VAL("Socket map - Node ID is set", id.node == -1);
TEST_ASSERT_VAL("Socket map - Die ID is set", id.die == -1);
TEST_ASSERT_VAL("Socket map - Core is set", id.core == -1);
TEST_ASSERT_VAL("Socket map - CPU is set", id.cpu.cpu == -1);
TEST_ASSERT_VAL("Socket map - Thread IDX is set", id.thread_idx == -1);
}
// Test that node ID contains only node
perf_cpu_map__for_each_cpu(cpu, i, map) {
id = aggr_cpu_id__node(cpu, NULL);
TEST_ASSERT_VAL("Node map - Node ID doesn't match",
cpu__get_node(cpu) == id.node);
TEST_ASSERT_VAL("Node map - Socket is set", id.socket == -1);
TEST_ASSERT_VAL("Node map - Die ID is set", id.die == -1);
TEST_ASSERT_VAL("Node map - Core is set", id.core == -1);
TEST_ASSERT_VAL("Node map - CPU is set", id.cpu.cpu == -1);
TEST_ASSERT_VAL("Node map - Thread IDX is set", id.thread_idx == -1);
}
perf_session__delete(session);
return0;
}
staticint test__session_topology(struct test_suite *test __maybe_unused, int subtest __maybe_unused)
{ char path[PATH_MAX]; struct perf_cpu_map *map; int ret = TEST_FAIL;
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 = perf_cpu_map__new_online_cpus(); if (map == NULL) {
pr_debug("failed to get system cpumap\n"); goto free_path;
}
ret = check_cpu_topology(path, map);
perf_cpu_map__put(map);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.