From mboxrd@z Thu Jan 1 00:00:00 1970 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751766AbeAPMvh (ORCPT + 1 other); Tue, 16 Jan 2018 07:51:37 -0500 Received: from mx1.redhat.com ([209.132.183.28]:43218 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750911AbeAPMvg (ORCPT ); Tue, 16 Jan 2018 07:51:36 -0500 Date: Tue, 16 Jan 2018 13:51:32 +0100 From: Jiri Olsa To: Jin Yao Cc: acme@kernel.org, jolsa@kernel.org, peterz@infradead.org, mingo@redhat.com, alexander.shishkin@linux.intel.com, Linux-kernel@vger.kernel.org, ak@linux.intel.com, kan.liang@intel.com, yao.jin@intel.com Subject: Re: [PATCH] perf stat: Ignore error thread when enabling system-wide --per-thread Message-ID: <20180116125132.GD26643@krava> References: <1516117388-10120-1-git-send-email-yao.jin@linux.intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1516117388-10120-1-git-send-email-yao.jin@linux.intel.com> User-Agent: Mutt/1.9.1 (2017-09-22) X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Tue, 16 Jan 2018 12:51:36 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Return-Path: On Tue, Jan 16, 2018 at 11:43:08PM +0800, Jin Yao wrote: > If we execute 'perf stat --per-thread' with non-root account > (even set kernel.perf_event_paranoid = -1 yet), it reports the error: > > jinyao@skl:~$ perf stat --per-thread > Error: > You may not have permission to collect system-wide stats. > > Consider tweaking /proc/sys/kernel/perf_event_paranoid, > which controls use of the performance events system by > unprivileged users (without CAP_SYS_ADMIN). > > The current value is 2: > > -1: Allow use of (almost) all events by all users > Ignore mlock limit after perf_event_mlock_kb without CAP_IPC_LOCK > >= 0: Disallow ftrace function tracepoint by users without CAP_SYS_ADMIN > Disallow raw tracepoint access by users without CAP_SYS_ADMIN > >= 1: Disallow CPU event access by users without CAP_SYS_ADMIN > >= 2: Disallow kernel profiling by users without CAP_SYS_ADMIN > > To make this setting permanent, edit /etc/sysctl.conf too, e.g.: > > kernel.perf_event_paranoid = -1 > > Perhaps the ptrace rule doesn't allow to trace some processes. But anyway > the global --per-thread mode had better ignore such errors and continue > working on other threads. > > This patch will record the index of error thread in perf_evsel__open() > and remove this thread before retrying. > > For example (run with non-root, kernel.perf_event_paranoid isn't set): > > jinyao@skl:~$ perf stat --per-thread > ^C > Performance counter stats for 'system wide': > > vmstat-3458 6.171984 cpu-clock:u (msec) # 0.000 CPUs utilized > perf-3670 0.515599 cpu-clock:u (msec) # 0.000 CPUs utilized > vmstat-3458 1,163,643 cycles:u # 0.189 GHz > perf-3670 40,881 cycles:u # 0.079 GHz > vmstat-3458 1,410,238 instructions:u # 1.21 insn per cycle > perf-3670 3,536 instructions:u # 0.09 insn per cycle > vmstat-3458 288,937 branches:u # 46.814 M/sec > perf-3670 936 branches:u # 1.815 M/sec > vmstat-3458 15,195 branch-misses:u # 5.26% of all branches > perf-3670 76 branch-misses:u # 8.12% of all branches > > 12.651675247 seconds time elapsed could we use the existing code like in attached patch? we might also swap following warning for some generic one: WARNING: Ignored open failure for pid 28392 jirka --- diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c index 98bf9d32f222..f9d4d3ad6fc5 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c @@ -276,6 +276,9 @@ static int create_perf_stat_counter(struct perf_evsel *evsel) attr->enable_on_exec = 1; } + if (stat_config.aggr_mode == AGGR_THREAD) + evsel->ignore_missing_thread = true; + if (target__has_cpu(&target) && !target__has_per_thread(&target)) return perf_evsel__open_per_cpu(evsel, perf_evsel__cpus(evsel)); diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index 8f971a2301d1..509ee175bc97 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c @@ -1656,7 +1656,7 @@ static bool ignore_missing_thread(struct perf_evsel *evsel, return false; /* The -ESRCH is perf event syscall errno for pid's not found. */ - if (err != -ESRCH) + if (err != -ESRCH && err != -EACCES) return false; /* If there's only one thread, let it fail. */