• R
    libperf: Add support for user space counter access · 47d01e7b
    Rob Herring 提交于
    x86 and arm64 can both support direct access of event counters in
    userspace. The access sequence is less than trivial and currently exists
    in perf test code (tools/perf/arch/x86/tests/rdpmc.c) with copies in
    projects such as PAPI and libpfm4.
    
    In order to support userspace access, an event must be mmapped first
    with perf_evsel__mmap(). Then subsequent calls to perf_evsel__read()
    will use the fast path (assuming the arch supports it).
    
    Committer notes:
    
    Added a '__maybe_unused' attribute to the read_perf_counter() argument
    to fix the build on arches other than x86_64 and arm.
    
    Committer testing:
    
      Building and running the libperf tests in verbose mode (V=1) now shows
      those "loop = N, count = N" extra lines, testing user space counter
      access.
    
      # make V=1 -C tools/lib/perf tests
      make: Entering directory '/home/acme/git/perf/tools/lib/perf'
      make -f /home/acme/git/perf/tools/build/Makefile.build dir=. obj=libperf
      make -C /home/acme/git/perf/tools/lib/api/ O= libapi.a
      make -f /home/acme/git/perf/tools/build/Makefile.build dir=./fd obj=libapi
      make -f /home/acme/git/perf/tools/build/Makefile.build dir=./fs obj=libapi
      make -C tests
      gcc -I/home/acme/git/perf/tools/lib/perf/include -I/home/acme/git/perf/tools/include -I/home/acme/git/perf/tools/lib -g -Wall -o test-cpumap-a test-cpumap.c ../libperf.a /home/acme/git/perf/tools/lib/api/libapi.a
      gcc -I/home/acme/git/perf/tools/lib/perf/include -I/home/acme/git/perf/tools/include -I/home/acme/git/perf/tools/lib -g -Wall -o test-threadmap-a test-threadmap.c ../libperf.a /home/acme/git/perf/tools/lib/api/libapi.a
      gcc -I/home/acme/git/perf/tools/lib/perf/include -I/home/acme/git/perf/tools/include -I/home/acme/git/perf/tools/lib -g -Wall -o test-evlist-a test-evlist.c ../libperf.a /home/acme/git/perf/tools/lib/api/libapi.a
      gcc -I/home/acme/git/perf/tools/lib/perf/include -I/home/acme/git/perf/tools/include -I/home/acme/git/perf/tools/lib -g -Wall -o test-evsel-a test-evsel.c ../libperf.a /home/acme/git/perf/tools/lib/api/libapi.a
      gcc -I/home/acme/git/perf/tools/lib/perf/include -I/home/acme/git/perf/tools/include -I/home/acme/git/perf/tools/lib -g -Wall -L.. -o test-cpumap-so test-cpumap.c /home/acme/git/perf/tools/lib/api/libapi.a -lperf
      gcc -I/home/acme/git/perf/tools/lib/perf/include -I/home/acme/git/perf/tools/include -I/home/acme/git/perf/tools/lib -g -Wall -L.. -o test-threadmap-so test-threadmap.c /home/acme/git/perf/tools/lib/api/libapi.a -lperf
      gcc -I/home/acme/git/perf/tools/lib/perf/include -I/home/acme/git/perf/tools/include -I/home/acme/git/perf/tools/lib -g -Wall -L.. -o test-evlist-so test-evlist.c /home/acme/git/perf/tools/lib/api/libapi.a -lperf
      gcc -I/home/acme/git/perf/tools/lib/perf/include -I/home/acme/git/perf/tools/include -I/home/acme/git/perf/tools/lib -g -Wall -L.. -o test-evsel-so test-evsel.c /home/acme/git/perf/tools/lib/api/libapi.a -lperf
      make -C tests run
      running static:
      - running test-cpumap.c...OK
      - running test-threadmap.c...OK
      - running test-evlist.c...OK
      - running test-evsel.c...
      	loop = 65536, count = 333926
      	loop = 131072, count = 655781
      	loop = 262144, count = 1311141
      	loop = 524288, count = 2630126
      	loop = 1048576, count = 5256955
      	loop = 65536, count = 524594
      	loop = 131072, count = 1058916
      	loop = 262144, count = 2097458
      	loop = 524288, count = 4205429
      	loop = 1048576, count = 8406606
      OK
      running dynamic:
      - running test-cpumap.c...OK
      - running test-threadmap.c...OK
      - running test-evlist.c...OK
      - running test-evsel.c...
      	loop = 65536, count = 328102
      	loop = 131072, count = 655782
      	loop = 262144, count = 1317494
      	loop = 524288, count = 2627851
      	loop = 1048576, count = 5255187
      	loop = 65536, count = 524601
      	loop = 131072, count = 1048923
      	loop = 262144, count = 2107917
      	loop = 524288, count = 4194606
      	loop = 1048576, count = 8409322
      OK
      make: Leaving directory '/home/acme/git/perf/tools/lib/perf'
      #
    Signed-off-by: NRob Herring <robh@kernel.org>
    Acked-by: NJiri Olsa <jolsa@redhat.com>
    Acked-by: NNamhyung Kim <namhyung@kernel.org>
    Tested-by: NArnaldo Carvalho de Melo <acme@redhat.com>
    Cc: Catalin Marinas <catalin.marinas@arm.com>
    Cc: Itaru Kitayama <itaru.kitayama@gmail.com>
    Cc: Mark Rutland <mark.rutland@arm.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Will Deacon <will@kernel.org>
    Link: http://lore.kernel.org/lkml/20210414155412.3697605-4-robh@kernel.orgSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
    47d01e7b
evsel.c 8.0 KB