linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] perf/core: Fix endless multiplex timer
@ 2020-03-03 20:28 kan.liang
  2020-03-03 21:08 ` Peter Zijlstra
  2020-03-24  6:00 ` [perf/core] 92b1f046a2: BUG:kernel_NULL_pointer_dereference,address kernel test robot
  0 siblings, 2 replies; 13+ messages in thread
From: kan.liang @ 2020-03-03 20:28 UTC (permalink / raw)
  To: peterz, mingo, linux-kernel; +Cc: irogers, eranian, ak, Kan Liang

From: Kan Liang <kan.liang@linux.intel.com>

A lot of time are spent in writing uncore MSRs even though no perf is
running.

  4.66%  swapper      [kernel.kallsyms]        [k] native_write_msr
            |
             --4.56%--native_write_msr
                       |
                       |--1.68%--snbep_uncore_msr_enable_box
                       |          perf_mux_hrtimer_handler
                       |          __hrtimer_run_queues
                       |          hrtimer_interrupt
                       |          smp_apic_timer_interrupt
                       |          apic_timer_interrupt
                       |          cpuidle_enter_state
                       |          cpuidle_enter
                       |          do_idle
                       |          cpu_startup_entry
                       |          start_kernel
                       |          secondary_startup_64

The root cause is that multiplex timer was not stopped when perf stat
finished.
Current perf relies on rotate_necessary to determine whether the
multiplex timer should be stopped. The variable only be reset in
ctx_sched_out(), which is not enough for system-wide event.
Perf stat invokes PERF_EVENT_IOC_DISABLE to stop system-wide event
before closing it.
  perf_ioctl()
    perf_event_disable()
      event_sched_out()
The rotate_necessary will never be reset.

The issue is a generic issue, not just impact the uncore.

Check whether we had been multiplexing. If yes, reset rotate_necessary
for the last active event in __perf_event_disable().

Fixes: fd7d55172d1e ("perf/cgroups: Don't rotate events for cgroups unnecessarily")
Reported-by: Andi Kleen <ak@linux.intel.com>
Reviewed-by: Andi Kleen <ak@linux.intel.com>
Signed-off-by: Kan Liang <kan.liang@linux.intel.com>
---
 kernel/events/core.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/kernel/events/core.c b/kernel/events/core.c
index 3f1f77de7247..50688de56181 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -2242,6 +2242,16 @@ static void __perf_event_disable(struct perf_event *event,
 		update_cgrp_time_from_event(event);
 	}
 
+	/*
+	 * If we had been multiplexing,
+	 * stop the rotations for the last active event.
+	 * Only need to check system wide events.
+	 * For task events, it will be checked in ctx_sched_out().
+	 */
+	if ((cpuctx->ctx.nr_events != cpuctx->ctx.nr_active) &&
+	    (cpuctx->ctx.nr_active == 1))
+		cpuctx->ctx.rotate_necessary = 0;
+
 	if (event == event->group_leader)
 		group_sched_out(event, cpuctx, ctx);
 	else
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2020-08-06 20:40 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-03-03 20:28 [PATCH] perf/core: Fix endless multiplex timer kan.liang
2020-03-03 21:08 ` Peter Zijlstra
2020-03-04  1:40   ` Liang, Kan
2020-03-04  9:33     ` Peter Zijlstra
2020-03-04 14:20       ` Liang, Kan
2020-03-05 12:38         ` Peter Zijlstra
2020-03-05 17:56           ` Liang, Kan
2020-03-20 12:58           ` [tip: perf/core] " tip-bot2 for Peter Zijlstra
2020-08-06 18:11             ` Robin Murphy
2020-08-06 18:53               ` Greg KH
2020-08-06 20:40                 ` Robin Murphy
2020-03-24  6:00 ` [perf/core] 92b1f046a2: BUG:kernel_NULL_pointer_dereference,address kernel test robot
2020-03-24 12:52   ` Liang, Kan

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).