From patchwork Thu Jul 7 16:04:34 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Rutland X-Patchwork-Id: 71596 Delivered-To: patch@linaro.org Received: by 10.140.28.4 with SMTP id 4csp1489310qgy; Thu, 7 Jul 2016 09:05:23 -0700 (PDT) X-Received: by 10.98.42.76 with SMTP id q73mr1554394pfq.115.1467907522809; Thu, 07 Jul 2016 09:05:22 -0700 (PDT) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id z62si4677481pfb.179.2016.07.07.09.05.22; Thu, 07 Jul 2016 09:05:22 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753175AbcGGQFP (ORCPT + 30 others); Thu, 7 Jul 2016 12:05:15 -0400 Received: from foss.arm.com ([217.140.101.70]:37368 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752604AbcGGQE6 (ORCPT ); Thu, 7 Jul 2016 12:04:58 -0400 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 4071E523; Thu, 7 Jul 2016 09:05:56 -0700 (PDT) Received: from leverpostej.cambridge.arm.com (usa-sjc-imap-foss1.foss.arm.com [10.72.51.249]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 9E41E3F41F; Thu, 7 Jul 2016 09:04:54 -0700 (PDT) From: Mark Rutland To: linux-kernel@vger.kernel.org Cc: acme@kernel.org, adrian.hunter@intel.com, alexander.shishkin@linux.intel.com, hekuang@huawei.com, jolsa@kernel.org, kan.liang@intel.com, mark.rutland@arm.com, mingo@redhat.com, peterz@infradead.org, wangnan0@huawei.com Subject: [RFC PATCH 3/3] perf: util: only open events on CPUs an evsel permits Date: Thu, 7 Jul 2016 17:04:34 +0100 Message-Id: <1467907474-3290-4-git-send-email-mark.rutland@arm.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1467907474-3290-1-git-send-email-mark.rutland@arm.com> References: <1467907474-3290-1-git-send-email-mark.rutland@arm.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org In systems with heterogeneous CPU PMUs, it's possible for each evsel to cover a distinct set of CPUs, and hence the cpu_map associated with each evsel may have a distinct idx<->id mapping. Any of these may be distinct from the evlist's cpu map. Events can be tied to the same fd so long as they use the same per-cpu ringbuffer (i.e. so long as they are on the same CPU). To acquire the correct FDs, we must compare the Linux logical IDs rather than the evsel or evlist indices. This path adds logic to perf_evlist__mmap_per_evsel to handle this, translating IDs as required. As PMUs may cover a subset of CPUs from the evlist, we skip the CPUs a PMU cannot handle. Signed-off-by: Mark Rutland Cc: Adrian Hunter Cc: Alexander Shishkin Cc: Arnaldo Carvalho de Melo Cc: He Kuang Cc: Ingo Molnar Cc: Jiri Olsa Cc: Peter Zijlstra Cc: Wang Nan Cc: linux-kernel@vger.kernel.org --- tools/perf/util/evlist.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) -- 1.9.1 diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c index e82ba90..0b5b1be 100644 --- a/tools/perf/util/evlist.c +++ b/tools/perf/util/evlist.c @@ -984,17 +984,24 @@ static int __perf_evlist__mmap(struct perf_evlist *evlist, int idx, } static int perf_evlist__mmap_per_evsel(struct perf_evlist *evlist, int idx, - struct mmap_params *mp, int cpu, + struct mmap_params *mp, int cpu_idx, int thread, int *output) { struct perf_evsel *evsel; + int evlist_cpu = cpu_map__cpu(evlist->cpus, cpu_idx); evlist__for_each(evlist, evsel) { int fd; + int cpu; if (evsel->system_wide && thread) continue; + if (!cpu_map__has(evsel->cpus, evlist_cpu)) + continue; + + cpu = cpu_map__idx(evsel->cpus, evlist_cpu); + fd = FD(evsel, cpu, thread); if (*output == -1) {