@@ -275,7 +275,8 @@ EXPORT_SYMBOL(drm_get_format_name);
275
275
static int drm_mode_object_get_reg (struct drm_device * dev ,
276
276
struct drm_mode_object * obj ,
277
277
uint32_t obj_type ,
278
- bool register_obj )
278
+ bool register_obj ,
279
+ void (* obj_free_cb )(struct kref * kref ))
279
280
{
280
281
int ret ;
281
282
@@ -288,6 +289,10 @@ static int drm_mode_object_get_reg(struct drm_device *dev,
288
289
*/
289
290
obj -> id = ret ;
290
291
obj -> type = obj_type ;
292
+ if (obj_free_cb ) {
293
+ obj -> free_cb = obj_free_cb ;
294
+ kref_init (& obj -> refcount );
295
+ }
291
296
}
292
297
mutex_unlock (& dev -> mode_config .idr_mutex );
293
298
@@ -311,7 +316,7 @@ static int drm_mode_object_get_reg(struct drm_device *dev,
311
316
int drm_mode_object_get (struct drm_device * dev ,
312
317
struct drm_mode_object * obj , uint32_t obj_type )
313
318
{
314
- return drm_mode_object_get_reg (dev , obj , obj_type , true);
319
+ return drm_mode_object_get_reg (dev , obj , obj_type , true, NULL );
315
320
}
316
321
317
322
static void drm_mode_object_register (struct drm_device * dev ,
@@ -389,10 +394,35 @@ struct drm_mode_object *drm_mode_object_find(struct drm_device *dev,
389
394
}
390
395
EXPORT_SYMBOL (drm_mode_object_find );
391
396
397
+ void drm_mode_object_unreference (struct drm_mode_object * obj )
398
+ {
399
+ if (obj -> free_cb ) {
400
+ DRM_DEBUG ("OBJ ID: %d (%d)\n" , obj -> id , atomic_read (& obj -> refcount .refcount ));
401
+ kref_put (& obj -> refcount , obj -> free_cb );
402
+ }
403
+ }
404
+ EXPORT_SYMBOL (drm_mode_object_unreference );
405
+
406
+ /**
407
+ * drm_mode_object_reference - incr the fb refcnt
408
+ * @obj: mode_object
409
+ *
410
+ * This function operates only on refcounted objects.
411
+ * This functions increments the object's refcount.
412
+ */
413
+ void drm_mode_object_reference (struct drm_mode_object * obj )
414
+ {
415
+ if (obj -> free_cb ) {
416
+ DRM_DEBUG ("OBJ ID: %d (%d)\n" , obj -> id , atomic_read (& obj -> refcount .refcount ));
417
+ kref_get (& obj -> refcount );
418
+ }
419
+ }
420
+ EXPORT_SYMBOL (drm_mode_object_reference );
421
+
392
422
static void drm_framebuffer_free (struct kref * kref )
393
423
{
394
424
struct drm_framebuffer * fb =
395
- container_of (kref , struct drm_framebuffer , refcount );
425
+ container_of (kref , struct drm_framebuffer , base . refcount );
396
426
struct drm_device * dev = fb -> dev ;
397
427
398
428
/*
@@ -430,12 +460,12 @@ int drm_framebuffer_init(struct drm_device *dev, struct drm_framebuffer *fb,
430
460
int ret ;
431
461
432
462
mutex_lock (& dev -> mode_config .fb_lock );
433
- kref_init (& fb -> refcount );
434
463
INIT_LIST_HEAD (& fb -> filp_head );
435
464
fb -> dev = dev ;
436
465
fb -> funcs = funcs ;
437
466
438
- ret = drm_mode_object_get (dev , & fb -> base , DRM_MODE_OBJECT_FB );
467
+ ret = drm_mode_object_get_reg (dev , & fb -> base , DRM_MODE_OBJECT_FB ,
468
+ true, drm_framebuffer_free );
439
469
if (ret )
440
470
goto out ;
441
471
@@ -482,7 +512,7 @@ struct drm_framebuffer *drm_framebuffer_lookup(struct drm_device *dev,
482
512
mutex_lock (& dev -> mode_config .fb_lock );
483
513
fb = __drm_framebuffer_lookup (dev , id );
484
514
if (fb ) {
485
- if (!kref_get_unless_zero (& fb -> refcount ))
515
+ if (!kref_get_unless_zero (& fb -> base . refcount ))
486
516
fb = NULL ;
487
517
}
488
518
mutex_unlock (& dev -> mode_config .fb_lock );
@@ -491,32 +521,6 @@ struct drm_framebuffer *drm_framebuffer_lookup(struct drm_device *dev,
491
521
}
492
522
EXPORT_SYMBOL (drm_framebuffer_lookup );
493
523
494
- /**
495
- * drm_framebuffer_unreference - unref a framebuffer
496
- * @fb: framebuffer to unref
497
- *
498
- * This functions decrements the fb's refcount and frees it if it drops to zero.
499
- */
500
- void drm_framebuffer_unreference (struct drm_framebuffer * fb )
501
- {
502
- DRM_DEBUG ("%p: FB ID: %d (%d)\n" , fb , fb -> base .id , atomic_read (& fb -> refcount .refcount ));
503
- kref_put (& fb -> refcount , drm_framebuffer_free );
504
- }
505
- EXPORT_SYMBOL (drm_framebuffer_unreference );
506
-
507
- /**
508
- * drm_framebuffer_reference - incr the fb refcnt
509
- * @fb: framebuffer
510
- *
511
- * This functions increments the fb's refcount.
512
- */
513
- void drm_framebuffer_reference (struct drm_framebuffer * fb )
514
- {
515
- DRM_DEBUG ("%p: FB ID: %d (%d)\n" , fb , fb -> base .id , atomic_read (& fb -> refcount .refcount ));
516
- kref_get (& fb -> refcount );
517
- }
518
- EXPORT_SYMBOL (drm_framebuffer_reference );
519
-
520
524
/**
521
525
* drm_framebuffer_unregister_private - unregister a private fb from the lookup idr
522
526
* @fb: fb to unregister
@@ -902,7 +906,7 @@ int drm_connector_init(struct drm_device *dev,
902
906
903
907
drm_modeset_lock_all (dev );
904
908
905
- ret = drm_mode_object_get_reg (dev , & connector -> base , DRM_MODE_OBJECT_CONNECTOR , false);
909
+ ret = drm_mode_object_get_reg (dev , & connector -> base , DRM_MODE_OBJECT_CONNECTOR , false, NULL );
906
910
if (ret )
907
911
goto out_unlock ;
908
912
@@ -5971,7 +5975,7 @@ void drm_mode_config_cleanup(struct drm_device *dev)
5971
5975
*/
5972
5976
WARN_ON (!list_empty (& dev -> mode_config .fb_list ));
5973
5977
list_for_each_entry_safe (fb , fbt , & dev -> mode_config .fb_list , head ) {
5974
- drm_framebuffer_free (& fb -> refcount );
5978
+ drm_framebuffer_free (& fb -> base . refcount );
5975
5979
}
5976
5980
5977
5981
ida_destroy (& dev -> mode_config .connector_ida );
0 commit comments