Search code examples
linuxperf

"perf stat" returning <not supported> for all events on ARCH Linux ARM


I had perf working fine on my Cortex-A15 Chromebook running ARCH Linux ARM.

I updated pacman to get gcc-5.3, and it asked to update my kernel, so I did.

Now perf returns:

[cortex@alarm Speckle]$ perf stat uname -a
Linux alarm 3.8.11-3-ARCH #1 SMP Wed Jan 20 13:44:59 MST 2016 armv7l GNU/Linux

 Performance counter stats for 'uname -a':

   <not supported>      task-clock               
   <not supported>      context-switches         
   <not supported>      cpu-migrations           
   <not supported>      page-faults              
   <not supported>      cycles                   
   <not supported>      stalled-cycles-frontend  
   <not supported>      stalled-cycles-backend   
   <not supported>      instructions             
   <not supported>      branches                 
   <not supported>      branch-misses            

       0.002148765 seconds time elapsed

If I run perf list, it tells me it should be supporting these events:

[cortex@alarm Speckle]$ perf list

List of pre-defined events (to be used in -e):

  branch-instructions OR branches                    [Hardware event]
  branch-misses                                      [Hardware event]
  bus-cycles                                         [Hardware event]
  cache-misses                                       [Hardware event]
  cache-references                                   [Hardware event]
  cpu-cycles OR cycles                               [Hardware event]
  instructions                                       [Hardware event]
  ref-cycles                                         [Hardware event]

And checking my kernel configuration, it seems that perf should still be supported.

[cortex@alarm Speckle]$ zgrep PERF /proc/config.gz 
CONFIG_CGROUP_PERF=y
CONFIG_HAVE_PERF_EVENTS=y
CONFIG_PERF_USE_VMALLOC=y
CONFIG_PERF_EVENTS=y
# CONFIG_DEBUG_PERF_USE_VMALLOC is not set
CONFIG_HW_PERF_EVENTS=y
# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
# CONFIG_CLS_U32_PERF is not set
# CONFIG_DEVFREQ_GOV_PERFORMANCE is not set

If I try ocount/oprofile, it seems to work:

[cortex@alarm ~]$ ocount --events INST_RETIRED  uname -a
Linux alarm 3.8.11-3-ARCH #1 SMP Wed Jan 20 13:44:59 MST 2016 armv7l GNU/Linux

Events were actively counted for 1598252 nanoseconds.
Event counts (actual) for /usr/bin/uname:
    Event                Count                    % time counted
    INST_RETIRED         609,518                  100.00

Looking at the pacman's log, it looks like this is where the kernel change occurred?

[2016-04-26 06:24] [ALPM] upgraded libtool (2.4.6-3 -> 2.4.6-4)
[2016-04-26 06:27] [ALPM] upgraded linux-firmware (20150904.6ebf5d5-1 -> 20160315.deb1d83-1)
[2016-04-26 06:27] [ALPM] upgraded linux-peach (3.8.11-2 -> 3.8.11-3)
[2016-04-26 06:27] [ALPM-SCRIPTLET] >>> Updating module dependencies. Please wait ...
[2016-04-26 06:27] [ALPM-SCRIPTLET] A new kernel version needs to be flashed onto /dev/sda1.
[2016-04-26 06:27] [ALPM-SCRIPTLET] Do you want to do this now? [y|N]
[2016-04-26 06:28] [ALPM-SCRIPTLET] 8752+0 records in
[2016-04-26 06:28] [ALPM-SCRIPTLET] 8752+0 records out
[2016-04-26 06:28] [ALPM-SCRIPTLET] 4481024 bytes (4.5 MB, 4.3 MiB) copied, 12.7236 s, 352 kB/s

What did I screw up and how do I get perf back?


Solution

  • The solution I found was to downgrade from perf 4.5-2 to perf 4.3-1.

    cd /var/cache/pacman/pkg/
    sudo pacman -U perf-4.3-1-armv7h.pkg.tar.xz
    

    Running perf stat ls now returns the counters I expect.