)
)
+#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 */
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;
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
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); */