mirror of
https://github.com/torvalds/linux.git
synced 2026-05-24 07:03:03 +02:00
drm/amdgpu: fix eviction fence and userq manager shutdown
That is a really complicated dance and wasn't implemented fully correct. Signed-off-by: Christian König <christian.koenig@amd.com> Reviewed-by: Sunil Khatri <sunil.khatri@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
2cd7284ba5
commit
99f30a0607
|
|
@ -2953,6 +2953,8 @@ static int amdgpu_drm_release(struct inode *inode, struct file *filp)
|
|||
|
||||
if (fpriv && drm_dev_enter(dev, &idx)) {
|
||||
amdgpu_evf_mgr_shutdown(&fpriv->evf_mgr);
|
||||
amdgpu_userq_mgr_cancel_resume(&fpriv->userq_mgr);
|
||||
amdgpu_evf_mgr_flush_suspend(&fpriv->evf_mgr);
|
||||
amdgpu_userq_mgr_fini(&fpriv->userq_mgr);
|
||||
amdgpu_evf_mgr_fini(&fpriv->evf_mgr);
|
||||
drm_dev_exit(idx);
|
||||
|
|
|
|||
|
|
@ -143,13 +143,19 @@ void amdgpu_evf_mgr_init(struct amdgpu_eviction_fence_mgr *evf_mgr)
|
|||
void amdgpu_evf_mgr_shutdown(struct amdgpu_eviction_fence_mgr *evf_mgr)
|
||||
{
|
||||
evf_mgr->shutdown = true;
|
||||
/* Make sure that the shutdown is visible to the suspend work */
|
||||
flush_work(&evf_mgr->suspend_work);
|
||||
}
|
||||
|
||||
void amdgpu_evf_mgr_flush_suspend(struct amdgpu_eviction_fence_mgr *evf_mgr)
|
||||
{
|
||||
dma_fence_wait(rcu_dereference_protected(evf_mgr->ev_fence, true),
|
||||
false);
|
||||
/* Make sure that we are done with the last suspend work */
|
||||
flush_work(&evf_mgr->suspend_work);
|
||||
}
|
||||
|
||||
void amdgpu_evf_mgr_fini(struct amdgpu_eviction_fence_mgr *evf_mgr)
|
||||
{
|
||||
dma_fence_wait(rcu_dereference_protected(evf_mgr->ev_fence, true),
|
||||
false);
|
||||
flush_work(&evf_mgr->suspend_work);
|
||||
dma_fence_put(evf_mgr->ev_fence);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -66,6 +66,7 @@ void amdgpu_evf_mgr_detach_fence(struct amdgpu_eviction_fence_mgr *evf_mgr,
|
|||
struct amdgpu_bo *bo);
|
||||
void amdgpu_evf_mgr_init(struct amdgpu_eviction_fence_mgr *evf_mgr);
|
||||
void amdgpu_evf_mgr_shutdown(struct amdgpu_eviction_fence_mgr *evf_mgr);
|
||||
void amdgpu_evf_mgr_flush_suspend(struct amdgpu_eviction_fence_mgr *evf_mgr);
|
||||
void amdgpu_evf_mgr_fini(struct amdgpu_eviction_fence_mgr *evf_mgr);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -1345,6 +1345,11 @@ int amdgpu_userq_mgr_init(struct amdgpu_userq_mgr *userq_mgr, struct drm_file *f
|
|||
return 0;
|
||||
}
|
||||
|
||||
void amdgpu_userq_mgr_cancel_resume(struct amdgpu_userq_mgr *userq_mgr)
|
||||
{
|
||||
cancel_delayed_work_sync(&userq_mgr->resume_work);
|
||||
}
|
||||
|
||||
void amdgpu_userq_mgr_fini(struct amdgpu_userq_mgr *userq_mgr)
|
||||
{
|
||||
struct amdgpu_usermode_queue *queue;
|
||||
|
|
|
|||
|
|
@ -123,6 +123,7 @@ int amdgpu_userq_ioctl(struct drm_device *dev, void *data, struct drm_file *filp
|
|||
int amdgpu_userq_mgr_init(struct amdgpu_userq_mgr *userq_mgr, struct drm_file *file_priv,
|
||||
struct amdgpu_device *adev);
|
||||
|
||||
void amdgpu_userq_mgr_cancel_resume(struct amdgpu_userq_mgr *userq_mgr);
|
||||
void amdgpu_userq_mgr_fini(struct amdgpu_userq_mgr *userq_mgr);
|
||||
|
||||
int amdgpu_userq_create_object(struct amdgpu_userq_mgr *uq_mgr,
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user