diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c | 53 | 
1 files changed, 48 insertions, 5 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c index c3c1a714b06a..d2e59aecb3eb 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c @@ -77,7 +77,7 @@ out_err:  }  static int -amdgpu_userq_unmap_helper(struct amdgpu_userq_mgr *uq_mgr, +amdgpu_userq_preempt_helper(struct amdgpu_userq_mgr *uq_mgr,  			  struct amdgpu_usermode_queue *queue)  {  	struct amdgpu_device *adev = uq_mgr->adev; @@ -86,6 +86,49 @@ amdgpu_userq_unmap_helper(struct amdgpu_userq_mgr *uq_mgr,  	int r = 0;  	if (queue->state == AMDGPU_USERQ_STATE_MAPPED) { +		r = userq_funcs->preempt(uq_mgr, queue); +		if (r) { +			queue->state = AMDGPU_USERQ_STATE_HUNG; +		} else { +			queue->state = AMDGPU_USERQ_STATE_PREEMPTED; +		} +	} + +	return r; +} + +static int +amdgpu_userq_restore_helper(struct amdgpu_userq_mgr *uq_mgr, +			struct amdgpu_usermode_queue *queue) +{ +	struct amdgpu_device *adev = uq_mgr->adev; +	const struct amdgpu_userq_funcs *userq_funcs = +		adev->userq_funcs[queue->queue_type]; +	int r = 0; + +	if (queue->state == AMDGPU_USERQ_STATE_PREEMPTED) { +		r = userq_funcs->restore(uq_mgr, queue); +		if (r) { +			queue->state = AMDGPU_USERQ_STATE_HUNG; +		} else { +			queue->state = AMDGPU_USERQ_STATE_MAPPED; +		} +	} + +	return r; +} + +static int +amdgpu_userq_unmap_helper(struct amdgpu_userq_mgr *uq_mgr, +			  struct amdgpu_usermode_queue *queue) +{ +	struct amdgpu_device *adev = uq_mgr->adev; +	const struct amdgpu_userq_funcs *userq_funcs = +		adev->userq_funcs[queue->queue_type]; +	int r = 0; + +	if ((queue->state == AMDGPU_USERQ_STATE_MAPPED) || +		(queue->state == AMDGPU_USERQ_STATE_PREEMPTED)) {  		r = userq_funcs->unmap(uq_mgr, queue);  		if (r)  			queue->state = AMDGPU_USERQ_STATE_HUNG; @@ -653,7 +696,7 @@ amdgpu_userq_restore_all(struct amdgpu_userq_mgr *uq_mgr)  	/* Resume all the queues for this process */  	idr_for_each_entry(&uq_mgr->userq_idr, queue, queue_id) { -		r = amdgpu_userq_map_helper(uq_mgr, queue); +		r = amdgpu_userq_restore_helper(uq_mgr, queue);  		if (r)  			ret = r;  	} @@ -810,7 +853,7 @@ amdgpu_userq_evict_all(struct amdgpu_userq_mgr *uq_mgr)  	/* Try to unmap all the queues in this process ctx */  	idr_for_each_entry(&uq_mgr->userq_idr, queue, queue_id) { -		r = amdgpu_userq_unmap_helper(uq_mgr, queue); +		r = amdgpu_userq_preempt_helper(uq_mgr, queue);  		if (r)  			ret = r;  	} @@ -995,7 +1038,7 @@ int amdgpu_userq_stop_sched_for_enforce_isolation(struct amdgpu_device *adev,  			if (((queue->queue_type == AMDGPU_HW_IP_GFX) ||  			     (queue->queue_type == AMDGPU_HW_IP_COMPUTE)) &&  			    (queue->xcp_id == idx)) { -				r = amdgpu_userq_unmap_helper(uqm, queue); +				r = amdgpu_userq_preempt_helper(uqm, queue);  				if (r)  					ret = r;  			} @@ -1029,7 +1072,7 @@ int amdgpu_userq_start_sched_for_enforce_isolation(struct amdgpu_device *adev,  			if (((queue->queue_type == AMDGPU_HW_IP_GFX) ||  			     (queue->queue_type == AMDGPU_HW_IP_COMPUTE)) &&  			    (queue->xcp_id == idx)) { -				r = amdgpu_userq_map_helper(uqm, queue); +				r = amdgpu_userq_restore_helper(uqm, queue);  				if (r)  					ret = r;  			} | 
