drm/amdgpu: change reset lock from mutex to rw_semaphore
[linux-2.6-microblaze.git] / drivers / gpu / drm / amd / amdgpu / mxgpu_ai.c
index f27d83f..9c07014 100644 (file)
@@ -238,19 +238,15 @@ static void xgpu_ai_mailbox_flr_work(struct work_struct *work)
        struct amdgpu_virt *virt = container_of(work, struct amdgpu_virt, flr_work);
        struct amdgpu_device *adev = container_of(virt, struct amdgpu_device, virt);
        int timeout = AI_MAILBOX_POLL_FLR_TIMEDOUT;
-       int locked;
 
        /* block amdgpu_gpu_recover till msg FLR COMPLETE received,
         * otherwise the mailbox msg will be ruined/reseted by
         * the VF FLR.
-        *
-        * we can unlock the lock_reset to allow "amdgpu_job_timedout"
-        * to run gpu_recover() after FLR_NOTIFICATION_CMPL received
-        * which means host side had finished this VF's FLR.
         */
-       locked = mutex_trylock(&adev->lock_reset);
-       if (locked)
-               atomic_set(&adev->in_gpu_reset, 1);
+       if (!down_read_trylock(&adev->reset_sem))
+               return;
+
+       atomic_set(&adev->in_gpu_reset, 1);
 
        do {
                if (xgpu_ai_mailbox_peek_msg(adev) == IDH_FLR_NOTIFICATION_CMPL)
@@ -261,10 +257,8 @@ static void xgpu_ai_mailbox_flr_work(struct work_struct *work)
        } while (timeout > 1);
 
 flr_done:
-       if (locked) {
-               atomic_set(&adev->in_gpu_reset, 0);
-               mutex_unlock(&adev->lock_reset);
-       }
+       atomic_set(&adev->in_gpu_reset, 0);
+       up_read(&adev->reset_sem);
 
        /* Trigger recovery for world switch failure if no TDR */
        if (amdgpu_device_should_recover_gpu(adev)