From patchwork Fri Jul 15 10:08:13 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Rutland X-Patchwork-Id: 72089 Delivered-To: patch@linaro.org Received: by 10.140.29.52 with SMTP id a49csp530796qga; Fri, 15 Jul 2016 03:09:09 -0700 (PDT) X-Received: by 10.98.74.201 with SMTP id c70mr20159541pfj.113.1468577345901; Fri, 15 Jul 2016 03:09:05 -0700 (PDT) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id q6si8469721pag.32.2016.07.15.03.09.05; Fri, 15 Jul 2016 03:09:05 -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 S1752991AbcGOKIu (ORCPT + 29 others); Fri, 15 Jul 2016 06:08:50 -0400 Received: from foss.arm.com ([217.140.101.70]:48149 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932586AbcGOKIn (ORCPT ); Fri, 15 Jul 2016 06:08:43 -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 A415EB9A; Fri, 15 Jul 2016 03:09:43 -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 9B0AB3F215; Fri, 15 Jul 2016 03:08:35 -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: [RFCv2 4/4] perf: util: support sysfs supported_cpumask file Date: Fri, 15 Jul 2016 11:08:13 +0100 Message-Id: <1468577293-19667-5-git-send-email-mark.rutland@arm.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1468577293-19667-1-git-send-email-mark.rutland@arm.com> References: <1468577293-19667-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 For system PMUs, the perf tools have long expected a cpumask file under sysfs, describing the single CPU which they support events being opened/handled on. Prior patches in this series have reworked this support to support multiple CPUs in a mask, as is required to handle heterogeneous CPU PMUs. Unfortunately, adding a cpumask file to CPU PMUs would break existing userspace. Prior to this series, perf record will refuse to open events, and perf stat may unexpectedly block at exit time. In the absence of a cpumask, perf stat is functional. To address this, this patch adds support for a new file, supported_cpumask, which can be used to describe heterogeneous CPUs, without the risk of breaking existing userspace binaries. Signed-off-by: Mark Rutland --- tools/perf/util/pmu.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) -- 1.9.1 diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c index ddb0261..06c985c 100644 --- a/tools/perf/util/pmu.c +++ b/tools/perf/util/pmu.c @@ -445,14 +445,23 @@ static struct cpu_map *pmu_cpumask(const char *name) FILE *file; struct cpu_map *cpus; const char *sysfs = sysfs__mountpoint(); + const char *path_template[] = { + "%s/bus/event_source/devices/%s/cpumask", + "%s/bus/event_source/devices/%s/supported_cpumask", + NULL + }; + unsigned int i; if (!sysfs) return NULL; - snprintf(path, PATH_MAX, - "%s/bus/event_source/devices/%s/cpumask", sysfs, name); + for (i = 0; i < ARRAY_SIZE(path_template); i++) { + snprintf(path, PATH_MAX, *path_template, sysfs, name); + if (stat(path, &st) == 0) + break; + } - if (stat(path, &st) < 0) + if (!*path_template) return NULL; file = fopen(path, "r");