aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/nouveau/nouveau_gem.c
diff options
context:
space:
mode:
authorBen Skeggs <bskeggs@redhat.com>2013-05-06 19:48:30 -0400
committerBen Skeggs <bskeggs@redhat.com>2013-06-30 23:50:31 -0400
commitc4c7044ffc1ba973e2ec0f0dc94980b49101d877 (patch)
tree936ddc8e8ae3b940079e5577a4ad947a90d58343 /drivers/gpu/drm/nouveau/nouveau_gem.c
parent780194b1b9f5fdbaa06dd71e60b31ceaaedafbe4 (diff)
drm/nouveau: delay busy bo vma removal until fence signals
As opposed to an explicit wait. Allows userspace to not stall waiting on buffer deletion. Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/nouveau/nouveau_gem.c')
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_gem.c41
1 files changed, 37 insertions, 4 deletions
diff --git a/drivers/gpu/drm/nouveau/nouveau_gem.c b/drivers/gpu/drm/nouveau/nouveau_gem.c
index b4b4d0c1f4af..c0e324b557c1 100644
--- a/drivers/gpu/drm/nouveau/nouveau_gem.c
+++ b/drivers/gpu/drm/nouveau/nouveau_gem.c
@@ -101,6 +101,41 @@ out:
101 return ret; 101 return ret;
102} 102}
103 103
104static void
105nouveau_gem_object_delete(void *data)
106{
107 struct nouveau_vma *vma = data;
108 nouveau_vm_unmap(vma);
109 nouveau_vm_put(vma);
110 kfree(vma);
111}
112
113static void
114nouveau_gem_object_unmap(struct nouveau_bo *nvbo, struct nouveau_vma *vma)
115{
116 const bool mapped = nvbo->bo.mem.mem_type != TTM_PL_SYSTEM;
117 struct nouveau_fence *fence = NULL;
118
119 list_del(&vma->head);
120
121 if (mapped) {
122 spin_lock(&nvbo->bo.bdev->fence_lock);
123 if (nvbo->bo.sync_obj)
124 fence = nouveau_fence_ref(nvbo->bo.sync_obj);
125 spin_unlock(&nvbo->bo.bdev->fence_lock);
126 }
127
128 if (fence) {
129 nouveau_fence_work(fence, nouveau_gem_object_delete, vma);
130 } else {
131 if (mapped)
132 nouveau_vm_unmap(vma);
133 nouveau_vm_put(vma);
134 kfree(vma);
135 }
136 nouveau_fence_unref(&fence);
137}
138
104void 139void
105nouveau_gem_object_close(struct drm_gem_object *gem, struct drm_file *file_priv) 140nouveau_gem_object_close(struct drm_gem_object *gem, struct drm_file *file_priv)
106{ 141{
@@ -118,10 +153,8 @@ nouveau_gem_object_close(struct drm_gem_object *gem, struct drm_file *file_priv)
118 153
119 vma = nouveau_bo_vma_find(nvbo, cli->base.vm); 154 vma = nouveau_bo_vma_find(nvbo, cli->base.vm);
120 if (vma) { 155 if (vma) {
121 if (--vma->refcount == 0) { 156 if (--vma->refcount == 0)
122 nouveau_bo_vma_del(nvbo, vma); 157 nouveau_gem_object_unmap(nvbo, vma);
123 kfree(vma);
124 }
125 } 158 }
126 ttm_bo_unreserve(&nvbo->bo); 159 ttm_bo_unreserve(&nvbo->bo);
127} 160}