From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S967017AbdEZMbq (ORCPT ); Fri, 26 May 2017 08:31:46 -0400 Received: from mx1.redhat.com ([209.132.183.28]:61869 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752647AbdEZMbo (ORCPT ); Fri, 26 May 2017 08:31:44 -0400 DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 41D31C04BD3A Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=kernel.org Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; spf=none smtp.mailfrom=jolsa@kernel.org DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 41D31C04BD3A From: Jiri Olsa To: Arnaldo Carvalho de Melo Cc: Michael Petlan , lkml , Ingo Molnar , Peter Zijlstra , Namhyung Kim , David Ahern , Andi Kleen Subject: [PATCH 1/2] perf tests: Fix switch tracking test for P4 Date: Fri, 26 May 2017 14:31:40 +0200 Message-Id: <20170526123141.20900-1-jolsa@kernel.org> X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Fri, 26 May 2017 12:31:44 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The switch tracking test keeps failing on P4 cpu, when NMI watchdog is enabled. The reason is that P4 pmu uses substitute event for cycles when it's already taken (in our case by NMI watchdog), but this event does not give even results like cycles, and we could end up with no samples at all for our short measuring period. Fixing this by using "instructions:u" event instead, which seems to be stable enough. Cc: Michael Petlan Link: http://lkml.kernel.org/n/tip-4s8vo7skneszacdckv7uiog3@git.kernel.org Signed-off-by: Jiri Olsa --- tools/perf/tests/switch-tracking.c | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/tools/perf/tests/switch-tracking.c b/tools/perf/tests/switch-tracking.c index 65474fd80da7..e519819ea2e5 100644 --- a/tools/perf/tests/switch-tracking.c +++ b/tools/perf/tests/switch-tracking.c @@ -10,6 +10,7 @@ #include "thread_map.h" #include "cpumap.h" #include "tests.h" +#include "header.h" static int spin_sleep(void) { @@ -298,6 +299,27 @@ static int process_events(struct perf_evlist *evlist, return ret; } +static const char *get_hw_counter(void) +{ + const char *counter = "cycles:u"; + char *cpuid; + + cpuid = get_cpuid_str(); + + /* + * P4 pmu uses substitute event for cycles if it's already + * taken, but it does not give even results like cycles, + * and we could end up with no samples at all for our short + * measuring period. Using "instructions:u" event instead, + * which seems to be stable enough. + */ + if (!strcmp("GenuineIntel-15-4", cpuid)) + counter = "instructions:u"; + + pr_debug("using '%s' HW counter"); + return counter; +} + /** * test__switch_tracking - test using sched_switch and tracking events. * @@ -308,6 +330,7 @@ static int process_events(struct perf_evlist *evlist, */ int test__switch_tracking(int subtest __maybe_unused) { + const char *hw_counter = get_hw_counter(); const char *sched_switch = "sched:sched_switch"; struct switch_tracking switch_tracking = { .tids = NULL, }; struct record_opts opts = { @@ -357,9 +380,9 @@ int test__switch_tracking(int subtest __maybe_unused) cpu_clocks_evsel = perf_evlist__last(evlist); /* Second event */ - err = parse_events(evlist, "cycles:u", NULL); + err = parse_events(evlist, hw_counter, NULL); if (err) { - pr_debug("Failed to parse event cycles:u\n"); + pr_debug("Failed to parse event %s\n", hw_counter); goto out_err; } -- 2.9.4