diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c | 23 | 
1 files changed, 16 insertions, 7 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c index 79b397800cbc..cc5c7f81c540 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c @@ -101,14 +101,18 @@ static int amdgpu_debugfs_autodump_open(struct inode *inode, struct file *file)  	file->private_data = adev; -	mutex_lock(&adev->lock_reset); +	ret = down_read_killable(&adev->reset_sem); +	if (ret) +		return ret; +  	if (adev->autodump.dumping.done) {  		reinit_completion(&adev->autodump.dumping);  		ret = 0;  	} else {  		ret = -EBUSY;  	} -	mutex_unlock(&adev->lock_reset); + +	up_read(&adev->reset_sem);  	return ret;  } @@ -1242,7 +1246,9 @@ static int amdgpu_debugfs_test_ib(struct seq_file *m, void *data)  	}  	/* Avoid accidently unparking the sched thread during GPU reset */ -	mutex_lock(&adev->lock_reset); +	r = down_read_killable(&adev->reset_sem); +	if (r) +		return r;  	/* hold on the scheduler */  	for (i = 0; i < AMDGPU_MAX_RINGS; i++) { @@ -1269,7 +1275,7 @@ static int amdgpu_debugfs_test_ib(struct seq_file *m, void *data)  		kthread_unpark(ring->sched.thread);  	} -	mutex_unlock(&adev->lock_reset); +	up_read(&adev->reset_sem);  	pm_runtime_mark_last_busy(dev->dev);  	pm_runtime_put_autosuspend(dev->dev); @@ -1459,7 +1465,9 @@ static int amdgpu_debugfs_ib_preempt(void *data, u64 val)  		return -ENOMEM;  	/* Avoid accidently unparking the sched thread during GPU reset */ -	mutex_lock(&adev->lock_reset); +	r = down_read_killable(&adev->reset_sem); +	if (r) +		goto pro_end;  	/* stop the scheduler */  	kthread_park(ring->sched.thread); @@ -1500,13 +1508,14 @@ failure:  	/* restart the scheduler */  	kthread_unpark(ring->sched.thread); -	mutex_unlock(&adev->lock_reset); +	up_read(&adev->reset_sem);  	ttm_bo_unlock_delayed_workqueue(&adev->mman.bdev, resched); +pro_end:  	kfree(fences); -	return 0; +	return r;  }  static int amdgpu_debugfs_sclk_set(void *data, u64 val) | 
