• N
    perf record: Synthesize COMM event for a command line workload · e803cf97
    Namhyung Kim 提交于
    When perf creates a new child to profile, the events are enabled on
    exec().  And in this case, it doesn't synthesize any event for the
    child since they'll be generated during exec().  But there's an window
    between the enabling and the event generation.
    
    It used to be overcome since samples are only in kernel (so we always
    have the map) and the comm is overridden by a later COMM event.
    However it won't work if events are processed and displayed before the
    COMM event overrides like in 'perf script'.  This leads to those early
    samples (like native_write_msr_safe) not having a comm but pid (like
    ':15328').
    
    So it needs to synthesize COMM event for the child explicitly before
    enabling so that it can have a correct comm.  But at this time, the
    comm will be "perf" since it's not exec-ed yet.
    
    Committer note:
    
    Before this patch:
    
      # perf record usleep 1
      [ perf record: Woken up 1 times to write data ]
      [ perf record: Captured and wrote 0.017 MB perf.data (7 samples) ]
      # perf script --show-task-events
        :4429  4429 27909.079372:          1 cycles:  ffffffff8105f45a native_write_msr_safe (/lib/modules/4.
        :4429  4429 27909.079375:          1 cycles:  ffffffff8105f45a native_write_msr_safe (/lib/modules/4.
        :4429  4429 27909.079376:         10 cycles:  ffffffff8105f45a native_write_msr_safe (/lib/modules/4.
        :4429  4429 27909.079377:        223 cycles:  ffffffff8105f45a native_write_msr_safe (/lib/modules/4.
        :4429  4429 27909.079378:       6571 cycles:  ffffffff8105f45a native_write_msr_safe (/lib/modules/4.
       usleep  4429 27909.079380: PERF_RECORD_COMM exec: usleep:4429/4429
       usleep  4429 27909.079381:     185403 cycles:  ffffffff810a72d3 flush_signal_handlers (/lib/modules/4.
       usleep  4429 27909.079444:    2241110 cycles:      7fc575355be3 _dl_start (/usr/lib64/ld-2.20.so)
       usleep  4429 27909.079875: PERF_RECORD_EXIT(4429:4429):(4429:4429)
    
    After:
    
      # perf record usleep 1
      [ perf record: Woken up 1 times to write data ]
      [ perf record: Captured and wrote 0.017 MB perf.data (7 samples) ]
      # perf script --show-task
         perf     0     0.000000: PERF_RECORD_COMM: perf:8446/8446
         perf  8446 30154.038944:          1 cycles:  ffffffff8105f45a native_write_msr_safe (/lib/modules/4.
         perf  8446 30154.038948:          1 cycles:  ffffffff8105f45a native_write_msr_safe (/lib/modules/4.
         perf  8446 30154.038949:          9 cycles:  ffffffff8105f45a native_write_msr_safe (/lib/modules/4.
         perf  8446 30154.038950:        230 cycles:  ffffffff8105f45a native_write_msr_safe (/lib/modules/4.
         perf  8446 30154.038951:       6772 cycles:  ffffffff8105f45a native_write_msr_safe (/lib/modules/4.
       usleep  8446 30154.038952: PERF_RECORD_COMM exec: usleep:8446/8446
       usleep  8446 30154.038954:     196923 cycles:  ffffffff81766440 _raw_spin_lock (/lib/modules/4.3.0-rc1
       usleep  8446 30154.039021:    2292130 cycles:      7f609a173dc4 memcpy (/usr/lib64/ld-2.20.so)
       usleep  8446 30154.039349: PERF_RECORD_EXIT(8446:8446):(8446:8446)
      #
    Signed-off-by: NNamhyung Kim <namhyung@kernel.org>
    Tested-by: NArnaldo Carvalho de Melo <acme@redhat.com>
    Cc: David Ahern <dsahern@gmail.com>
    Cc: Jiri Olsa <jolsa@redhat.com>
    Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
    Link: http://lkml.kernel.org/r/1442881495-2928-1-git-send-email-namhyung@kernel.orgSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
    e803cf97
builtin-record.c 31.6 KB