[PATCH] drm/amdgpu: Attach exclusive fence to prime exported bo's. (v3)

Michel Dänzer michel at daenzer.net
Mon Nov 7 03:29:12 UTC 2016


On 07/11/16 11:47 AM, Mario Kleiner wrote:
> External clients which import our bo's wait only
> for exclusive dmabuf-fences, not on shared ones,
> so attach fences on exported buffers as exclusive
> ones, if the buffers get imported by an external
> client.
> 
> See discussion in thread:
> https://lists.freedesktop.org/archives/dri-devel/2016-October/122370.html
> 
> Tested on Intel iGPU + AMD Tonga dGPU as DRI3/Present
> Prime render offload, and with the Tonga standalone as
> primary gpu.
> 
> v2: Add a wait for all shared fences before prime export,
>     as suggested by Christian Koenig.
> 
> v3: - Mark buffer prime_exported in amdgpu_gem_prime_pin,
>     so we only use the exclusive fence when exporting a
>     bo to external clients like a separate iGPU, but not
>     when exporting/importing from/to ourselves as part of
>     regular DRI3 fd passing.
> 
>     - Propagate failure of reservation_object_wait_rcu back
>     to caller.
> 
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=95472
> (v1) Tested-by: Mike Lothian <mike at fireburn.co.uk>

FWIW, I think the (v1) is usually added at the end of the line, not at
the beginning.

[...]

> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c
> index 7700dc2..c4494d0 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c
> @@ -81,6 +81,20 @@ int amdgpu_gem_prime_pin(struct drm_gem_object *obj)
>  {
>  	struct amdgpu_bo *bo = gem_to_amdgpu_bo(obj);
>  	int ret = 0;
> +	long lret;
> +
> +	/*
> +	 * Wait for all shared fences to complete before we switch to future
> +	 * use of exclusive fence on this prime_exported bo.
> +	 */
> +	lret = reservation_object_wait_timeout_rcu(bo->tbo.resv, true, false,
> +						   MAX_SCHEDULE_TIMEOUT);
> +	if (unlikely(lret < 0)) {
> +		DRM_DEBUG_PRIME("Fence wait failed: %li\n", lret);
> +		return lret;
> +	}
> +
> +	bo->prime_exported = true;

We should probably clear bo->prime_exported in amdgpu_gem_prime_unpin.

Also, I think we should set bo->prime_exported (prime_shared?) in
amdgpu_gem_prime_import_sg_table as well, so that we'll also set
exclusive fences on BOs imported from other GPUs.


-- 
Earthling Michel Dänzer               |               http://www.amd.com
Libre software enthusiast             |             Mesa and X developer


More information about the dri-devel mailing list