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

Commit de654649 authored by Robert Richter's avatar Robert Richter
Browse files

oprofile/x86: stop disabled counters in nmi handler



This patch adds checks to the nmi handler. Now samples are only
generated and counters reenabled, if the counters are running.
Otherwise the counters are stopped, if oprofile is using the nmi. In
other cases it will ignore the nmi notification.

Cc: Andi Kleen <andi@firstfloor.org>
Signed-off-by: default avatarRobert Richter <robert.richter@amd.com>
parent 6ae56b55
Loading
Loading
Loading
Loading
+10 −2
Original line number Diff line number Diff line
@@ -62,12 +62,16 @@ static int profile_exceptions_notify(struct notifier_block *self,
{
	struct die_args *args = (struct die_args *)data;
	int ret = NOTIFY_DONE;
	int cpu = smp_processor_id();

	switch (val) {
	case DIE_NMI:
	case DIE_NMI_IPI:
		model->check_ctrs(args->regs, &per_cpu(cpu_msrs, cpu));
		if (ctr_running)
			model->check_ctrs(args->regs, &__get_cpu_var(cpu_msrs));
		else if (!nmi_enabled)
			break;
		else
			model->stop(&__get_cpu_var(cpu_msrs));
		ret = NOTIFY_STOP;
		break;
	default:
@@ -392,6 +396,9 @@ static int nmi_setup(void)
		mux_clone(cpu);
	}

	nmi_enabled = 0;
	ctr_running = 0;
	barrier();
	err = register_die_notifier(&profile_exceptions_nb);
	if (err)
		goto fail;
@@ -451,6 +458,7 @@ static void nmi_shutdown(void)
	nmi_enabled = 0;
	ctr_running = 0;
	put_online_cpus();
	barrier();
	unregister_die_notifier(&profile_exceptions_nb);
	msrs = &get_cpu_var(cpu_msrs);
	model->shutdown(msrs);