CPU topology statedump on x86
authorJulien Desfossez <jdesfossez@digitalocean.com>
Fri, 26 Oct 2018 19:55:18 +0000 (15:55 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Sat, 27 Oct 2018 19:32:55 +0000 (20:32 +0100)
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 <jdesfossez@digitalocean.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
instrumentation/events/lttng-module/lttng-statedump.h
lttng-statedump-impl.c

index 3bfc28e70bdb7913fd14b8fc3f781b244e486865..7ca94a60cf0e930b9819c305dd7ad984cb24390a 100644 (file)
@@ -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 */
index ecec4f0bc42bb12f84ce5a9ac1fa33c62edbf3df..8c737f9b9f13d45c3b2799a6a1ab9228b0aa9d7c 100644 (file)
@@ -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); */
This page took 0.026849 seconds and 4 git commands to generate.