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