Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S934956AbdGTIkU (ORCPT ); Thu, 20 Jul 2017 04:40:20 -0400 Received: from terminus.zytor.com ([65.50.211.136]:50571 "EHLO terminus.zytor.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S934932AbdGTIkA (ORCPT ); Thu, 20 Jul 2017 04:40:00 -0400 Date: Thu, 20 Jul 2017 01:34:36 -0700 From: tip-bot for Alexander Shishkin Message-ID: Cc: peterz@infradead.org, torvalds@linux-foundation.org, alexander.shishkin@linux.intel.com, linux-kernel@vger.kernel.org, jolsa@redhat.com, tglx@linutronix.de, acme@redhat.com, vincent.weaver@maine.edu, mingo@kernel.org, hpa@zytor.com, eranian@gmail.com Reply-To: torvalds@linux-foundation.org, peterz@infradead.org, tglx@linutronix.de, jolsa@redhat.com, linux-kernel@vger.kernel.org, alexander.shishkin@linux.intel.com, acme@redhat.com, hpa@zytor.com, eranian@gmail.com, vincent.weaver@maine.edu, mingo@kernel.org In-Reply-To: <87lgnmvw7h.fsf@ashishki-desk.ger.corp.intel.com> References: <87lgnmvw7h.fsf@ashishki-desk.ger.corp.intel.com> To: linux-tip-commits@vger.kernel.org Subject: [tip:perf/urgent] perf/core: Fix scheduling regression of pinned groups Git-Commit-ID: 3bda69c1c3993a2bddbae01397d12bfef6054011 X-Mailer: tip-git-log-daemon Robot-ID: Robot-Unsubscribe: Contact to get blacklisted from these emails MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 Content-Disposition: inline Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3360 Lines: 88 Commit-ID: 3bda69c1c3993a2bddbae01397d12bfef6054011 Gitweb: http://git.kernel.org/tip/3bda69c1c3993a2bddbae01397d12bfef6054011 Author: Alexander Shishkin AuthorDate: Tue, 18 Jul 2017 14:08:34 +0300 Committer: Ingo Molnar CommitDate: Thu, 20 Jul 2017 09:43:02 +0200 perf/core: Fix scheduling regression of pinned groups Vince Weaver reported: > I was tracking down some regressions in my perf_event_test testsuite. > Some of the tests broke in the 4.11-rc1 timeframe. > > I've bisected one of them, this report is about > tests/overflow/simul_oneshot_group_overflow > This test creates an event group containing two sampling events, set > to overflow to a signal handler (which disables and then refreshes the > event). > > On a good kernel you get the following: > Event perf::instructions with period 1000000 > Event perf::instructions with period 2000000 > fd 3 overflows: 946 (perf::instructions/1000000) > fd 4 overflows: 473 (perf::instructions/2000000) > Ending counts: > Count 0: 946379875 > Count 1: 946365218 > > With the broken kernels you get: > Event perf::instructions with period 1000000 > Event perf::instructions with period 2000000 > fd 3 overflows: 938 (perf::instructions/1000000) > fd 4 overflows: 318 (perf::instructions/2000000) > Ending counts: > Count 0: 946373080 > Count 1: 653373058 The root cause of the bug is that the following commit: 487f05e18a ("perf/core: Optimize event rescheduling on active contexts") erronously assumed that event's 'pinned' setting determines whether the event belongs to a pinned group or not, but in fact, it's the group leader's pinned state that matters. This was discovered by Vince in the test case described above, where two instruction counters are grouped, the group leader is pinned, but the other event is not; in the regressed case the counters were off by 33% (the difference between events' periods), but should be the same within the error margin. Fix the problem by looking at the group leader's pinning. Reported-by: Vince Weaver Tested-by: Vince Weaver Signed-off-by: Alexander Shishkin Cc: Arnaldo Carvalho de Melo Cc: Jiri Olsa Cc: Linus Torvalds Cc: Peter Zijlstra Cc: Stephane Eranian Cc: Thomas Gleixner Cc: stable@vger.kernel.org Fixes: 487f05e18a ("perf/core: Optimize event rescheduling on active contexts") Link: http://lkml.kernel.org/r/87lgnmvw7h.fsf@ashishki-desk.ger.corp.intel.com Signed-off-by: Ingo Molnar --- kernel/events/core.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/kernel/events/core.c b/kernel/events/core.c index 9747e42..c9cdbd3 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -1452,6 +1452,13 @@ static enum event_type_t get_event_type(struct perf_event *event) lockdep_assert_held(&ctx->lock); + /* + * It's 'group type', really, because if our group leader is + * pinned, so are we. + */ + if (event->group_leader != event) + event = event->group_leader; + event_type = event->attr.pinned ? EVENT_PINNED : EVENT_FLEXIBLE; if (!ctx->task) event_type |= EVENT_CPU;