Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+23 −14
Original line number Diff line number Diff line
@@ -264,6 +264,16 @@ static inline void mux_init(struct oprofile_operations *ops)
		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

inline int op_x86_phys_to_virt(int phys) { return phys; }
@@ -272,6 +282,7 @@ static inline int nmi_setup_mux(void) { return 1; }
static inline void
nmi_cpu_setup_mux(int cpu, struct op_msrs const * const msrs) { }
static inline void mux_init(struct oprofile_operations *ops) { }
static void mux_clone(int cpu) { }

#endif

@@ -350,7 +361,9 @@ static int nmi_setup(void)
	/* Assume saved/restored counters are the same on all CPUs */
	model->fill_in_addresses(&per_cpu(cpu_msrs, 0));
	for_each_possible_cpu(cpu) {
		if (cpu != 0) {
		if (!cpu)
			continue;

		memcpy(per_cpu(cpu_msrs, cpu).counters,
		       per_cpu(cpu_msrs, 0).counters,
		       sizeof(struct op_msr) * model->num_counters);
@@ -358,12 +371,8 @@ static int nmi_setup(void)
		memcpy(per_cpu(cpu_msrs, cpu).controls,
		       per_cpu(cpu_msrs, 0).controls,
		       sizeof(struct op_msr) * model->num_controls);
#ifdef CONFIG_OPROFILE_EVENT_MULTIPLEX
			memcpy(per_cpu(cpu_msrs, cpu).multiplex,
				per_cpu(cpu_msrs, 0).multiplex,
				sizeof(struct op_msr) * model->num_virt_counters);
#endif
		}

		mux_clone(cpu);
	}
	on_each_cpu(nmi_cpu_setup, NULL, 1);
	nmi_enabled = 1;