@@ -212,6 +212,35 @@ void drm_gem_private_object_fini(struct drm_gem_object *obj)
212212}
213213EXPORT_SYMBOL (drm_gem_private_object_fini );
214214
215+ static void drm_gem_object_handle_get (struct drm_gem_object * obj )
216+ {
217+ struct drm_device * dev = obj -> dev ;
218+
219+ drm_WARN_ON (dev , !mutex_is_locked (& dev -> object_name_lock ));
220+
221+ if (obj -> handle_count ++ == 0 )
222+ drm_gem_object_get (obj );
223+ }
224+
225+ /**
226+ * drm_gem_object_handle_get_unlocked - acquire reference on user-space handles
227+ * @obj: GEM object
228+ *
229+ * Acquires a reference on the GEM buffer object's handle. Required
230+ * to keep the GEM object alive. Call drm_gem_object_handle_put_unlocked()
231+ * to release the reference.
232+ */
233+ void drm_gem_object_handle_get_unlocked (struct drm_gem_object * obj )
234+ {
235+ struct drm_device * dev = obj -> dev ;
236+
237+ guard (mutex )(& dev -> object_name_lock );
238+
239+ drm_WARN_ON (dev , !obj -> handle_count ); /* first ref taken in create-tail helper */
240+ drm_gem_object_handle_get (obj );
241+ }
242+ EXPORT_SYMBOL (drm_gem_object_handle_get_unlocked );
243+
215244/**
216245 * drm_gem_object_handle_free - release resources bound to userspace handles
217246 * @obj: GEM object to clean up.
@@ -242,8 +271,14 @@ static void drm_gem_object_exported_dma_buf_free(struct drm_gem_object *obj)
242271 }
243272}
244273
245- static void
246- drm_gem_object_handle_put_unlocked (struct drm_gem_object * obj )
274+ /**
275+ * drm_gem_object_handle_put_unlocked - releases reference on user-space handles
276+ * @obj: GEM object
277+ *
278+ * Releases a reference on the GEM buffer object's handle. Possibly releases
279+ * the GEM buffer object and associated dma-buf objects.
280+ */
281+ void drm_gem_object_handle_put_unlocked (struct drm_gem_object * obj )
247282{
248283 struct drm_device * dev = obj -> dev ;
249284 bool final = false;
@@ -268,6 +303,7 @@ drm_gem_object_handle_put_unlocked(struct drm_gem_object *obj)
268303 if (final )
269304 drm_gem_object_put (obj );
270305}
306+ EXPORT_SYMBOL (drm_gem_object_handle_put_unlocked );
271307
272308/*
273309 * Called at device or object close to release the file's
@@ -389,8 +425,8 @@ drm_gem_handle_create_tail(struct drm_file *file_priv,
389425 int ret ;
390426
391427 WARN_ON (!mutex_is_locked (& dev -> object_name_lock ));
392- if ( obj -> handle_count ++ == 0 )
393- drm_gem_object_get (obj );
428+
429+ drm_gem_object_handle_get (obj );
394430
395431 /*
396432 * Get the user-visible handle using idr. Preload and perform
0 commit comments