diff options
author | Ben Skeggs <bskeggs@redhat.com> | 2013-05-06 19:48:30 -0400 |
---|---|---|
committer | Ben Skeggs <bskeggs@redhat.com> | 2013-06-30 23:50:31 -0400 |
commit | c4c7044ffc1ba973e2ec0f0dc94980b49101d877 (patch) | |
tree | 936ddc8e8ae3b940079e5577a4ad947a90d58343 /drivers/gpu/drm/nouveau/nouveau_gem.c | |
parent | 780194b1b9f5fdbaa06dd71e60b31ceaaedafbe4 (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.c | 41 |
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 | ||
104 | static void | ||
105 | nouveau_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 | |||
113 | static void | ||
114 | nouveau_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 | |||
104 | void | 139 | void |
105 | nouveau_gem_object_close(struct drm_gem_object *gem, struct drm_file *file_priv) | 140 | nouveau_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 | } |