aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/drm_gem.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/drm_gem.c')
-rw-r--r--drivers/gpu/drm/drm_gem.c21
1 files changed, 19 insertions, 2 deletions
diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c
index 4012fe423460..7c5b5f78f1fa 100644
--- a/drivers/gpu/drm/drm_gem.c
+++ b/drivers/gpu/drm/drm_gem.c
@@ -211,6 +211,8 @@ drm_gem_handle_delete(struct drm_file *filp, u32 handle)
211 idr_remove(&filp->object_idr, handle); 211 idr_remove(&filp->object_idr, handle);
212 spin_unlock(&filp->table_lock); 212 spin_unlock(&filp->table_lock);
213 213
214 if (dev->driver->gem_close_object)
215 dev->driver->gem_close_object(obj, filp);
214 drm_gem_object_handle_unreference_unlocked(obj); 216 drm_gem_object_handle_unreference_unlocked(obj);
215 217
216 return 0; 218 return 0;
@@ -227,7 +229,8 @@ drm_gem_handle_create(struct drm_file *file_priv,
227 struct drm_gem_object *obj, 229 struct drm_gem_object *obj,
228 u32 *handlep) 230 u32 *handlep)
229{ 231{
230 int ret; 232 struct drm_device *dev = obj->dev;
233 int ret;
231 234
232 /* 235 /*
233 * Get the user-visible handle using idr. 236 * Get the user-visible handle using idr.
@@ -248,6 +251,15 @@ again:
248 return ret; 251 return ret;
249 252
250 drm_gem_object_handle_reference(obj); 253 drm_gem_object_handle_reference(obj);
254
255 if (dev->driver->gem_open_object) {
256 ret = dev->driver->gem_open_object(obj, file_priv);
257 if (ret) {
258 drm_gem_handle_delete(file_priv, *handlep);
259 return ret;
260 }
261 }
262
251 return 0; 263 return 0;
252} 264}
253EXPORT_SYMBOL(drm_gem_handle_create); 265EXPORT_SYMBOL(drm_gem_handle_create);
@@ -402,7 +414,12 @@ drm_gem_open(struct drm_device *dev, struct drm_file *file_private)
402static int 414static int
403drm_gem_object_release_handle(int id, void *ptr, void *data) 415drm_gem_object_release_handle(int id, void *ptr, void *data)
404{ 416{
417 struct drm_file *file_priv = data;
405 struct drm_gem_object *obj = ptr; 418 struct drm_gem_object *obj = ptr;
419 struct drm_device *dev = obj->dev;
420
421 if (dev->driver->gem_close_object)
422 dev->driver->gem_close_object(obj, file_priv);
406 423
407 drm_gem_object_handle_unreference_unlocked(obj); 424 drm_gem_object_handle_unreference_unlocked(obj);
408 425
@@ -418,7 +435,7 @@ void
418drm_gem_release(struct drm_device *dev, struct drm_file *file_private) 435drm_gem_release(struct drm_device *dev, struct drm_file *file_private)
419{ 436{
420 idr_for_each(&file_private->object_idr, 437 idr_for_each(&file_private->object_idr,
421 &drm_gem_object_release_handle, NULL); 438 &drm_gem_object_release_handle, file_private);
422 439
423 idr_remove_all(&file_private->object_idr); 440 idr_remove_all(&file_private->object_idr);
424 idr_destroy(&file_private->object_idr); 441 idr_destroy(&file_private->object_idr);