• Stephane Eranian's avatar
    perf stat: Force error in fallback on :k events · bec49a9e
    Stephane Eranian authored
    When it is not possible for a non-privilege perf command to monitor at
    the kernel level (:k), the fallback code forces a :u. That works if the
    event was previously monitoring both levels.  But if the event was
    already constrained to kernel only, then it does not make sense to
    restrict it to user only.
    
    Given the code works by exclusion, a kernel only event would have:
    
      attr->exclude_user = 1
    
    The fallback code would add:
    
      attr->exclude_kernel = 1
    
    In the end the end would not monitor in either the user level or kernel
    level. In other words, it would count nothing.
    
    An event programmed to monitor kernel only cannot be switched to user
    only without seriously warning the user.
    
    This patch forces an error in this case to make it clear the request
    cannot really be satisfied.
    
    Behavior with paranoid 1:
    
      $ sudo bash -c "echo 1 > /proc/sys/kernel/perf_event_paranoid"
      $ perf stat -e cycles:k sleep 1
    
       Performance counter stats for 'sleep 1':
    
               1,520,413      cycles:k
    
             1.002361664 seconds time elapsed
    
             0.002480000 seconds user
             0.000000000 seconds sys
    
    Old behavior with paranoid 2:
    
      $ sudo bash -c "echo 2 > /proc/sys/kernel/perf_event_paranoid"
      $ perf stat -e cycles:k sleep 1
       Performance counter stats for 'sleep 1':
    
                       0      cycles:ku
    
             1.002358127 seconds time elapsed
    
             0.002384000 seconds user
             0.000000000 seconds sys
    
    New behavior with paranoid 2:
    
      $ sudo bash -c "echo 2 > /proc/sys/kernel/perf_event_paranoid"
      $ perf stat -e cycles:k sleep 1
      Error:
      You may not have permission to collect stats.
    
      Consider tweaking /proc/sys/kernel/perf_event_paranoid,
      which controls use of the performance events system by
      unprivileged users (without CAP_PERFMON or 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_PERFMON or CAP_SYS_ADMIN
            Disallow raw tracepoint access by users without CAP_SYS_PERFMON or CAP_SYS_ADMIN
      >= 1: Disallow CPU event access by users without CAP_PERFMON or CAP_SYS_ADMIN
      >= 2: Disallow kernel profiling by users without CAP_PERFMON or CAP_SYS_ADMIN
    
      To make this setting permanent, edit /etc/sysctl.conf too, e.g.:
    
              kernel.perf_event_paranoid = -1
    
    v2 of this patch addresses the review feedback from jolsa@redhat.com.
    Signed-off-by: default avatarStephane Eranian <eranian@google.com>
    Reviewed-by: default avatarIan Rogers <irogers@google.com>
    Acked-by: default avatarJiri Olsa <jolsa@redhat.com>
    Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
    Cc: Jiri Olsa <jolsa@redhat.com>
    Cc: Mark Rutland <mark.rutland@arm.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Link: http://lore.kernel.org/lkml/20200414161550.225588-1-irogers@google.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    bec49a9e
evsel.c 65.8 KB