• Mathieu Poirier's avatar
    perf/core: Update filters only on executable mmap · 12b40a23
    Mathieu Poirier authored
    Function perf_event_mmap() is called by the MM subsystem each time
    part of a binary is loaded in memory.  There can be several mapping
    for a binary, many times unrelated to the code section.
    
    Each time a section of a binary is mapped address filters are
    updated, event when the map doesn't pertain to the code section.
    The end result is that filters are configured based on the last map
    event that was received rather than the last mapping of the code
    segment.
    
    For example if we have an executable 'main' that calls library
    'libcstest.so.1.0', and that we want to collect traces on code
    that is in that library.  The perf cmd line for this scenario
    would be:
    
      perf record -e cs_etm// --filter 'filter 0x72c/0x40@/opt/lib/libcstest.so.1.0' --per-thread ./main
    
    Resulting in binaries being mapped this way:
    
      root@linaro-nano:~# cat /proc/1950/maps
      00400000-00401000 r-xp 00000000 08:02 33169     /home/linaro/main
      00410000-00411000 r--p 00000000 08:02 33169     /home/linaro/main
      00411000-00412000 rw-p 00001000 08:02 33169     /home/linaro/main
      7fa2464000-7fa2474000 rw-p 00000000 00:00 0
      7fa2474000-7fa25a4000 r-xp 00000000 08:02 543   /lib/aarch64-linux-gnu/libc-2.21.so
      7fa25a4000-7fa25b3000 ---p 00130000 08:02 543   /lib/aarch64-linux-gnu/libc-2.21.so
      7fa25b3000-7fa25b7000 r--p 0012f000 08:02 543   /lib/aarch64-linux-gnu/libc-2.21.so
      7fa25b7000-7fa25b9000 rw-p 00133000 08:02 543   /lib/aarch64-linux-gnu/libc-2.21.so
      7fa25b9000-7fa25bd000 rw-p 00000000 00:00 0
      7fa25bd000-7fa25be000 r-xp 00000000 08:02 38308 /opt/lib/libcstest.so.1.0
      7fa25be000-7fa25cd000 ---p 00001000 08:02 38308 /opt/lib/libcstest.so.1.0
      7fa25cd000-7fa25ce000 r--p 00000000 08:02 38308 /opt/lib/libcstest.so.1.0
      7fa25ce000-7fa25cf000 rw-p 00001000 08:02 38308 /opt/lib/libcstest.so.1.0
      7fa25cf000-7fa25eb000 r-xp 00000000 08:02 574   /lib/aarch64-linux-gnu/ld-2.21.so
      7fa25ef000-7fa25f2000 rw-p 00000000 00:00 0
      7fa25f7000-7fa25f9000 rw-p 00000000 00:00 0
      7fa25f9000-7fa25fa000 r--p 00000000 00:00 0     [vvar]
      7fa25fa000-7fa25fb000 r-xp 00000000 00:00 0     [vdso]
      7fa25fb000-7fa25fc000 r--p 0001c000 08:02 574   /lib/aarch64-linux-gnu/ld-2.21.so
      7fa25fc000-7fa25fe000 rw-p 0001d000 08:02 574   /lib/aarch64-linux-gnu/ld-2.21.so
      7ff2ea8000-7ff2ec9000 rw-p 00000000 00:00 0     [stack]
      root@linaro-nano:~#
    
    Before 'main()' can execute 'libcstest.so.1.0' has to be loaded in
    memory.  Once that has been done perf_event_mmap() has been called
    4 times, with the last map starting at address 0x7fa25ce000 and
    the address filter configured to start filtering when the
    IP has passed over address 0x0x7fa25ce72c (0x7fa25ce000 + 0x72c).
    
    But that is wrong since the code segment for library 'libcstest.so.1.0'
    as been mapped at 0x7fa25bd000, resulting in traces not being
    collected.
    
    This patch corrects the situation by requesting that address
    filters be updated only if the mapped event is for a code
    segment.
    Signed-off-by: default avatarMathieu Poirier <mathieu.poirier@linaro.org>
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Acked-by: default avatarAlexander Shishkin <alexander.shishkin@linux.intel.com>
    Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
    Cc: Jiri Olsa <jolsa@redhat.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Stephane Eranian <eranian@google.com>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Vince Weaver <vincent.weaver@maine.edu>
    Link: http://lkml.kernel.org/r/1468860187-318-3-git-send-email-mathieu.poirier@linaro.orgSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
    12b40a23
core.c 248 KB