Commit 4d015f79 authored by Robert Richter's avatar Robert Richter

x86/oprofile: Implement mux_clone()

To setup a counter for all cpus, its structure is cloned from cpu
0. This patch implements mux_clone() to do this part for multiplexing
data.
Signed-off-by: default avatarRobert Richter <robert.richter@amd.com>
parent 52805144
...@@ -264,6 +264,16 @@ static inline void mux_init(struct oprofile_operations *ops) ...@@ -264,6 +264,16 @@ static inline void mux_init(struct oprofile_operations *ops)
ops->switch_events = nmi_switch_event; ops->switch_events = nmi_switch_event;
} }
static void mux_clone(int cpu)
{
if (!has_mux())
return;
memcpy(per_cpu(cpu_msrs, cpu).multiplex,
per_cpu(cpu_msrs, 0).multiplex,
sizeof(struct op_msr) * model->num_virt_counters);
}
#else #else
inline int op_x86_phys_to_virt(int phys) { return phys; } inline int op_x86_phys_to_virt(int phys) { return phys; }
...@@ -272,6 +282,7 @@ static inline int nmi_setup_mux(void) { return 1; } ...@@ -272,6 +282,7 @@ static inline int nmi_setup_mux(void) { return 1; }
static inline void static inline void
nmi_cpu_setup_mux(int cpu, struct op_msrs const * const msrs) { } nmi_cpu_setup_mux(int cpu, struct op_msrs const * const msrs) { }
static inline void mux_init(struct oprofile_operations *ops) { } static inline void mux_init(struct oprofile_operations *ops) { }
static void mux_clone(int cpu) { }
#endif #endif
...@@ -350,20 +361,18 @@ static int nmi_setup(void) ...@@ -350,20 +361,18 @@ static int nmi_setup(void)
/* Assume saved/restored counters are the same on all CPUs */ /* Assume saved/restored counters are the same on all CPUs */
model->fill_in_addresses(&per_cpu(cpu_msrs, 0)); model->fill_in_addresses(&per_cpu(cpu_msrs, 0));
for_each_possible_cpu(cpu) { for_each_possible_cpu(cpu) {
if (cpu != 0) { if (!cpu)
memcpy(per_cpu(cpu_msrs, cpu).counters, continue;
per_cpu(cpu_msrs, 0).counters,
sizeof(struct op_msr) * model->num_counters); memcpy(per_cpu(cpu_msrs, cpu).counters,
per_cpu(cpu_msrs, 0).counters,
memcpy(per_cpu(cpu_msrs, cpu).controls, sizeof(struct op_msr) * model->num_counters);
per_cpu(cpu_msrs, 0).controls,
sizeof(struct op_msr) * model->num_controls); memcpy(per_cpu(cpu_msrs, cpu).controls,
#ifdef CONFIG_OPROFILE_EVENT_MULTIPLEX per_cpu(cpu_msrs, 0).controls,
memcpy(per_cpu(cpu_msrs, cpu).multiplex, sizeof(struct op_msr) * model->num_controls);
per_cpu(cpu_msrs, 0).multiplex,
sizeof(struct op_msr) * model->num_virt_counters); mux_clone(cpu);
#endif
}
} }
on_each_cpu(nmi_cpu_setup, NULL, 1); on_each_cpu(nmi_cpu_setup, NULL, 1);
nmi_enabled = 1; nmi_enabled = 1;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment