diff options
| author | Jack Xiao <Jack.Xiao@amd.com> | 2020-03-27 15:10:55 +0800 | 
|---|---|---|
| committer | Alex Deucher <alexander.deucher@amd.com> | 2022-05-04 10:43:51 -0400 | 
| commit | 063a38d6628e7c91e808cab8f83384c51cb5c853 (patch) | |
| tree | 37b39fb977c0dccce5f4baeede1e97bf4503b15a /drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c | |
| parent | 48dcd2b751d3e3f4a46447263817b3b4b15c2328 (diff) | |
drm/amdgpu/mes: implement destroying mes process
Destroy the mes process, which free resources of the process.
Signed-off-by: Jack Xiao <Jack.Xiao@amd.com>
Acked-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Hawking Zhang <Hawking.Zhang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c | 58 | 
1 files changed, 58 insertions, 0 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c index 55005a594be1..05e27636ce20 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c @@ -291,3 +291,61 @@ clean_up_memory:  	mutex_unlock(&adev->mes.mutex);  	return r;  } + +void amdgpu_mes_destroy_process(struct amdgpu_device *adev, int pasid) +{ +	struct amdgpu_mes_process *process; +	struct amdgpu_mes_gang *gang, *tmp1; +	struct amdgpu_mes_queue *queue, *tmp2; +	struct mes_remove_queue_input queue_input; +	unsigned long flags; +	int r; + +	mutex_lock(&adev->mes.mutex); + +	process = idr_find(&adev->mes.pasid_idr, pasid); +	if (!process) { +		DRM_WARN("pasid %d doesn't exist\n", pasid); +		mutex_unlock(&adev->mes.mutex); +		return; +	} + +	/* free all gangs in the process */ +	list_for_each_entry_safe(gang, tmp1, &process->gang_list, list) { +		/* free all queues in the gang */ +		list_for_each_entry_safe(queue, tmp2, &gang->queue_list, list) { +			spin_lock_irqsave(&adev->mes.queue_id_lock, flags); +			idr_remove(&adev->mes.queue_id_idr, queue->queue_id); +			spin_unlock_irqrestore(&adev->mes.queue_id_lock, flags); + +			queue_input.doorbell_offset = queue->doorbell_off; +			queue_input.gang_context_addr = gang->gang_ctx_gpu_addr; + +			r = adev->mes.funcs->remove_hw_queue(&adev->mes, +							     &queue_input); +			if (r) +				DRM_WARN("failed to remove hardware queue\n"); + +			list_del(&queue->list); +			kfree(queue); +		} + +		idr_remove(&adev->mes.gang_id_idr, gang->gang_id); +		amdgpu_bo_free_kernel(&gang->gang_ctx_bo, +				      &gang->gang_ctx_gpu_addr, +				      &gang->gang_ctx_cpu_ptr); +		list_del(&gang->list); +		kfree(gang); +	} + +	amdgpu_mes_free_process_doorbells(adev, process); + +	idr_remove(&adev->mes.pasid_idr, pasid); +	amdgpu_bo_free_kernel(&process->proc_ctx_bo, +			      &process->proc_ctx_gpu_addr, +			      &process->proc_ctx_cpu_ptr); +	kfree(process->doorbell_bitmap); +	kfree(process); + +	mutex_unlock(&adev->mes.mutex); +} | 
