lkml.org 
[lkml]   [2022]   [Jan]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.16 0823/1039] drm/amdgpu: use spin_lock_irqsave to avoid deadlock by local interrupt
    Date
    From: Guchun Chen <guchun.chen@amd.com>

    [ Upstream commit 2096b74b1da5ca418827b54ac4904493bd9de89c ]

    This is observed in SRIOV case with virtual KMS as display.

    _raw_spin_lock_irqsave+0x37/0x40
    drm_handle_vblank+0x69/0x350 [drm]
    ? try_to_wake_up+0x432/0x5c0
    ? amdgpu_vkms_prepare_fb+0x1c0/0x1c0 [amdgpu]
    drm_crtc_handle_vblank+0x17/0x20 [drm]
    amdgpu_vkms_vblank_simulate+0x4d/0x80 [amdgpu]
    __hrtimer_run_queues+0xfb/0x230
    hrtimer_interrupt+0x109/0x220
    __sysvec_apic_timer_interrupt+0x64/0xe0
    asm_call_irq_on_stack+0x12/0x20

    Fixes: 84ec374bd580 ("drm/amdgpu: create amdgpu_vkms (v4)")
    Signed-off-by: Guchun Chen <guchun.chen@amd.com>
    Acked-by: Alex Deucher <alexander.deucher@amd.com>
    Tested-by: Kelly Zytaruk <kelly.zytaruk@amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/gpu/drm/amd/amdgpu/amdgpu_vkms.c | 5 +++--
    1 file changed, 3 insertions(+), 2 deletions(-)

    diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vkms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vkms.c
    index ac9a8cd21c4b6..7d58bf410be05 100644
    --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vkms.c
    +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vkms.c
    @@ -142,15 +142,16 @@ static void amdgpu_vkms_crtc_atomic_disable(struct drm_crtc *crtc,
    static void amdgpu_vkms_crtc_atomic_flush(struct drm_crtc *crtc,
    struct drm_atomic_state *state)
    {
    + unsigned long flags;
    if (crtc->state->event) {
    - spin_lock(&crtc->dev->event_lock);
    + spin_lock_irqsave(&crtc->dev->event_lock, flags);

    if (drm_crtc_vblank_get(crtc) != 0)
    drm_crtc_send_vblank_event(crtc, crtc->state->event);
    else
    drm_crtc_arm_vblank_event(crtc, crtc->state->event);

    - spin_unlock(&crtc->dev->event_lock);
    + spin_unlock_irqrestore(&crtc->dev->event_lock, flags);

    crtc->state->event = NULL;
    }
    --
    2.34.1


    \
     
     \ /
      Last update: 2022-01-25 00:11    [W:4.122 / U:0.220 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site