From 502e41323dc7abc1daf53c1adcf2debcd5c02a77 Mon Sep 17 00:00:00 2001 From: Julien Desfossez Date: Fri, 26 Oct 2018 15:55:18 -0400 Subject: [PATCH] CPU topology statedump on x86 New statedump tracepoint to dump the active CPU/NUMA topology. This allows to know which CPUs are SMT sibling or on the same socket. For now only x86 is supported because all architectures has different fields. The field "architecture" is statically defined and should be present in all implementations so parsing tools know what content to expect. Example output: lttng_statedump_cpu_topology: { cpu_id = 3 }, { architecture = "x86", cpu_id = 0, vendor = "GenuineIntel", family = 6, model = 142, model_name = "Intel(R) Core(TM) i7-7600U CPU @ 2.80GHz", physical_id = 0, core_id = 0, cores = 2 } Signed-off-by: Julien Desfossez Signed-off-by: Mathieu Desnoyers --- .../events/lttng-module/lttng-statedump.h | 18 ++++++++++++ lttng-statedump-impl.c | 28 +++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/instrumentation/events/lttng-module/lttng-statedump.h b/instrumentation/events/lttng-module/lttng-statedump.h index 3bfc28e7..7ca94a60 100644 --- a/instrumentation/events/lttng-module/lttng-statedump.h +++ b/instrumentation/events/lttng-module/lttng-statedump.h @@ -139,6 +139,24 @@ LTTNG_TRACEPOINT_EVENT(lttng_statedump_interrupt, ) ) +#if defined(CONFIG_X86_32) || defined(CONFIG_X86_64) +LTTNG_TRACEPOINT_EVENT(lttng_statedump_cpu_topology, + TP_PROTO(struct lttng_session *session, struct cpuinfo_x86 *c), + TP_ARGS(session, c), + TP_FIELDS( + ctf_string(architecture, "x86") + ctf_integer(uint16_t, cpu_id, c->cpu_index) + ctf_string(vendor, c->x86_vendor_id[0] ? c->x86_vendor_id : "unknown") + ctf_integer(uint8_t, family, c->x86) + ctf_integer(uint8_t, model, c->x86_model) + ctf_string(model_name, c->x86_model_id[0] ? c->x86_model_id : "unknown") + ctf_integer(uint16_t, physical_id, c->phys_proc_id) + ctf_integer(uint16_t, core_id, c->cpu_core_id) + ctf_integer(uint16_t, cores, c->booted_cores) + ) +) +#endif /* CONFIG_X86_32 || CONFIG_X86_64 */ + #endif /* LTTNG_TRACE_LTTNG_STATEDUMP_H */ /* This part must be outside protection */ diff --git a/lttng-statedump-impl.c b/lttng-statedump-impl.c index ecec4f0b..8c737f9b 100644 --- a/lttng-statedump-impl.c +++ b/lttng-statedump-impl.c @@ -63,6 +63,9 @@ DEFINE_TRACE(lttng_statedump_file_descriptor); DEFINE_TRACE(lttng_statedump_start); DEFINE_TRACE(lttng_statedump_process_state); DEFINE_TRACE(lttng_statedump_network_interface); +#if defined(CONFIG_X86_32) || defined(CONFIG_X86_64) +DEFINE_TRACE(lttng_statedump_cpu_topology); +#endif struct lttng_fd_ctx { char *page; @@ -279,6 +282,28 @@ int lttng_enumerate_file_descriptors(struct lttng_session *session) return 0; } +#if defined(CONFIG_X86_32) || defined(CONFIG_X86_64) +static +int lttng_enumerate_cpu_topology(struct lttng_session *session) +{ + int cpu; + const cpumask_t *cpumask = cpu_possible_mask; + + for (cpu = cpumask_first(cpumask); cpu < nr_cpu_ids; + cpu = cpumask_next(cpu, cpumask)) { + trace_lttng_statedump_cpu_topology(session, &cpu_data(cpu)); + } + + return 0; +} +#else +static +int lttng_enumerate_cpu_topology(struct lttng_session *session) +{ + return 0; +} +#endif + #if 0 /* * FIXME: we cannot take a mmap_sem while in a RCU read-side critical section @@ -489,6 +514,9 @@ int do_lttng_statedump(struct lttng_session *session) default: return ret; } + ret = lttng_enumerate_cpu_topology(session); + if (ret) + return ret; /* TODO lttng_dump_idt_table(session); */ /* TODO lttng_dump_softirq_vec(session); */ -- 2.34.1