latencies and code inefficiencies in amdgpu display handling

Lucas Stach dev at lynxeye.de
Tue Mar 24 19:12:00 UTC 2020


Hi guys,

recently I've been tracing some IRQ latencies in a system and the
display handling in amdgpu doesn't really look that good. To be honest
it also doesn't look too bad, but I still want to share my findings
here. The trace below is from a single vblank IRQ with a pageflip.

The most interesting points from my perspective:

1. While this is a single CRTC vblank IRQ, the handler calls
amdgpu_get_vblank_counter_kms 10(!) times. This isn't really a cheap
function as it also reads the current scanout position and thus makes
multiple MMIO device reads.
This seems like low-hanging fruit for optimiaztion, as querying the
same thing this many times in a single IRQ invocation seems like total
overkill.

2. In this particular trace one of the scanout position reads seems to
block. The trace indicates that almost 300us are spent in this single
device read. Is this a known issue?

3. There are quite a few spinlocks being locked with spin_lock_irqsave,
while this handler code is never called from non-IRQ context, so all
those calls could use the cheaper spin_lock. This is a micro
optimization, but it caught my eye when looking over the trace/code.

Regards,
Lucas


# tracer: irqsoff
#
# irqsoff latency trace v1.1.5 on 5.6.0-rc7+
# --------------------------------------------------------------------
# latency: 417 us, #446/446, CPU#6 | (M:desktop VP:0, KP:0, SP:0 HP:0 #P:16)
#    -----------------
#    | task: user-task-0 (uid:1000 nice:0 policy:0 rt_prio:0)
#    -----------------
#  => started at: interrupt_entry
#  => ended at:   swapgs_restore_regs_and_return_to_usermode
#
#
#                  _------=> CPU#            
#                 / _-----=> irqs-off        
#                | / _----=> need-resched    
#                || / _---=> hardirq/softirq 
#                ||| / _--=> preempt-depth   
#                |||| /     delay            
#  cmd     pid   ||||| time  |   caller      
#     \   /      |||||  \    |   /         
  user-task-0    6d...    0us : trace_hardirqs_off_thunk <-interrupt_entry
  user-task-0    6d...    0us : do_IRQ <-ret_from_intr
  user-task-0    6d...    0us : irq_enter <-do_IRQ
  user-task-0    6d...    0us : rcu_irq_enter <-irq_enter
  user-task-0    6d...    0us : irqtime_account_irq <-irq_enter
  user-task-0    6d.h.    1us : handle_edge_irq <-do_IRQ
  user-task-0    6d.h.    1us : _raw_spin_lock <-handle_edge_irq
  user-task-0    6d.h.    1us : irq_may_run <-handle_edge_irq
  user-task-0    6d.h.    1us : irq_chip_ack_parent <-handle_edge_irq
  user-task-0    6d.h.    1us : apic_ack_irq <-handle_edge_irq
  user-task-0    6d.h.    1us : handle_irq_event <-handle_edge_irq
  user-task-0    6d.h.    1us : handle_irq_event_percpu <-handle_irq_event
  user-task-0    6d.h.    1us : __handle_irq_event_percpu <-handle_irq_event_percpu
  user-task-0    6d.h.    1us : amdgpu_irq_handler <-__handle_irq_event_percpu
  user-task-0    6d.h.    2us : amdgpu_ih_process <-amdgpu_irq_handler
  user-task-0    6d.h.    2us : tonga_ih_get_wptr <-amdgpu_ih_process
  user-task-0    6d.h.    2us : __drm_dbg <-amdgpu_ih_process
  user-task-0    6d.h.    2us : amdgpu_irq_dispatch <-amdgpu_ih_process
  user-task-0    6d.h.    2us : tonga_ih_decode_iv <-amdgpu_irq_dispatch
  user-task-0    6d.h.    3us : amdgpu_dm_irq_handler <-amdgpu_irq_dispatch
  user-task-0    6d.h.    3us : dc_interrupt_to_irq_source <-amdgpu_dm_irq_handler
  user-task-0    6d.h.    3us : dal_irq_service_to_irq_source <-amdgpu_dm_irq_handler
  user-task-0    6d.h.    4us : to_dal_irq_source_dce110 <-amdgpu_dm_irq_handler
  user-task-0    6d.h.    4us : dc_interrupt_ack <-amdgpu_dm_irq_handler
  user-task-0    6d.h.    5us : dal_irq_service_ack <-amdgpu_dm_irq_handler
  user-task-0    6d.h.    5us : dal_irq_service_ack_generic <-dal_irq_service_ack
  user-task-0    6d.h.    5us : dm_read_reg_func <-dal_irq_service_ack_generic
  user-task-0    6d.h.    5us : amdgpu_cgs_read_register <-dm_read_reg_func
  user-task-0    6d.h.    6us : amdgpu_mm_rreg <-dm_read_reg_func
  user-task-0    6d.h.    7us : amdgpu_cgs_write_register <-dal_irq_service_ack_generic
  user-task-0    6d.h.    7us : amdgpu_mm_wreg <-dal_irq_service_ack_generic
  user-task-0    6d.h.    7us : _raw_spin_lock_irqsave <-amdgpu_dm_irq_handler
  user-task-0    6d.h.    8us : dm_crtc_high_irq <-amdgpu_dm_irq_handler
  user-task-0    6d.h.    8us : get_crtc_by_otg_inst.isra.0 <-dm_crtc_high_irq
  user-task-0    6d.h.    8us : __drm_dbg <-dm_crtc_high_irq
  user-task-0    6d.h.    8us : drm_crtc_handle_vblank <-dm_crtc_high_irq
  user-task-0    6d.h.    9us : drm_handle_vblank <-dm_crtc_high_irq
  user-task-0    6d.h.    9us : _raw_spin_lock_irqsave <-drm_handle_vblank
  user-task-0    6d.h.    9us : _raw_spin_lock <-drm_handle_vblank
  user-task-0    6d.h.    9us : drm_update_vblank_count <-drm_handle_vblank
  user-task-0    6d.h.    9us : __get_vblank_counter <-drm_update_vblank_count
  user-task-0    6d.h.   10us : drm_crtc_from_index <-__get_vblank_counter
  user-task-0    6d.h.   10us : amdgpu_get_vblank_counter_kms <-drm_update_vblank_count
  user-task-0    6d.h.   10us : dm_vblank_get_counter <-amdgpu_get_vblank_counter_kms
  user-task-0    6d.h.   10us : dc_stream_get_vblank_counter <-amdgpu_get_vblank_counter_kms
  user-task-0    6d.h.   11us : dce110_timing_generator_get_vblank_counter <-amdgpu_get_vblank_counter_kms
  user-task-0    6d.h.   11us : dm_read_reg_func <-dce110_timing_generator_get_vblank_counter
  user-task-0    6d.h.   11us : amdgpu_cgs_read_register <-dm_read_reg_func
  user-task-0    6d.h.   11us : amdgpu_mm_rreg <-dm_read_reg_func
  user-task-0    6d.h.   12us : amdgpu_display_get_crtc_scanoutpos <-amdgpu_get_vblank_counter_kms
  user-task-0    6d.h.   12us : dm_crtc_get_scanoutpos <-amdgpu_display_get_crtc_scanoutpos
  user-task-0    6d.h.   12us : dc_stream_get_scanoutpos <-dm_crtc_get_scanoutpos
  user-task-0    6d.h.   12us : dce110_timing_generator_get_crtc_scanoutpos <-dc_stream_get_scanoutpos
  user-task-0    6d.h.   13us : dm_read_reg_func <-dce110_timing_generator_get_crtc_scanoutpos
  user-task-0    6d.h.   13us : amdgpu_cgs_read_register <-dm_read_reg_func
  user-task-0    6d.h.   13us : amdgpu_mm_rreg <-dm_read_reg_func
  user-task-0    6d.h.   14us : dce110_timing_generator_get_position <-dce110_timing_generator_get_crtc_scanoutpos
  user-task-0    6d.h.   14us : dm_read_reg_func <-dce110_timing_generator_get_position
  user-task-0    6d.h.   14us : amdgpu_cgs_read_register <-dm_read_reg_func
  user-task-0    6d.h.   14us : amdgpu_mm_rreg <-dm_read_reg_func
  user-task-0    6d.h.   15us : dm_read_reg_func <-dce110_timing_generator_get_position
  user-task-0    6d.h.   15us : amdgpu_cgs_read_register <-dm_read_reg_func
  user-task-0    6d.h.   15us : amdgpu_mm_rreg <-dm_read_reg_func
  user-task-0    6d.h.   16us : dm_vblank_get_counter <-amdgpu_get_vblank_counter_kms
  user-task-0    6d.h.   16us : dc_stream_get_vblank_counter <-amdgpu_get_vblank_counter_kms
  user-task-0    6d.h.   16us : dce110_timing_generator_get_vblank_counter <-amdgpu_get_vblank_counter_kms
  user-task-0    6d.h.   17us : dm_read_reg_func <-dce110_timing_generator_get_vblank_counter
  user-task-0    6d.h.   17us : amdgpu_cgs_read_register <-dm_read_reg_func
  user-task-0    6d.h.   17us : amdgpu_mm_rreg <-dm_read_reg_func
  user-task-0    6d.h.   18us : __drm_dbg <-amdgpu_get_vblank_counter_kms
  user-task-0    6d.h.   18us : drm_get_last_vbltimestamp <-drm_update_vblank_count
  user-task-0    6d.h.   19us : drm_calc_vbltimestamp_from_scanoutpos <-drm_get_last_vbltimestamp
  user-task-0    6d.h.   19us : drm_crtc_from_index <-drm_calc_vbltimestamp_from_scanoutpos
  user-task-0    6d.h.   19us : amdgpu_get_crtc_scanout_position <-drm_calc_vbltimestamp_from_scanoutpos
  user-task-0    6d.h.   19us : amdgpu_display_get_crtc_scanoutpos <-amdgpu_get_crtc_scanout_position
  user-task-0    6d.h.   20us : ktime_get <-amdgpu_display_get_crtc_scanoutpos
  user-task-0    6d.h.   20us : dm_crtc_get_scanoutpos <-amdgpu_display_get_crtc_scanoutpos
  user-task-0    6d.h.   20us : dc_stream_get_scanoutpos <-dm_crtc_get_scanoutpos
  user-task-0    6d.h.   20us : dce110_timing_generator_get_crtc_scanoutpos <-dc_stream_get_scanoutpos
  user-task-0    6d.h.   21us : dm_read_reg_func <-dce110_timing_generator_get_crtc_scanoutpos
  user-task-0    6d.h.   21us : amdgpu_cgs_read_register <-dm_read_reg_func
  user-task-0    6d.h.   21us!: amdgpu_mm_rreg <-dm_read_reg_func
  user-task-0    6d.h.  307us : dce110_timing_generator_get_position <-dce110_timing_generator_get_crtc_scanoutpos
  user-task-0    6d.h.  307us : dm_read_reg_func <-dce110_timing_generator_get_position
  user-task-0    6d.h.  307us : amdgpu_cgs_read_register <-dm_read_reg_func
  user-task-0    6d.h.  307us : amdgpu_mm_rreg <-dm_read_reg_func
  user-task-0    6d.h.  309us : dm_read_reg_func <-dce110_timing_generator_get_position
  user-task-0    6d.h.  309us : amdgpu_cgs_read_register <-dm_read_reg_func
  user-task-0    6d.h.  310us : amdgpu_mm_rreg <-dm_read_reg_func
  user-task-0    6d.h.  311us : ktime_get <-amdgpu_display_get_crtc_scanoutpos
  user-task-0    6d.h.  311us : amdgpu_get_crtc_scanout_position <-drm_calc_vbltimestamp_from_scanoutpos
  user-task-0    6d.h.  311us : amdgpu_display_get_crtc_scanoutpos <-amdgpu_get_crtc_scanout_position
  user-task-0    6d.h.  311us : ktime_get <-amdgpu_display_get_crtc_scanoutpos
  user-task-0    6d.h.  312us : dm_crtc_get_scanoutpos <-amdgpu_display_get_crtc_scanoutpos
  user-task-0    6d.h.  312us : dc_stream_get_scanoutpos <-dm_crtc_get_scanoutpos
  user-task-0    6d.h.  312us : dce110_timing_generator_get_crtc_scanoutpos <-dc_stream_get_scanoutpos
  user-task-0    6d.h.  312us : dm_read_reg_func <-dce110_timing_generator_get_crtc_scanoutpos
  user-task-0    6d.h.  312us : amdgpu_cgs_read_register <-dm_read_reg_func
  user-task-0    6d.h.  313us : amdgpu_mm_rreg <-dm_read_reg_func
  user-task-0    6d.h.  314us : dce110_timing_generator_get_position <-dce110_timing_generator_get_crtc_scanoutpos
  user-task-0    6d.h.  314us : dm_read_reg_func <-dce110_timing_generator_get_position
  user-task-0    6d.h.  314us : amdgpu_cgs_read_register <-dm_read_reg_func
  user-task-0    6d.h.  314us : amdgpu_mm_rreg <-dm_read_reg_func
  user-task-0    6d.h.  315us : dm_read_reg_func <-dce110_timing_generator_get_position
  user-task-0    6d.h.  315us : amdgpu_cgs_read_register <-dm_read_reg_func
  user-task-0    6d.h.  315us : amdgpu_mm_rreg <-dm_read_reg_func
  user-task-0    6d.h.  316us : ktime_get <-amdgpu_display_get_crtc_scanoutpos
  user-task-0    6d.h.  317us : __get_vblank_counter <-drm_update_vblank_count
  user-task-0    6d.h.  317us : drm_crtc_from_index <-__get_vblank_counter
  user-task-0    6d.h.  317us : amdgpu_get_vblank_counter_kms <-drm_update_vblank_count
  user-task-0    6d.h.  317us : dm_vblank_get_counter <-amdgpu_get_vblank_counter_kms
  user-task-0    6d.h.  317us : dc_stream_get_vblank_counter <-amdgpu_get_vblank_counter_kms
  user-task-0    6d.h.  318us : dce110_timing_generator_get_vblank_counter <-amdgpu_get_vblank_counter_kms
  user-task-0    6d.h.  318us : dm_read_reg_func <-dce110_timing_generator_get_vblank_counter
  user-task-0    6d.h.  318us : amdgpu_cgs_read_register <-dm_read_reg_func
  user-task-0    6d.h.  318us : amdgpu_mm_rreg <-dm_read_reg_func
  user-task-0    6d.h.  319us : amdgpu_display_get_crtc_scanoutpos <-amdgpu_get_vblank_counter_kms
  user-task-0    6d.h.  319us : dm_crtc_get_scanoutpos <-amdgpu_display_get_crtc_scanoutpos
  user-task-0    6d.h.  320us : dc_stream_get_scanoutpos <-dm_crtc_get_scanoutpos
  user-task-0    6d.h.  320us : dce110_timing_generator_get_crtc_scanoutpos <-dc_stream_get_scanoutpos
  user-task-0    6d.h.  320us : dm_read_reg_func <-dce110_timing_generator_get_crtc_scanoutpos
  user-task-0    6d.h.  320us : amdgpu_cgs_read_register <-dm_read_reg_func
  user-task-0    6d.h.  320us : amdgpu_mm_rreg <-dm_read_reg_func
  user-task-0    6d.h.  321us : dce110_timing_generator_get_position <-dce110_timing_generator_get_crtc_scanoutpos
  user-task-0    6d.h.  321us : dm_read_reg_func <-dce110_timing_generator_get_position
  user-task-0    6d.h.  322us : amdgpu_cgs_read_register <-dm_read_reg_func
  user-task-0    6d.h.  322us : amdgpu_mm_rreg <-dm_read_reg_func
  user-task-0    6d.h.  323us : dm_read_reg_func <-dce110_timing_generator_get_position
  user-task-0    6d.h.  323us : amdgpu_cgs_read_register <-dm_read_reg_func
  user-task-0    6d.h.  323us : amdgpu_mm_rreg <-dm_read_reg_func
  user-task-0    6d.h.  324us : dm_vblank_get_counter <-amdgpu_get_vblank_counter_kms
  user-task-0    6d.h.  324us : dc_stream_get_vblank_counter <-amdgpu_get_vblank_counter_kms
  user-task-0    6d.h.  325us : dce110_timing_generator_get_vblank_counter <-amdgpu_get_vblank_counter_kms
  user-task-0    6d.h.  325us : dm_read_reg_func <-dce110_timing_generator_get_vblank_counter
  user-task-0    6d.h.  325us : amdgpu_cgs_read_register <-dm_read_reg_func
  user-task-0    6d.h.  325us : amdgpu_mm_rreg <-dm_read_reg_func
  user-task-0    6d.h.  326us : __drm_dbg <-amdgpu_get_vblank_counter_kms
  user-task-0    6d.h.  326us : __drm_dbg <-drm_update_vblank_count
  user-task-0    6d.h.  327us : store_vblank <-drm_update_vblank_count
  user-task-0    6d.h.  327us : _raw_spin_lock <-store_vblank
  user-task-0    6d.h.  327us : __wake_up <-drm_handle_vblank
  user-task-0    6d.h.  328us : __wake_up_common_lock <-drm_handle_vblank
  user-task-0    6d.h.  328us : _raw_spin_lock_irqsave <-__wake_up_common_lock
  user-task-0    6d.h.  328us : __wake_up_common <-__wake_up_common_lock
  user-task-0    6d.h.  328us : _raw_spin_unlock_irqrestore <-__wake_up_common_lock
  user-task-0    6d.h.  328us : drm_vblank_count_and_time.isra.0 <-drm_handle_vblank
  user-task-0    6d.h.  328us : _raw_spin_unlock_irqrestore <-drm_handle_vblank
  user-task-0    6d.h.  329us : amdgpu_dm_crtc_handle_crc_irq <-dm_crtc_high_irq
  user-task-0    6d.h.  329us : _raw_spin_unlock_irqrestore <-amdgpu_dm_irq_handler
  user-task-0    6d.h.  329us : _raw_spin_lock_irqsave <-amdgpu_dm_irq_handler
  user-task-0    6d.h.  329us : _raw_spin_unlock_irqrestore <-amdgpu_dm_irq_handler
  user-task-0    6d.h.  330us : amdgpu_amdkfd_interrupt <-amdgpu_irq_dispatch
  user-task-0    6d.h.  330us : kgd2kfd_interrupt <-amdgpu_irq_dispatch
  user-task-0    6d.h.  330us : _raw_spin_lock_irqsave <-kgd2kfd_interrupt
  user-task-0    6d.h.  330us : interrupt_is_wanted <-kgd2kfd_interrupt
  user-task-0    6d.h.  330us : cik_event_interrupt_isr <-kgd2kfd_interrupt
  user-task-0    6d.h.  331us : _raw_spin_unlock_irqrestore <-kgd2kfd_interrupt
  user-task-0    6d.h.  331us : amdgpu_irq_dispatch <-amdgpu_ih_process
  user-task-0    6d.h.  331us : tonga_ih_decode_iv <-amdgpu_irq_dispatch
  user-task-0    6d.h.  331us : amdgpu_dm_irq_handler <-amdgpu_irq_dispatch
  user-task-0    6d.h.  332us : dc_interrupt_to_irq_source <-amdgpu_dm_irq_handler
  user-task-0    6d.h.  332us : dal_irq_service_to_irq_source <-amdgpu_dm_irq_handler
  user-task-0    6d.h.  332us : to_dal_irq_source_dce110 <-amdgpu_dm_irq_handler
  user-task-0    6d.h.  332us : dc_interrupt_ack <-amdgpu_dm_irq_handler
  user-task-0    6d.h.  332us : dal_irq_service_ack <-amdgpu_dm_irq_handler
  user-task-0    6d.h.  333us : dal_irq_service_ack_generic <-dal_irq_service_ack
  user-task-0    6d.h.  333us : dm_read_reg_func <-dal_irq_service_ack_generic
  user-task-0    6d.h.  333us : amdgpu_cgs_read_register <-dm_read_reg_func
  user-task-0    6d.h.  333us : amdgpu_mm_rreg <-dm_read_reg_func
  user-task-0    6d.h.  334us : amdgpu_cgs_write_register <-dal_irq_service_ack_generic
  user-task-0    6d.h.  334us : amdgpu_mm_wreg <-dal_irq_service_ack_generic
  user-task-0    6d.h.  335us : _raw_spin_lock_irqsave <-amdgpu_dm_irq_handler
  user-task-0    6d.h.  335us : dm_pflip_high_irq <-amdgpu_dm_irq_handler
  user-task-0    6d.h.  335us : get_crtc_by_otg_inst.isra.0 <-dm_pflip_high_irq
  user-task-0    6d.h.  336us : _raw_spin_lock_irqsave <-dm_pflip_high_irq
  user-task-0    6d.h.  336us : drm_crtc_accurate_vblank_count <-dm_pflip_high_irq
  user-task-0    6d.h.  336us : _raw_spin_lock_irqsave <-drm_crtc_accurate_vblank_count
  user-task-0    6d.h.  337us : drm_update_vblank_count <-drm_crtc_accurate_vblank_count
  user-task-0    6d.h.  337us : __get_vblank_counter <-drm_update_vblank_count
  user-task-0    6d.h.  337us : drm_crtc_from_index <-__get_vblank_counter
  user-task-0    6d.h.  337us : amdgpu_get_vblank_counter_kms <-drm_update_vblank_count
  user-task-0    6d.h.  337us : dm_vblank_get_counter <-amdgpu_get_vblank_counter_kms
  user-task-0    6d.h.  338us : dc_stream_get_vblank_counter <-amdgpu_get_vblank_counter_kms
  user-task-0    6d.h.  338us : dce110_timing_generator_get_vblank_counter <-amdgpu_get_vblank_counter_kms
  user-task-0    6d.h.  338us : dm_read_reg_func <-dce110_timing_generator_get_vblank_counter
  user-task-0    6d.h.  338us : amdgpu_cgs_read_register <-dm_read_reg_func
  user-task-0    6d.h.  338us : amdgpu_mm_rreg <-dm_read_reg_func
  user-task-0    6d.h.  339us : amdgpu_display_get_crtc_scanoutpos <-amdgpu_get_vblank_counter_kms
  user-task-0    6d.h.  340us : dm_crtc_get_scanoutpos <-amdgpu_display_get_crtc_scanoutpos
  user-task-0    6d.h.  340us : dc_stream_get_scanoutpos <-dm_crtc_get_scanoutpos
  user-task-0    6d.h.  340us : dce110_timing_generator_get_crtc_scanoutpos <-dc_stream_get_scanoutpos
  user-task-0    6d.h.  340us : dm_read_reg_func <-dce110_timing_generator_get_crtc_scanoutpos
  user-task-0    6d.h.  340us : amdgpu_cgs_read_register <-dm_read_reg_func
  user-task-0    6d.h.  340us : amdgpu_mm_rreg <-dm_read_reg_func
  user-task-0    6d.h.  341us : dce110_timing_generator_get_position <-dce110_timing_generator_get_crtc_scanoutpos
  user-task-0    6d.h.  342us : dm_read_reg_func <-dce110_timing_generator_get_position
  user-task-0    6d.h.  342us : amdgpu_cgs_read_register <-dm_read_reg_func
  user-task-0    6d.h.  342us : amdgpu_mm_rreg <-dm_read_reg_func
  user-task-0    6d.h.  343us : dm_read_reg_func <-dce110_timing_generator_get_position
  user-task-0    6d.h.  343us : amdgpu_cgs_read_register <-dm_read_reg_func
  user-task-0    6d.h.  343us : amdgpu_mm_rreg <-dm_read_reg_func
  user-task-0    6d.h.  344us : dm_vblank_get_counter <-amdgpu_get_vblank_counter_kms
  user-task-0    6d.h.  345us : dc_stream_get_vblank_counter <-amdgpu_get_vblank_counter_kms
  user-task-0    6d.h.  345us : dce110_timing_generator_get_vblank_counter <-amdgpu_get_vblank_counter_kms
  user-task-0    6d.h.  345us : dm_read_reg_func <-dce110_timing_generator_get_vblank_counter
  user-task-0    6d.h.  345us : amdgpu_cgs_read_register <-dm_read_reg_func
  user-task-0    6d.h.  345us : amdgpu_mm_rreg <-dm_read_reg_func
  user-task-0    6d.h.  346us : __drm_dbg <-amdgpu_get_vblank_counter_kms
  user-task-0    6d.h.  346us : drm_get_last_vbltimestamp <-drm_update_vblank_count
  user-task-0    6d.h.  347us : drm_calc_vbltimestamp_from_scanoutpos <-drm_get_last_vbltimestamp
  user-task-0    6d.h.  347us : drm_crtc_from_index <-drm_calc_vbltimestamp_from_scanoutpos
  user-task-0    6d.h.  347us : amdgpu_get_crtc_scanout_position <-drm_calc_vbltimestamp_from_scanoutpos
  user-task-0    6d.h.  347us : amdgpu_display_get_crtc_scanoutpos <-amdgpu_get_crtc_scanout_position
  user-task-0    6d.h.  347us : ktime_get <-amdgpu_display_get_crtc_scanoutpos
  user-task-0    6d.h.  348us : dm_crtc_get_scanoutpos <-amdgpu_display_get_crtc_scanoutpos
  user-task-0    6d.h.  348us : dc_stream_get_scanoutpos <-dm_crtc_get_scanoutpos
  user-task-0    6d.h.  348us : dce110_timing_generator_get_crtc_scanoutpos <-dc_stream_get_scanoutpos
  user-task-0    6d.h.  348us : dm_read_reg_func <-dce110_timing_generator_get_crtc_scanoutpos
  user-task-0    6d.h.  348us : amdgpu_cgs_read_register <-dm_read_reg_func
  user-task-0    6d.h.  349us : amdgpu_mm_rreg <-dm_read_reg_func
  user-task-0    6d.h.  349us : dce110_timing_generator_get_position <-dce110_timing_generator_get_crtc_scanoutpos
  user-task-0    6d.h.  350us : dm_read_reg_func <-dce110_timing_generator_get_position
  user-task-0    6d.h.  350us : amdgpu_cgs_read_register <-dm_read_reg_func
  user-task-0    6d.h.  350us : amdgpu_mm_rreg <-dm_read_reg_func
  user-task-0    6d.h.  351us : dm_read_reg_func <-dce110_timing_generator_get_position
  user-task-0    6d.h.  351us : amdgpu_cgs_read_register <-dm_read_reg_func
  user-task-0    6d.h.  351us : amdgpu_mm_rreg <-dm_read_reg_func
  user-task-0    6d.h.  352us : ktime_get <-amdgpu_display_get_crtc_scanoutpos
  user-task-0    6d.h.  353us : __get_vblank_counter <-drm_update_vblank_count
  user-task-0    6d.h.  353us : drm_crtc_from_index <-__get_vblank_counter
  user-task-0    6d.h.  353us : amdgpu_get_vblank_counter_kms <-drm_update_vblank_count
  user-task-0    6d.h.  353us : dm_vblank_get_counter <-amdgpu_get_vblank_counter_kms
  user-task-0    6d.h.  353us : dc_stream_get_vblank_counter <-amdgpu_get_vblank_counter_kms
  user-task-0    6d.h.  354us : dce110_timing_generator_get_vblank_counter <-amdgpu_get_vblank_counter_kms
  user-task-0    6d.h.  354us : dm_read_reg_func <-dce110_timing_generator_get_vblank_counter
  user-task-0    6d.h.  354us : amdgpu_cgs_read_register <-dm_read_reg_func
  user-task-0    6d.h.  354us : amdgpu_mm_rreg <-dm_read_reg_func
  user-task-0    6d.h.  355us : amdgpu_display_get_crtc_scanoutpos <-amdgpu_get_vblank_counter_kms
  user-task-0    6d.h.  355us : dm_crtc_get_scanoutpos <-amdgpu_display_get_crtc_scanoutpos
  user-task-0    6d.h.  356us : dc_stream_get_scanoutpos <-dm_crtc_get_scanoutpos
  user-task-0    6d.h.  356us : dce110_timing_generator_get_crtc_scanoutpos <-dc_stream_get_scanoutpos
  user-task-0    6d.h.  356us : dm_read_reg_func <-dce110_timing_generator_get_crtc_scanoutpos
  user-task-0    6d.h.  356us : amdgpu_cgs_read_register <-dm_read_reg_func
  user-task-0    6d.h.  356us : amdgpu_mm_rreg <-dm_read_reg_func
  user-task-0    6d.h.  357us : dce110_timing_generator_get_position <-dce110_timing_generator_get_crtc_scanoutpos
  user-task-0    6d.h.  357us : dm_read_reg_func <-dce110_timing_generator_get_position
  user-task-0    6d.h.  358us : amdgpu_cgs_read_register <-dm_read_reg_func
  user-task-0    6d.h.  358us : amdgpu_mm_rreg <-dm_read_reg_func
  user-task-0    6d.h.  359us : dm_read_reg_func <-dce110_timing_generator_get_position
  user-task-0    6d.h.  359us : amdgpu_cgs_read_register <-dm_read_reg_func
  user-task-0    6d.h.  359us : amdgpu_mm_rreg <-dm_read_reg_func
  user-task-0    6d.h.  360us : dm_vblank_get_counter <-amdgpu_get_vblank_counter_kms
  user-task-0    6d.h.  360us : dc_stream_get_vblank_counter <-amdgpu_get_vblank_counter_kms
  user-task-0    6d.h.  361us : dce110_timing_generator_get_vblank_counter <-amdgpu_get_vblank_counter_kms
  user-task-0    6d.h.  361us : dm_read_reg_func <-dce110_timing_generator_get_vblank_counter
  user-task-0    6d.h.  361us : amdgpu_cgs_read_register <-dm_read_reg_func
  user-task-0    6d.h.  361us : amdgpu_mm_rreg <-dm_read_reg_func
  user-task-0    6d.h.  362us : __drm_dbg <-amdgpu_get_vblank_counter_kms
  user-task-0    6d.h.  362us : __drm_dbg <-drm_update_vblank_count
  user-task-0    6d.h.  362us : _raw_spin_unlock_irqrestore <-drm_crtc_accurate_vblank_count
  user-task-0    6d.h.  363us : drm_crtc_send_vblank_event <-dm_pflip_high_irq
  user-task-0    6d.h.  363us : drm_vblank_count_and_time.isra.0 <-drm_crtc_send_vblank_event
  user-task-0    6d.h.  363us : send_vblank_event <-drm_crtc_send_vblank_event
  user-task-0    6d.h.  363us : ns_to_timespec64 <-send_vblank_event
  user-task-0    6d.h.  364us : drm_send_event_locked <-drm_crtc_send_vblank_event
  user-task-0    6d.h.  364us : complete_all <-drm_send_event_locked
  user-task-0    6d.h.  364us : _raw_spin_lock_irqsave <-complete_all
  user-task-0    6d.h.  365us : __wake_up_locked <-complete_all
  user-task-0    6d.h.  365us : __wake_up_common <-complete_all
  user-task-0    6d.h.  365us : default_wake_function <-__wake_up_common
  user-task-0    6d.h.  365us : try_to_wake_up <-__wake_up_common
  user-task-0    6d.h.  366us : _raw_spin_lock_irqsave <-try_to_wake_up
  user-task-0    6d.h.  366us : select_task_rq_fair <-try_to_wake_up
  user-task-0    6d.h.  366us : select_idle_sibling <-select_task_rq_fair
  user-task-0    6d.h.  366us : available_idle_cpu <-select_idle_sibling
  user-task-0    6d.h.  367us : cpus_share_cache <-select_idle_sibling
  user-task-0    6d.h.  367us : available_idle_cpu <-select_idle_sibling
  user-task-0    6d.h.  367us : set_task_cpu <-try_to_wake_up
  user-task-0    6d.h.  368us : migrate_task_rq_fair <-set_task_cpu
  user-task-0    6d.h.  368us : remove_entity_load_avg <-migrate_task_rq_fair
  user-task-0    6d.h.  368us : __update_load_avg_blocked_se <-remove_entity_load_avg
  user-task-0    6d.h.  368us : _raw_spin_lock_irqsave <-remove_entity_load_avg
  user-task-0    6d.h.  369us : _raw_spin_unlock_irqrestore <-migrate_task_rq_fair
  user-task-0    6d.h.  369us : set_task_rq_fair <-set_task_cpu
  user-task-0    6d.h.  369us : _raw_spin_lock <-try_to_wake_up
  user-task-0    6d.h.  370us : update_rq_clock <-try_to_wake_up
  user-task-0    6d.h.  370us : ttwu_do_activate <-try_to_wake_up
  user-task-0    6d.h.  370us : activate_task <-ttwu_do_activate
  user-task-0    6d.h.  371us : psi_task_change <-activate_task
  user-task-0    6d.h.  371us : record_times <-psi_task_change
  user-task-0    6d.h.  371us : enqueue_task_fair <-activate_task
  user-task-0    6d.h.  372us : enqueue_entity <-enqueue_task_fair
  user-task-0    6d.h.  372us : update_curr <-enqueue_entity
  user-task-0    6d.h.  372us : __update_load_avg_cfs_rq <-update_load_avg
  user-task-0    6d.h.  373us : attach_entity_load_avg <-update_load_avg
  user-task-0    6d.h.  373us : dbs_update_util_handler <-attach_entity_load_avg
  user-task-0    6d.h.  373us : cpufreq_this_cpu_can_update <-dbs_update_util_handler
  user-task-0    6d.h.  374us : update_cfs_group <-enqueue_entity
  user-task-0    6d.h.  374us : account_entity_enqueue <-enqueue_entity
  user-task-0    6d.h.  374us : place_entity <-enqueue_entity
  user-task-0    6d.h.  375us : __enqueue_entity <-enqueue_entity
  user-task-0    6d.h.  375us : hrtick_update <-activate_task
  user-task-0    6d.h.  375us : ttwu_do_wakeup <-try_to_wake_up
  user-task-0    6d.h.  375us : check_preempt_curr <-ttwu_do_wakeup
  user-task-0    6d.h.  375us : resched_curr <-check_preempt_curr
  user-task-0    6d.h.  376us : native_smp_send_reschedule <-check_preempt_curr
  user-task-0    6d.h.  376us : default_send_IPI_single_phys <-check_preempt_curr
  user-task-0    6d.h.  376us : __default_send_IPI_dest_field <-default_send_IPI_single_phys
  user-task-0    6d.h.  377us : _raw_spin_unlock_irqrestore <-try_to_wake_up
  user-task-0    6d.h.  377us : _raw_spin_unlock_irqrestore <-drm_send_event_locked
  user-task-0    6d.h.  377us : release_crtc_commit <-drm_send_event_locked
  user-task-0    6d.h.  377us : __wake_up <-drm_crtc_send_vblank_event
  user-task-0    6d.h.  378us : __wake_up_common_lock <-drm_crtc_send_vblank_event
  user-task-0    6d.h.  378us : _raw_spin_lock_irqsave <-__wake_up_common_lock
  user-task-0    6d.h.  378us : __wake_up_common <-__wake_up_common_lock
  user-task-0    6d.h.  378us : ep_poll_callback <-__wake_up_common
  user-task-0    6d.h.  379us : _raw_read_lock_irqsave <-ep_poll_callback
  user-task-0    6d.h.  379us : __wake_up <-ep_poll_callback
  user-task-0    6d.h.  380us : __wake_up_common_lock <-ep_poll_callback
  user-task-0    6d.h.  380us : _raw_spin_lock_irqsave <-__wake_up_common_lock
  user-task-0    6d.h.  380us : __wake_up_common <-__wake_up_common_lock
  user-task-0    6d.h.  381us : default_wake_function <-__wake_up_common
  user-task-0    6d.h.  381us : try_to_wake_up <-__wake_up_common
  user-task-0    6d.h.  381us : _raw_spin_lock_irqsave <-try_to_wake_up
  user-task-0    6d.h.  382us : select_task_rq_fair <-try_to_wake_up
  user-task-0    6d.h.  382us : available_idle_cpu <-select_task_rq_fair
  user-task-0    6d.h.  382us : update_cfs_rq_h_load <-select_task_rq_fair
  user-task-0    6d.h.  383us : select_idle_sibling <-select_task_rq_fair
  user-task-0    6d.h.  383us : available_idle_cpu <-select_idle_sibling
  user-task-0    6d.h.  383us : cpus_share_cache <-select_idle_sibling
  user-task-0    6d.h.  383us : available_idle_cpu <-select_idle_sibling
  user-task-0    6d.h.  384us : available_idle_cpu <-select_idle_sibling
  user-task-0    6d.h.  384us : available_idle_cpu <-select_idle_sibling
  user-task-0    6d.h.  385us : available_idle_cpu <-select_idle_sibling
  user-task-0    6d.h.  385us : available_idle_cpu <-select_idle_sibling
  user-task-0    6d.h.  386us : available_idle_cpu <-select_idle_sibling
  user-task-0    6d.h.  386us : available_idle_cpu <-select_idle_sibling
  user-task-0    6d.h.  386us : set_task_cpu <-try_to_wake_up
  user-task-0    6d.h.  387us : migrate_task_rq_fair <-set_task_cpu
  user-task-0    6d.h.  387us : remove_entity_load_avg <-migrate_task_rq_fair
  user-task-0    6d.h.  387us : __update_load_avg_blocked_se <-remove_entity_load_avg
  user-task-0    6d.h.  387us : _raw_spin_lock_irqsave <-remove_entity_load_avg
  user-task-0    6d.h.  387us : _raw_spin_unlock_irqrestore <-migrate_task_rq_fair
  user-task-0    6d.h.  388us : set_task_rq_fair <-set_task_cpu
  user-task-0    6d.h.  388us : _raw_spin_lock <-try_to_wake_up
  user-task-0    6d.h.  388us : update_rq_clock <-try_to_wake_up
  user-task-0    6d.h.  389us : ttwu_do_activate <-try_to_wake_up
  user-task-0    6d.h.  389us : activate_task <-ttwu_do_activate
  user-task-0    6d.h.  389us : psi_task_change <-activate_task
  user-task-0    6d.h.  391us : record_times <-psi_task_change
  user-task-0    6d.h.  391us : record_times <-psi_task_change
  user-task-0    6d.h.  391us : enqueue_task_fair <-activate_task
  user-task-0    6d.h.  392us : enqueue_entity <-enqueue_task_fair
  user-task-0    6d.h.  392us : update_curr <-enqueue_entity
  user-task-0    6d.h.  392us : __update_load_avg_cfs_rq <-update_load_avg
  user-task-0    6d.h.  393us : attach_entity_load_avg <-update_load_avg
  user-task-0    6d.h.  393us : update_cfs_group <-enqueue_entity
  user-task-0    6d.h.  393us : account_entity_enqueue <-enqueue_entity
  user-task-0    6d.h.  393us : place_entity <-enqueue_entity
  user-task-0    6d.h.  394us : __enqueue_entity <-enqueue_entity
  user-task-0    6d.h.  394us : enqueue_entity <-enqueue_task_fair
  user-task-0    6d.h.  394us : update_curr <-enqueue_entity
  user-task-0    6d.h.  395us : __update_load_avg_se <-update_load_avg
  user-task-0    6d.h.  395us : __update_load_avg_cfs_rq <-update_load_avg
  user-task-0    6d.h.  396us : dbs_update_util_handler <-update_load_avg
  user-task-0    6d.h.  396us : cpufreq_this_cpu_can_update <-dbs_update_util_handler
  user-task-0    6d.h.  396us : update_cfs_group <-enqueue_entity
  user-task-0    6d.h.  396us : reweight_entity <-enqueue_entity
  user-task-0    6d.h.  397us : account_entity_enqueue <-enqueue_entity
  user-task-0    6d.h.  397us : place_entity <-enqueue_entity
  user-task-0    6d.h.  397us : __enqueue_entity <-enqueue_entity
  user-task-0    6d.h.  397us : hrtick_update <-activate_task
  user-task-0    6d.h.  398us : ttwu_do_wakeup <-try_to_wake_up
  user-task-0    6d.h.  398us : check_preempt_curr <-ttwu_do_wakeup
  user-task-0    6d.h.  398us : resched_curr <-check_preempt_curr
  user-task-0    6d.h.  399us : native_smp_send_reschedule <-check_preempt_curr
  user-task-0    6d.h.  399us : default_send_IPI_single_phys <-check_preempt_curr
  user-task-0    6d.h.  399us : __default_send_IPI_dest_field <-default_send_IPI_single_phys
  user-task-0    6d.h.  400us : _raw_spin_unlock_irqrestore <-try_to_wake_up
  user-task-0    6d.h.  400us : _raw_spin_unlock_irqrestore <-__wake_up_common_lock
  user-task-0    6d.h.  400us : _raw_read_unlock_irqrestore <-ep_poll_callback
  user-task-0    6d.h.  400us : _raw_spin_unlock_irqrestore <-__wake_up_common_lock
  user-task-0    6d.h.  401us : drm_crtc_vblank_put <-dm_pflip_high_irq
  user-task-0    6d.h.  401us : drm_vblank_put <-dm_pflip_high_irq
  user-task-0    6d.h.  401us : mod_timer <-dm_pflip_high_irq
  user-task-0    6d.h.  401us : lock_timer_base <-mod_timer
  user-task-0    6d.h.  401us : _raw_spin_lock_irqsave <-lock_timer_base
  user-task-0    6d.h.  402us : calc_wheel_index <-mod_timer
  user-task-0    6d.h.  402us : detach_if_pending <-mod_timer
  user-task-0    6d.h.  402us : get_nohz_timer_target <-mod_timer
  user-task-0    6d.h.  403us : enqueue_timer <-mod_timer
  user-task-0    6d.h.  403us : trigger_dyntick_cpu.isra.0 <-mod_timer
  user-task-0    6d.h.  403us : _raw_spin_unlock_irqrestore <-mod_timer
  user-task-0    6d.h.  403us : amdgpu_get_vblank_counter_kms <-dm_pflip_high_irq
  user-task-0    6d.h.  403us : dm_vblank_get_counter <-amdgpu_get_vblank_counter_kms
  user-task-0    6d.h.  403us : dc_stream_get_vblank_counter <-amdgpu_get_vblank_counter_kms
  user-task-0    6d.h.  404us : dce110_timing_generator_get_vblank_counter <-amdgpu_get_vblank_counter_kms
  user-task-0    6d.h.  404us : dm_read_reg_func <-dce110_timing_generator_get_vblank_counter
  user-task-0    6d.h.  404us : amdgpu_cgs_read_register <-dm_read_reg_func
  user-task-0    6d.h.  404us : amdgpu_mm_rreg <-dm_read_reg_func
  user-task-0    6d.h.  405us : amdgpu_display_get_crtc_scanoutpos <-amdgpu_get_vblank_counter_kms
  user-task-0    6d.h.  405us : dm_crtc_get_scanoutpos <-amdgpu_display_get_crtc_scanoutpos
  user-task-0    6d.h.  406us : dc_stream_get_scanoutpos <-dm_crtc_get_scanoutpos
  user-task-0    6d.h.  406us : dce110_timing_generator_get_crtc_scanoutpos <-dc_stream_get_scanoutpos
  user-task-0    6d.h.  406us : dm_read_reg_func <-dce110_timing_generator_get_crtc_scanoutpos
  user-task-0    6d.h.  406us : amdgpu_cgs_read_register <-dm_read_reg_func
  user-task-0    6d.h.  406us : amdgpu_mm_rreg <-dm_read_reg_func
  user-task-0    6d.h.  407us : dce110_timing_generator_get_position <-dce110_timing_generator_get_crtc_scanoutpos
  user-task-0    6d.h.  408us : dm_read_reg_func <-dce110_timing_generator_get_position
  user-task-0    6d.h.  408us : amdgpu_cgs_read_register <-dm_read_reg_func
  user-task-0    6d.h.  408us : amdgpu_mm_rreg <-dm_read_reg_func
  user-task-0    6d.h.  409us : dm_read_reg_func <-dce110_timing_generator_get_position
  user-task-0    6d.h.  409us : amdgpu_cgs_read_register <-dm_read_reg_func
  user-task-0    6d.h.  409us : amdgpu_mm_rreg <-dm_read_reg_func
  user-task-0    6d.h.  410us : dm_vblank_get_counter <-amdgpu_get_vblank_counter_kms
  user-task-0    6d.h.  410us : dc_stream_get_vblank_counter <-amdgpu_get_vblank_counter_kms
  user-task-0    6d.h.  411us : dce110_timing_generator_get_vblank_counter <-amdgpu_get_vblank_counter_kms
  user-task-0    6d.h.  411us : dm_read_reg_func <-dce110_timing_generator_get_vblank_counter
  user-task-0    6d.h.  411us : amdgpu_cgs_read_register <-dm_read_reg_func
  user-task-0    6d.h.  411us : amdgpu_mm_rreg <-dm_read_reg_func
  user-task-0    6d.h.  412us : __drm_dbg <-amdgpu_get_vblank_counter_kms
  user-task-0    6d.h.  412us : _raw_spin_unlock_irqrestore <-dm_pflip_high_irq
  user-task-0    6d.h.  413us : __drm_dbg <-dm_pflip_high_irq
  user-task-0    6d.h.  413us : _raw_spin_unlock_irqrestore <-amdgpu_dm_irq_handler
  user-task-0    6d.h.  413us : _raw_spin_lock_irqsave <-amdgpu_dm_irq_handler
  user-task-0    6d.h.  413us : _raw_spin_unlock_irqrestore <-amdgpu_dm_irq_handler
  user-task-0    6d.h.  413us : amdgpu_amdkfd_interrupt <-amdgpu_irq_dispatch
  user-task-0    6d.h.  414us : kgd2kfd_interrupt <-amdgpu_irq_dispatch
  user-task-0    6d.h.  414us : _raw_spin_lock_irqsave <-kgd2kfd_interrupt
  user-task-0    6d.h.  414us : interrupt_is_wanted <-kgd2kfd_interrupt
  user-task-0    6d.h.  414us : cik_event_interrupt_isr <-kgd2kfd_interrupt
  user-task-0    6d.h.  414us : _raw_spin_unlock_irqrestore <-kgd2kfd_interrupt
  user-task-0    6d.h.  415us : tonga_ih_set_rptr <-amdgpu_ih_process
  user-task-0    6d.h.  415us : amdgpu_mm_wdoorbell <-amdgpu_ih_process
  user-task-0    6d.h.  415us : tonga_ih_get_wptr <-amdgpu_ih_process
  user-task-0    6d.h.  415us : ktime_get_mono_fast_ns <-amdgpu_irq_handler
  user-task-0    6d.h.  416us : add_interrupt_randomness <-handle_irq_event_percpu
  user-task-0    6d.h.  416us : note_interrupt <-handle_irq_event_percpu
  user-task-0    6d.h.  416us : _raw_spin_lock <-handle_irq_event
  user-task-0    6d.h.  417us : irq_exit <-do_IRQ
  user-task-0    6d.h.  417us : irqtime_account_irq <-irq_exit
  user-task-0    6d...  417us : idle_cpu <-irq_exit
  user-task-0    6d...  417us : rcu_irq_exit <-irq_exit
  user-task-0    6d...  417us : trace_hardirqs_on_thunk <-swapgs_restore_regs_and_return_to_usermode
  user-task-0    6d...  418us+: tracer_hardirqs_on <-swapgs_restore_regs_and_return_to_usermode
  user-task-0    6d...  431us : <stack trace>



More information about the dri-devel mailing list