[PATCH 4/6] drm/amdgpu: use drm_exec for GEM and CSA handling

Tatsuyuki Ishi ishitatsuyuki at gmail.com
Thu Jun 29 08:20:10 UTC 2023


On 6/28/23 19:44, Christian König wrote:

> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
> index 74055cba3dc9..6811fc866494 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
> @@ -728,36 +723,37 @@ int amdgpu_gem_va_ioctl(struct drm_device *dev, void *data,
>   		return -EINVAL;
>   	}
>   
> -	INIT_LIST_HEAD(&list);
> -	INIT_LIST_HEAD(&duplicates);
>   	if ((args->operation != AMDGPU_VA_OP_CLEAR) &&
>   	    !(args->flags & AMDGPU_VM_PAGE_PRT)) {
>   		gobj = drm_gem_object_lookup(filp, args->handle);
>   		if (gobj == NULL)
>   			return -ENOENT;
>   		abo = gem_to_amdgpu_bo(gobj);
> -		tv.bo = &abo->tbo;
> -		if (abo->flags & AMDGPU_GEM_CREATE_VM_ALWAYS_VALID)
> -			tv.num_shared = 1;
> -		else
> -			tv.num_shared = 0;
> -		list_add(&tv.head, &list);
>   	} else {
>   		gobj = NULL;
>   		abo = NULL;
>   	}
>   
> -	amdgpu_vm_get_pd_bo(&fpriv->vm, &list, &vm_pd);
> +	drm_exec_init(&exec, DRM_EXEC_INTERRUPTIBLE_WAIT);

Sorry, I missed this last time, but this needs to allow duplicates as well or mapping
always_valid BOs doesn't work.

> +	drm_exec_until_all_locked(&exec) {
> +		if (gobj) {
> +			r = drm_exec_lock_obj(&exec, gobj);
> +			drm_exec_retry_on_contention(&exec);
> +			if (unlikely(r))
> +				goto error;
> +		}
>   
> -	r = ttm_eu_reserve_buffers(&ticket, &list, true, &duplicates);
> -	if (r)
> -		goto error_unref;
> +		r = amdgpu_vm_lock_pd(&fpriv->vm, &exec, 2);
> +		drm_exec_retry_on_contention(&exec);
> +		if (unlikely(r))
> +			goto error;
> +	}
>   
>   	if (abo) {
>   		bo_va = amdgpu_vm_bo_find(&fpriv->vm, abo);
>   		if (!bo_va) {
>   			r = -ENOENT;
> -			goto error_backoff;
> +			goto error;
>   		}
>   	} else if (args->operation != AMDGPU_VA_OP_CLEAR) {
>   		bo_va = fpriv->prt_va;
> @@ -794,10 +790,8 @@ int amdgpu_gem_va_ioctl(struct drm_device *dev, void *data,
>   		amdgpu_gem_va_update_vm(adev, &fpriv->vm, bo_va,
>   					args->operation);
>   
> -error_backoff:
> -	ttm_eu_backoff_reservation(&ticket, &list);
> -
> -error_unref:
> +error:
> +	drm_exec_fini(&exec);
>   	drm_gem_object_put(gobj);
>   	return r;
>   }


More information about the amd-gfx mailing list