diff options
Diffstat (limited to 'drivers/gpu/drm/drm_gem.c')
| -rw-r--r-- | drivers/gpu/drm/drm_gem.c | 21 |
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 | } |
| 253 | EXPORT_SYMBOL(drm_gem_handle_create); | 265 | EXPORT_SYMBOL(drm_gem_handle_create); |
| @@ -402,7 +414,12 @@ drm_gem_open(struct drm_device *dev, struct drm_file *file_private) | |||
| 402 | static int | 414 | static int |
| 403 | drm_gem_object_release_handle(int id, void *ptr, void *data) | 415 | drm_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 | |||
| 418 | drm_gem_release(struct drm_device *dev, struct drm_file *file_private) | 435 | drm_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); |
