perf tools: Use CAP_SYS_ADMIN with perf_event_paranoid checks
authorIgor Lubashev <ilubashe@akamai.com>
Tue, 27 Aug 2019 01:39:13 +0000 (21:39 -0400)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Wed, 28 Aug 2019 20:18:08 +0000 (17:18 -0300)
The kernel is using CAP_SYS_ADMIN instead of euid==0 to override
perf_event_paranoid check. Make perf do the same.

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Acked-by: Jiri Olsa <jolsa@kernel.org>
Tested-by: Mathieu Poirier <mathieu.poirier@linaro.org>
Reviewed-by: Mathieu Poirier <mathieu.poirier@linaro.org> # coresight part
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Alexey Budankov <alexey.budankov@linux.intel.com>
Cc: James Morris <jmorris@namei.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Suzuki Poulouse <suzuki.poulose@arm.com>
Cc: linux-arm-kernel@lists.infradead.org
Link: http://lkml.kernel.org/r/1566869956-7154-3-git-send-email-ilubashe@akamai.com
Signed-off-by: Igor Lubashev <ilubashe@akamai.com>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/arch/arm/util/cs-etm.c
tools/perf/arch/arm64/util/arm-spe.c
tools/perf/arch/x86/util/intel-bts.c
tools/perf/arch/x86/util/intel-pt.c
tools/perf/util/evsel.c

index a185dab2d9037877d78ee00f6699298ad14663e9..5d856edc412bfb023873f69cacaa624a61e6f977 100644 (file)
@@ -18,6 +18,7 @@
 #include "../../util/record.h"
 #include "../../util/auxtrace.h"
 #include "../../util/cpumap.h"
+#include "../../util/event.h"
 #include "../../util/evlist.h"
 #include "../../util/evsel.h"
 #include "../../util/pmu.h"
@@ -254,7 +255,7 @@ static int cs_etm_recording_options(struct auxtrace_record *itr,
        struct perf_pmu *cs_etm_pmu = ptr->cs_etm_pmu;
        struct evsel *evsel, *cs_etm_evsel = NULL;
        struct perf_cpu_map *cpus = evlist->core.cpus;
-       bool privileged = (geteuid() == 0 || perf_event_paranoid() < 0);
+       bool privileged = perf_event_paranoid_check(-1);
        int err = 0;
 
        ptr->evlist = evlist;
index cdd5c0c841839e7c5e8de19e629d58078c02d0ba..c7b38f09260fba967f4f8c4ae597dce28598bedf 100644 (file)
@@ -12,6 +12,7 @@
 #include <time.h>
 
 #include "../../util/cpumap.h"
+#include "../../util/event.h"
 #include "../../util/evsel.h"
 #include "../../util/evlist.h"
 #include "../../util/session.h"
@@ -67,7 +68,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 evsel *evsel, *arm_spe_evsel = NULL;
-       bool privileged = geteuid() == 0 || perf_event_paranoid() < 0;
+       bool privileged = perf_event_paranoid_check(-1);
        struct evsel *tracking_evsel;
        int err;
 
index 1f2cf612bc9c6b4e0f2f9125173d9784356cc648..16d26ea701ad20a8d4062fb32398f00671982d85 100644 (file)
@@ -12,6 +12,7 @@
 #include <linux/zalloc.h>
 
 #include "../../util/cpumap.h"
+#include "../../util/event.h"
 #include "../../util/evsel.h"
 #include "../../util/evlist.h"
 #include "../../util/session.h"
@@ -108,7 +109,7 @@ static int intel_bts_recording_options(struct auxtrace_record *itr,
        struct perf_pmu *intel_bts_pmu = btsr->intel_bts_pmu;
        struct evsel *evsel, *intel_bts_evsel = NULL;
        const struct perf_cpu_map *cpus = evlist->core.cpus;
-       bool privileged = geteuid() == 0 || perf_event_paranoid() < 0;
+       bool privileged = perf_event_paranoid_check(-1);
 
        btsr->evlist = evlist;
        btsr->snapshot_mode = opts->auxtrace_snapshot_mode;
index 44cfe72c1a4c6a08c2c55da11332995cd02b6ca7..746981c82a16f89e3ab3c4b8c8e37e696ea73818 100644 (file)
@@ -579,7 +579,7 @@ static int intel_pt_recording_options(struct auxtrace_record *itr,
        bool have_timing_info, need_immediate = false;
        struct evsel *evsel, *intel_pt_evsel = NULL;
        const struct perf_cpu_map *cpus = evlist->core.cpus;
-       bool privileged = geteuid() == 0 || perf_event_paranoid() < 0;
+       bool privileged = perf_event_paranoid_check(-1);
        u64 tsc_bit;
        int err;
 
index fa676355559e1f6efd7a27fcc90b333c40286743..7c704b8f0e5c66971b7ec6314ccc03628281e015 100644 (file)
@@ -282,7 +282,7 @@ struct evsel *perf_evsel__new_idx(struct perf_event_attr *attr, int idx)
 
 static bool perf_event_can_profile_kernel(void)
 {
-       return geteuid() == 0 || perf_event_paranoid() == -1;
+       return perf_event_paranoid_check(-1);
 }
 
 struct evsel *perf_evsel__new_cycles(bool precise)