Maarten, for this and the other patches in this series, I seem to recall we have this discussion before? IIRC I stated that reservation was a too heavy-weight lock to hold to determine whether a buffer was idle? It's a pretty nasty thing to build in. /Thomas On 01/21/2014 02:04 PM, Maarten Lankhorst wrote: > Apart from some code inside ttm itself and nouveau_bo_vma_del, > this is the only place where ttm_bo_wait is used without a reservation. > Fix this so we can remove the fence_lock later on. > > Signed-off-by: Maarten Lankhorst <maarten.lankhorst@xxxxxxxxxxxxx> > --- > drivers/gpu/drm/nouveau/nouveau_gem.c | 22 ++++++++++++++++++---- > 1 file changed, 18 insertions(+), 4 deletions(-) > > diff --git a/drivers/gpu/drm/nouveau/nouveau_gem.c b/drivers/gpu/drm/nouveau/nouveau_gem.c > index 78a27f8ad7d9..24e9c58da8aa 100644 > --- a/drivers/gpu/drm/nouveau/nouveau_gem.c > +++ b/drivers/gpu/drm/nouveau/nouveau_gem.c > @@ -894,17 +894,31 @@ nouveau_gem_ioctl_cpu_prep(struct drm_device *dev, void *data, > struct drm_gem_object *gem; > struct nouveau_bo *nvbo; > bool no_wait = !!(req->flags & NOUVEAU_GEM_CPU_PREP_NOWAIT); > - int ret = -EINVAL; > + int ret; > + struct nouveau_fence *fence = NULL; > > gem = drm_gem_object_lookup(dev, file_priv, req->handle); > if (!gem) > return -ENOENT; > nvbo = nouveau_gem_object(gem); > > - spin_lock(&nvbo->bo.bdev->fence_lock); > - ret = ttm_bo_wait(&nvbo->bo, true, true, no_wait); > - spin_unlock(&nvbo->bo.bdev->fence_lock); > + ret = ttm_bo_reserve(&nvbo->bo, true, false, false, 0); > + if (!ret) { > + spin_lock(&nvbo->bo.bdev->fence_lock); > + ret = ttm_bo_wait(&nvbo->bo, true, true, true); > + if (!no_wait && ret) > + fence = nouveau_fence_ref(nvbo->bo.sync_obj); > + spin_unlock(&nvbo->bo.bdev->fence_lock); > + > + ttm_bo_unreserve(&nvbo->bo); > + } > drm_gem_object_unreference_unlocked(gem); > + > + if (fence) { > + ret = nouveau_fence_wait(fence, true, no_wait); > + nouveau_fence_unref(&fence); > + } > + > return ret; > } > _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/dri-devel