Received: by 2002:ac0:a5a6:0:0:0:0:0 with SMTP id m35-v6csp688743imm; Wed, 19 Sep 2018 05:28:40 -0700 (PDT) X-Google-Smtp-Source: ANB0VdYwIdaIQdHDcZvkBMdxHtd3gB5CjjSp5o1k/coEkXugDGJecRFNxRMo36+BbqacsxkDK7zx X-Received: by 2002:a63:a112:: with SMTP id b18-v6mr29889692pgf.384.1537360120417; Wed, 19 Sep 2018 05:28:40 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1537360120; cv=none; d=google.com; s=arc-20160816; b=PR9Ca6897oFdA99nDHLYIPGBkVdrbgDgcYpnuhnwb4K5S4lUM5Hc0WR8kq5yXsAjXP OVLlWHY8wC9jADGjC9JH3MTiRtcxU1Cg+eZOQnnSpNLjKA2p1W3MrLeHrur0u2xdH95J B1PZKF/RuEvR0s07LBGA4+sxlR3ZaOfZQbvmjw+vwm6o8q7lSJAt+2hzF2aextegL6GV 6AsBRKyKn4AopCt68NVQo4SMYs7gGUhiSyo0j4I1yIfmMGeArgOyQ0pfxdtqmLnGVM8f 0WJkprYN0WiCMu27W7VaRXgFBEWiLDZuGJta0GCQORR8VjXssZE6n4jnbJ8fgMBq/Qlg nuZA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature; bh=kbL84+d+DsOFg/OzD+cbvvrEUxbtGzVBcNRtKIBsmDo=; b=FKd71UKuFc1ct/BXbFMgK72oLUPkEwiCi8ndNse7Bk8h5Nky5ZP3OWXQlqEQjowvRt XFLPVt6O+wYr0cWI33AErWSqQLYDkn0WOZj5bXvfPL3FxS4UOon7+mcxfJ8TzYFufTiE 4ZSASGTzpK1uwe8OWjG0ewoCIeKQNkT62WDwN76MRWyR/D6gN4BQTLbrPcEhvGb4oqMJ DT7Tp0hQpyNdUOUuv9h04t8lhIRvz0q/gv1PuIQI7F4hl2IkGM/+/GUmpTwMSpYck9BQ 4KF8x9iFhO1VXcLtnHmQUImUePYg4akfcUHPOwlPfhQ5/DWSGeGx3wEZzIhErSbkVfc6 k/8w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@ursulin-net.20150623.gappssmtp.com header.s=20150623 header.b=qo9M+gfq; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id e14-v6si20527472pgg.345.2018.09.19.05.28.23; Wed, 19 Sep 2018 05:28:40 -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; dkim=pass header.i=@ursulin-net.20150623.gappssmtp.com header.s=20150623 header.b=qo9M+gfq; 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 S1731665AbeISSFt (ORCPT + 99 others); Wed, 19 Sep 2018 14:05:49 -0400 Received: from mail-wm1-f66.google.com ([209.85.128.66]:52155 "EHLO mail-wm1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731235AbeISSFs (ORCPT ); Wed, 19 Sep 2018 14:05:48 -0400 Received: by mail-wm1-f66.google.com with SMTP id y2-v6so6078318wma.1 for ; Wed, 19 Sep 2018 05:28:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ursulin-net.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=kbL84+d+DsOFg/OzD+cbvvrEUxbtGzVBcNRtKIBsmDo=; b=qo9M+gfq8iBtoVnQZJqCYe+TGBWs53KX7QMXHu1f4qjKfh2jj1aboCcBtK+DBQIZt2 4XbV8CKZ4JFA3ARhlecrh17/Dm5PZZs3UetDDl26UkvGIej6gzqfmkumTFMuPhhDjY3Z XdX4zTIVdgjUV7Q/y3bimEgv87xhhNs7ZO31rxrU+NJUe+daGFcwETdoUsn2/FihtiG4 bTZ4ogUEZIq8700cAhDivIzaoC6BfZerrDpoHuBn4gFegANOP9a+wdMAcOlxaJNk/5JV ss+2mlD1THuzUze4Ysg6NWF8i3aCbLP+SuqQ9l+aWuXkeCBTN9u1859pY6BW7rmDHqtw zcKQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=kbL84+d+DsOFg/OzD+cbvvrEUxbtGzVBcNRtKIBsmDo=; b=BjfpsLIVM8cDuf26ZL8v3zIRMkrXhIboIZw+97sdEzclDsI0Wg9lC8KDOxOYSokbAJ 1klGnVfbZK5+Qbtb3YPWRTOXg5DQITM7+KXNMX0SQmg0FmN7lN1NJcdyuEyduEX7ZH9K JRS2XVRyLwGcupOoPjgkR1xo6Kd5VV1FkSNL0oGjGaiGru1Ukhu68+7yjI7fijyQeBMo OAww/6LKAbcKov/U3uR8PsUu78MIkFDg2TnyFFqhLBJzKskKcJkQ2pgda4nv0cF5OHS5 NqOoesWZRMnCgvWGMsRqw8b6UbAcRSdNaDQ5CvlDWYFYtsDgAX739RFIb04uSKwd9BEN GRjQ== X-Gm-Message-State: APzg51D9RUBqQz1IZQ6BBPvkfbN8Cgp8jWlTal7rLfHtdUVpE3CYB+2I wsSawjD6JXXTOCa6fG/YW2/msSA2bSk= X-Received: by 2002:a1c:d785:: with SMTP id o127-v6mr18961194wmg.67.1537360083646; Wed, 19 Sep 2018 05:28:03 -0700 (PDT) Received: from localhost.localdomain ([95.144.165.37]) by smtp.gmail.com with ESMTPSA id l18-v6sm19412403wru.75.2018.09.19.05.28.02 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 19 Sep 2018 05:28:03 -0700 (PDT) From: Tvrtko Ursulin X-Google-Original-From: Tvrtko Ursulin To: linux-kernel@vger.kernel.org Cc: tursulin@ursulin.net, tvrtko.ursulin@linux.intel.com, Tvrtko Ursulin , Thomas Gleixner , Peter Zijlstra , Ingo Molnar , "H. Peter Anvin" , Arnaldo Carvalho de Melo , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Madhavan Srinivasan , Andi Kleen , Alexey Budankov , x86@kernel.org Subject: [RFC 5/5] tools/perf: Add support for per-PMU access control Date: Wed, 19 Sep 2018 13:27:51 +0100 Message-Id: <20180919122751.12439-6-tvrtko.ursulin@linux.intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180919122751.12439-1-tvrtko.ursulin@linux.intel.com> References: <20180919122751.12439-1-tvrtko.ursulin@linux.intel.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Tvrtko Ursulin Now that the perf core supports per-PMU paranoid settings we need to extend the tool to support that. We handle the per-PMU setting in the platform support code where applicable and also notify the user of the new facility on failures to open the event. Thanks to Jiri Olsa for contributing most of the "meat" for this patch and suggestion to improve the error banner as well. Signed-off-by: Tvrtko Ursulin Cc: Thomas Gleixner Cc: Peter Zijlstra Cc: Ingo Molnar Cc: "H. Peter Anvin" Cc: Arnaldo Carvalho de Melo Cc: Alexander Shishkin Cc: Jiri Olsa Cc: Namhyung Kim Cc: Madhavan Srinivasan Cc: Andi Kleen Cc: Alexey Budankov Cc: linux-kernel@vger.kernel.org Cc: x86@kernel.org --- tools/perf/arch/arm/util/cs-etm.c | 2 +- tools/perf/arch/arm64/util/arm-spe.c | 2 +- tools/perf/arch/x86/util/intel-bts.c | 2 +- tools/perf/arch/x86/util/intel-pt.c | 2 +- tools/perf/util/evsel.c | 41 ++++++++++++++++++++++++++-- tools/perf/util/pmu.c | 17 ++++++++++++ tools/perf/util/pmu.h | 1 + 7 files changed, 60 insertions(+), 7 deletions(-) diff --git a/tools/perf/arch/arm/util/cs-etm.c b/tools/perf/arch/arm/util/cs-etm.c index 2f595cd73da6..a5437f100ab9 100644 --- a/tools/perf/arch/arm/util/cs-etm.c +++ b/tools/perf/arch/arm/util/cs-etm.c @@ -69,7 +69,7 @@ static int cs_etm_recording_options(struct auxtrace_record *itr, struct perf_pmu *cs_etm_pmu = ptr->cs_etm_pmu; struct perf_evsel *evsel, *cs_etm_evsel = NULL; const struct cpu_map *cpus = evlist->cpus; - bool privileged = (geteuid() == 0 || perf_event_paranoid() < 0); + bool privileged = (geteuid() == 0 || cs_etm_pmu->paranoid < 0); ptr->evlist = evlist; ptr->snapshot_mode = opts->auxtrace_snapshot_mode; diff --git a/tools/perf/arch/arm64/util/arm-spe.c b/tools/perf/arch/arm64/util/arm-spe.c index 5ccfce87e693..e7e8154757fa 100644 --- a/tools/perf/arch/arm64/util/arm-spe.c +++ b/tools/perf/arch/arm64/util/arm-spe.c @@ -65,7 +65,7 @@ static int arm_spe_recording_options(struct auxtrace_record *itr, container_of(itr, struct arm_spe_recording, itr); struct perf_pmu *arm_spe_pmu = sper->arm_spe_pmu; struct perf_evsel *evsel, *arm_spe_evsel = NULL; - bool privileged = geteuid() == 0 || perf_event_paranoid() < 0; + bool privileged = geteuid() == 0 || arm_spe_pmu->paranoid < 0; struct perf_evsel *tracking_evsel; int err; diff --git a/tools/perf/arch/x86/util/intel-bts.c b/tools/perf/arch/x86/util/intel-bts.c index 781df40b2966..c97e6556c8e7 100644 --- a/tools/perf/arch/x86/util/intel-bts.c +++ b/tools/perf/arch/x86/util/intel-bts.c @@ -116,7 +116,7 @@ static int intel_bts_recording_options(struct auxtrace_record *itr, struct perf_pmu *intel_bts_pmu = btsr->intel_bts_pmu; struct perf_evsel *evsel, *intel_bts_evsel = NULL; const struct cpu_map *cpus = evlist->cpus; - bool privileged = geteuid() == 0 || perf_event_paranoid() < 0; + bool privileged = geteuid() == 0 || intel_bts_pmu->paranoid < 0; btsr->evlist = evlist; btsr->snapshot_mode = opts->auxtrace_snapshot_mode; diff --git a/tools/perf/arch/x86/util/intel-pt.c b/tools/perf/arch/x86/util/intel-pt.c index db0ba8caf5a2..ffbe5f7f1c57 100644 --- a/tools/perf/arch/x86/util/intel-pt.c +++ b/tools/perf/arch/x86/util/intel-pt.c @@ -555,7 +555,7 @@ static int intel_pt_recording_options(struct auxtrace_record *itr, bool have_timing_info, need_immediate = false; struct perf_evsel *evsel, *intel_pt_evsel = NULL; const struct cpu_map *cpus = evlist->cpus; - bool privileged = geteuid() == 0 || perf_event_paranoid() < 0; + bool privileged = geteuid() == 0 || intel_pt_pmu->paranoid < 0; u64 tsc_bit; int err; diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index 1a61628a1c12..fbebce0593f4 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c @@ -9,6 +9,7 @@ #include #include +#include #include #include #include @@ -20,6 +21,7 @@ #include #include #include +#include #include #include #include "asm/bug.h" @@ -2843,10 +2845,37 @@ static bool find_process(const char *name) return ret ? false : true; } +static int __pmu_paranoid_value(const char *name, char *buf, int bufsz) +{ + char path[PATH_MAX]; + int fd, ret; + + ret = snprintf(path, sizeof(path), + "%s/bus/event_source/devices/%s/perf_event_paranoid", + sysfs__mountpoint(), name); + if (ret < 0 || ret == sizeof(path)) + return -1; + + fd = open(path, O_RDONLY); + if (fd < 0) + return -1; + + ret = read(fd, buf, bufsz - 1); + if (ret <= 0) + return -1; + + if (buf[ret - 1] == '\n') + buf[ret - 1] = 0; + else + buf[ret] = 0; + + return 0; +} + int perf_evsel__open_strerror(struct perf_evsel *evsel, struct target *target, int err, char *msg, size_t size) { - char sbuf[STRERR_BUFSIZE]; + char sbuf[STRERR_BUFSIZE], buf[4]; int printed = 0; switch (err) { @@ -2870,9 +2899,15 @@ int perf_evsel__open_strerror(struct perf_evsel *evsel, struct target *target, ">= 1: Disallow CPU event access by users without CAP_SYS_ADMIN\n" ">= 2: Disallow kernel profiling by users without CAP_SYS_ADMIN\n\n" "To make this setting permanent, edit /etc/sysctl.conf too, e.g.:\n\n" - " kernel.perf_event_paranoid = -1\n" , + " kernel.perf_event_paranoid = -1\n\n" + "Alternatively an identical per PMU setting can be found and adjusted at\n" + "/sys/bus/event_source/devices/%s/perf_event_paranoid for fine-grained\n" + "access control. The current value is '%s'.\n", target->system_wide ? "system-wide " : "", - perf_event_paranoid()); + perf_event_paranoid(), + evsel->pmu_name, + __pmu_paranoid_value(evsel->pmu_name, buf, + sizeof(buf)) ? "-" : buf); case ENOENT: return scnprintf(msg, size, "The %s event is not supported.", perf_evsel__name(evsel)); diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c index afd68524ffa9..5ecead4969af 100644 --- a/tools/perf/util/pmu.c +++ b/tools/perf/util/pmu.c @@ -545,6 +545,22 @@ static int pmu_type(const char *name, __u32 *type) return ret; } +static int pmu_paranoid(const char *name) +{ + char path[PATH_MAX]; + int ret, paranoid; + + ret = snprintf(path, sizeof(path), + EVENT_SOURCE_DEVICE_PATH "%s/perf_event_paranoid", + name); + + if (ret > 0 && ret < (int)sizeof(path) && + !sysfs__read_int(path, ¶noid)) + return paranoid; + + return perf_event_paranoid(); +} + /* Add all pmus in sysfs to pmu list: */ static void pmu_read_sysfs(void) { @@ -825,6 +841,7 @@ static struct perf_pmu *pmu_lookup(const char *name) pmu->name = strdup(name); pmu->type = type; pmu->is_uncore = pmu_is_uncore(name); + pmu->paranoid = pmu_paranoid(name); pmu_add_cpu_aliases(&aliases, pmu); INIT_LIST_HEAD(&pmu->format); diff --git a/tools/perf/util/pmu.h b/tools/perf/util/pmu.h index 76fecec7b3f9..1f00c8bbdb90 100644 --- a/tools/perf/util/pmu.h +++ b/tools/perf/util/pmu.h @@ -30,6 +30,7 @@ struct perf_pmu { struct list_head aliases; /* HEAD struct perf_pmu_alias -> list */ struct list_head list; /* ELEM */ int (*set_drv_config) (struct perf_evsel_config_term *term); + int paranoid; }; struct perf_pmu_info { -- 2.17.1