drm/amdgpu:add lock_reset for SRIOV
authorMonk Liu <Monk.Liu@amd.com>
Wed, 25 Jan 2017 07:48:01 +0000 (15:48 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 30 Mar 2017 03:52:46 +0000 (23:52 -0400)
this lock is used for sriov_gpu_reset, only get this mutex
can run into sriov_gpu_reset.

we have couple source triggers gpu_reset for SRIOV:
1) submit timedout and trigger reset voluntarily
2) invalid instruction detected by ENGINE and trigger reset voluntarily
2) hypervisor found world switch hang and trigger flr and notify guest to
   do reset.

all need take care and we need a mutex to protect the consistency of
reset routine.

Signed-off-by: Monk Liu <Monk.Liu@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c
drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h

index 66cdd89982c9593384360d6d891f52bbd7740d87..94547bd3bfce508d080c6b77728c1ecf6127b079 100644 (file)
@@ -2351,6 +2351,7 @@ int amdgpu_sriov_gpu_reset(struct amdgpu_device *adev, bool voluntary)
        struct amdgpu_ring *ring;
        struct dma_fence *fence = NULL, *next = NULL;
 
+       mutex_lock(&adev->virt.lock_reset);
        atomic_inc(&adev->gpu_reset_counter);
 
        /* block TTM */
@@ -2436,6 +2437,7 @@ int amdgpu_sriov_gpu_reset(struct amdgpu_device *adev, bool voluntary)
                dev_info(adev->dev, "GPU reset failed\n");
        }
 
+       mutex_unlock(&adev->virt.lock_reset);
        return r;
 }
 
index 1fc48e1690ffcd95d31883339ee7073181c41c16..2feb9aa3b1f4d322d952c40559523e472a7e592d 100644 (file)
@@ -98,6 +98,7 @@ void amdgpu_virt_init_setting(struct amdgpu_device *adev)
        adev->enable_virtual_display = true;
 
        mutex_init(&adev->virt.lock_kiq);
+       mutex_init(&adev->virt.lock_reset);
 }
 
 uint32_t amdgpu_virt_kiq_rreg(struct amdgpu_device *adev, uint32_t reg)
index 7020ff22b9b5f158cf8020fa961b6ce6298bea66..4b05568bff009255d311f233be6928183e2877a0 100644 (file)
@@ -47,6 +47,7 @@ struct amdgpu_virt {
        bool chained_ib_support;
        uint32_t                        reg_val_offs;
        struct mutex                    lock_kiq;
+       struct mutex                    lock_reset;
        struct amdgpu_irq_src           ack_irq;
        struct amdgpu_irq_src           rcv_irq;
        struct delayed_work             flr_work;