• Frederic Weisbecker's avatar
    perf: Use hot regs with software sched switch/migrate events · e49a5bd3
    Frederic Weisbecker authored
    Scheduler's task migration events don't work because they always
    pass NULL regs perf_sw_event(). The event hence gets filtered
    in perf_swevent_add().
    
    Scheduler's context switches events use task_pt_regs() to get
    the context when the event occured which is a wrong thing to
    do as this won't give us the place in the kernel where we went
    to sleep but the place where we left userspace. The result is
    even more wrong if we switch from a kernel thread.
    
    Use the hot regs snapshot for both events as they belong to the
    non-interrupt/exception based events family. Unlike page faults
    or so that provide the regs matching the exact origin of the event,
    we need to save the current context.
    
    This makes the task migration event working and fix the context
    switch callchains and origin ip.
    
    Example: perf record -a -e cs
    
    Before:
    
        10.91%      ksoftirqd/0                  0  [k] 0000000000000000
                    |
                    --- (nil)
                        perf_callchain
                        perf_prepare_sample
                        __perf_event_overflow
                        perf_swevent_overflow
                        perf_swevent_add
                        perf_swevent_ctx_event
                        do_perf_sw_event
                        __perf_sw_event
                        perf_event_task_sched_out
                        schedule
                        run_ksoftirqd
                        kthread
                        kernel_thread_helper
    
    After:
    
        23.77%  hald-addon-stor  [kernel.kallsyms]  [k] schedule
                |
                --- schedule
                   |
                   |--60.00%-- schedule_timeout
                   |          wait_for_common
                   |          wait_for_completion
                   |          blk_execute_rq
                   |          scsi_execute
                   |          scsi_execute_req
                   |          sr_test_unit_ready
                   |          |
                   |          |--66.67%-- sr_media_change
                   |          |          media_changed
                   |          |          cdrom_media_changed
                   |          |          sr_block_media_changed
                   |          |          check_disk_change
                   |          |          cdrom_open
    
    v2: Always build perf_arch_fetch_caller_regs() now that software
    events need that too. They don't need it from modules, unlike trace
    events, so we keep the EXPORT_SYMBOL in trace_event_perf.c
    Signed-off-by: default avatarFrederic Weisbecker <fweisbec@gmail.com>
    Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
    Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
    Cc: Paul Mackerras <paulus@samba.org>
    Cc: Ingo Molnar <mingo@elte.hu>
    Cc: David Miller <davem@davemloft.net>
    e49a5bd3
perf_event.h 24.8 KB