nouveau: wait to unref the transfer's bo until it's no longer used
authorIlia Mirkin <imirkin@alum.mit.edu>
Mon, 28 Sep 2015 19:18:08 +0000 (15:18 -0400)
committerIlia Mirkin <imirkin@alum.mit.edu>
Mon, 28 Sep 2015 21:28:54 +0000 (17:28 -0400)
The bo will often come from a slab in which case it doesn't matter. But
for larger allocations this will be in its own bo, and we have to make
sure to wait until it's no longer used in order for it to be freed.

Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
Cc: mesa-stable@lists.freedesktop.org
Tested-by: Marcin Ĺšlusarz <marcin.slusarz@gmail.com>
src/gallium/drivers/nouveau/nouveau_buffer.c

index 310e9dbcfd4dabe554c83876d29f2f0d027fb0d0..72e070b5f06c628aa52e08711d8e09f622210196 100644 (file)
@@ -286,7 +286,8 @@ nouveau_buffer_transfer_del(struct nouveau_context *nv,
 {
    if (tx->map) {
       if (likely(tx->bo)) {
-         nouveau_bo_ref(NULL, &tx->bo);
+         nouveau_fence_work(nv->screen->fence.current,
+                            nouveau_fence_unref_bo, tx->bo);
          if (tx->mm)
             release_allocation(&tx->mm, nv->screen->fence.current);
       } else {
@@ -787,7 +788,7 @@ nouveau_buffer_migrate(struct nouveau_context *nv,
       nv->copy_data(nv, buf->bo, buf->offset, new_domain,
                     bo, offset, old_domain, buf->base.width0);
 
-      nouveau_bo_ref(NULL, &bo);
+      nouveau_fence_work(screen->fence.current, nouveau_fence_unref_bo, bo);
       if (mm)
          release_allocation(&mm, screen->fence.current);
    } else