diff options
-rw-r--r-- | drivers/gpu/drm/drm_atomic.c | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/drm_atomic_helper.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/drm_crtc.c | 8 | ||||
-rw-r--r-- | drivers/gpu/drm/drm_framebuffer.c | 34 | ||||
-rw-r--r-- | drivers/gpu/drm/drm_plane.c | 12 | ||||
-rw-r--r-- | include/drm/drm_framebuffer.h | 49 | ||||
-rw-r--r-- | scripts/coccinelle/api/drm-get-put.cocci | 10 |
7 files changed, 79 insertions, 44 deletions
diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c index c5cb56db99f6..38cf374e7552 100644 --- a/drivers/gpu/drm/drm_atomic.c +++ b/drivers/gpu/drm/drm_atomic.c | |||
@@ -737,7 +737,7 @@ int drm_atomic_plane_set_property(struct drm_plane *plane, | |||
737 | struct drm_framebuffer *fb = drm_framebuffer_lookup(dev, val); | 737 | struct drm_framebuffer *fb = drm_framebuffer_lookup(dev, val); |
738 | drm_atomic_set_fb_for_plane(state, fb); | 738 | drm_atomic_set_fb_for_plane(state, fb); |
739 | if (fb) | 739 | if (fb) |
740 | drm_framebuffer_unreference(fb); | 740 | drm_framebuffer_put(fb); |
741 | } else if (property == config->prop_in_fence_fd) { | 741 | } else if (property == config->prop_in_fence_fd) { |
742 | if (state->fence) | 742 | if (state->fence) |
743 | return -EINVAL; | 743 | return -EINVAL; |
@@ -1865,12 +1865,12 @@ void drm_atomic_clean_old_fb(struct drm_device *dev, | |||
1865 | if (ret == 0) { | 1865 | if (ret == 0) { |
1866 | struct drm_framebuffer *new_fb = plane->state->fb; | 1866 | struct drm_framebuffer *new_fb = plane->state->fb; |
1867 | if (new_fb) | 1867 | if (new_fb) |
1868 | drm_framebuffer_reference(new_fb); | 1868 | drm_framebuffer_get(new_fb); |
1869 | plane->fb = new_fb; | 1869 | plane->fb = new_fb; |
1870 | plane->crtc = plane->state->crtc; | 1870 | plane->crtc = plane->state->crtc; |
1871 | 1871 | ||
1872 | if (plane->old_fb) | 1872 | if (plane->old_fb) |
1873 | drm_framebuffer_unreference(plane->old_fb); | 1873 | drm_framebuffer_put(plane->old_fb); |
1874 | } | 1874 | } |
1875 | plane->old_fb = NULL; | 1875 | plane->old_fb = NULL; |
1876 | } | 1876 | } |
diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c index 6e7d9dfce342..01b2dddbd431 100644 --- a/drivers/gpu/drm/drm_atomic_helper.c +++ b/drivers/gpu/drm/drm_atomic_helper.c | |||
@@ -3230,7 +3230,7 @@ void __drm_atomic_helper_plane_duplicate_state(struct drm_plane *plane, | |||
3230 | memcpy(state, plane->state, sizeof(*state)); | 3230 | memcpy(state, plane->state, sizeof(*state)); |
3231 | 3231 | ||
3232 | if (state->fb) | 3232 | if (state->fb) |
3233 | drm_framebuffer_reference(state->fb); | 3233 | drm_framebuffer_get(state->fb); |
3234 | 3234 | ||
3235 | state->fence = NULL; | 3235 | state->fence = NULL; |
3236 | } | 3236 | } |
@@ -3270,7 +3270,7 @@ EXPORT_SYMBOL(drm_atomic_helper_plane_duplicate_state); | |||
3270 | void __drm_atomic_helper_plane_destroy_state(struct drm_plane_state *state) | 3270 | void __drm_atomic_helper_plane_destroy_state(struct drm_plane_state *state) |
3271 | { | 3271 | { |
3272 | if (state->fb) | 3272 | if (state->fb) |
3273 | drm_framebuffer_unreference(state->fb); | 3273 | drm_framebuffer_put(state->fb); |
3274 | 3274 | ||
3275 | if (state->fence) | 3275 | if (state->fence) |
3276 | dma_fence_put(state->fence); | 3276 | dma_fence_put(state->fence); |
diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c index 9594c623799b..e2974d3c92e7 100644 --- a/drivers/gpu/drm/drm_crtc.c +++ b/drivers/gpu/drm/drm_crtc.c | |||
@@ -471,9 +471,9 @@ int drm_mode_set_config_internal(struct drm_mode_set *set) | |||
471 | 471 | ||
472 | drm_for_each_crtc(tmp, crtc->dev) { | 472 | drm_for_each_crtc(tmp, crtc->dev) { |
473 | if (tmp->primary->fb) | 473 | if (tmp->primary->fb) |
474 | drm_framebuffer_reference(tmp->primary->fb); | 474 | drm_framebuffer_get(tmp->primary->fb); |
475 | if (tmp->primary->old_fb) | 475 | if (tmp->primary->old_fb) |
476 | drm_framebuffer_unreference(tmp->primary->old_fb); | 476 | drm_framebuffer_put(tmp->primary->old_fb); |
477 | tmp->primary->old_fb = NULL; | 477 | tmp->primary->old_fb = NULL; |
478 | } | 478 | } |
479 | 479 | ||
@@ -567,7 +567,7 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data, | |||
567 | } | 567 | } |
568 | fb = crtc->primary->fb; | 568 | fb = crtc->primary->fb; |
569 | /* Make refcounting symmetric with the lookup path. */ | 569 | /* Make refcounting symmetric with the lookup path. */ |
570 | drm_framebuffer_reference(fb); | 570 | drm_framebuffer_get(fb); |
571 | } else { | 571 | } else { |
572 | fb = drm_framebuffer_lookup(dev, crtc_req->fb_id); | 572 | fb = drm_framebuffer_lookup(dev, crtc_req->fb_id); |
573 | if (!fb) { | 573 | if (!fb) { |
@@ -680,7 +680,7 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data, | |||
680 | 680 | ||
681 | out: | 681 | out: |
682 | if (fb) | 682 | if (fb) |
683 | drm_framebuffer_unreference(fb); | 683 | drm_framebuffer_put(fb); |
684 | 684 | ||
685 | if (connector_set) { | 685 | if (connector_set) { |
686 | for (i = 0; i < crtc_req->count_connectors; i++) { | 686 | for (i = 0; i < crtc_req->count_connectors; i++) { |
diff --git a/drivers/gpu/drm/drm_framebuffer.c b/drivers/gpu/drm/drm_framebuffer.c index dfc433450b81..e4909aef75d7 100644 --- a/drivers/gpu/drm/drm_framebuffer.c +++ b/drivers/gpu/drm/drm_framebuffer.c | |||
@@ -52,13 +52,13 @@ | |||
52 | * metadata fields. | 52 | * metadata fields. |
53 | * | 53 | * |
54 | * The lifetime of a drm framebuffer is controlled with a reference count, | 54 | * The lifetime of a drm framebuffer is controlled with a reference count, |
55 | * drivers can grab additional references with drm_framebuffer_reference() and | 55 | * drivers can grab additional references with drm_framebuffer_get() and drop |
56 | * drop them again with drm_framebuffer_unreference(). For driver-private | 56 | * them again with drm_framebuffer_put(). For driver-private framebuffers for |
57 | * framebuffers for which the last reference is never dropped (e.g. for the | 57 | * which the last reference is never dropped (e.g. for the fbdev framebuffer |
58 | * fbdev framebuffer when the struct &struct drm_framebuffer is embedded into | 58 | * when the struct &struct drm_framebuffer is embedded into the fbdev helper |
59 | * the fbdev helper struct) drivers can manually clean up a framebuffer at | 59 | * struct) drivers can manually clean up a framebuffer at module unload time |
60 | * module unload time with drm_framebuffer_unregister_private(). But doing this | 60 | * with drm_framebuffer_unregister_private(). But doing this is not |
61 | * is not recommended, and it's better to have a normal free-standing &struct | 61 | * recommended, and it's better to have a normal free-standing &struct |
62 | * drm_framebuffer. | 62 | * drm_framebuffer. |
63 | */ | 63 | */ |
64 | 64 | ||
@@ -374,7 +374,7 @@ int drm_mode_rmfb(struct drm_device *dev, | |||
374 | mutex_unlock(&file_priv->fbs_lock); | 374 | mutex_unlock(&file_priv->fbs_lock); |
375 | 375 | ||
376 | /* drop the reference we picked up in framebuffer lookup */ | 376 | /* drop the reference we picked up in framebuffer lookup */ |
377 | drm_framebuffer_unreference(fb); | 377 | drm_framebuffer_put(fb); |
378 | 378 | ||
379 | /* | 379 | /* |
380 | * we now own the reference that was stored in the fbs list | 380 | * we now own the reference that was stored in the fbs list |
@@ -394,12 +394,12 @@ int drm_mode_rmfb(struct drm_device *dev, | |||
394 | flush_work(&arg.work); | 394 | flush_work(&arg.work); |
395 | destroy_work_on_stack(&arg.work); | 395 | destroy_work_on_stack(&arg.work); |
396 | } else | 396 | } else |
397 | drm_framebuffer_unreference(fb); | 397 | drm_framebuffer_put(fb); |
398 | 398 | ||
399 | return 0; | 399 | return 0; |
400 | 400 | ||
401 | fail_unref: | 401 | fail_unref: |
402 | drm_framebuffer_unreference(fb); | 402 | drm_framebuffer_put(fb); |
403 | return -ENOENT; | 403 | return -ENOENT; |
404 | } | 404 | } |
405 | 405 | ||
@@ -453,7 +453,7 @@ int drm_mode_getfb(struct drm_device *dev, | |||
453 | ret = -ENODEV; | 453 | ret = -ENODEV; |
454 | } | 454 | } |
455 | 455 | ||
456 | drm_framebuffer_unreference(fb); | 456 | drm_framebuffer_put(fb); |
457 | 457 | ||
458 | return ret; | 458 | return ret; |
459 | } | 459 | } |
@@ -540,7 +540,7 @@ int drm_mode_dirtyfb_ioctl(struct drm_device *dev, | |||
540 | out_err2: | 540 | out_err2: |
541 | kfree(clips); | 541 | kfree(clips); |
542 | out_err1: | 542 | out_err1: |
543 | drm_framebuffer_unreference(fb); | 543 | drm_framebuffer_put(fb); |
544 | 544 | ||
545 | return ret; | 545 | return ret; |
546 | } | 546 | } |
@@ -580,7 +580,7 @@ void drm_fb_release(struct drm_file *priv) | |||
580 | list_del_init(&fb->filp_head); | 580 | list_del_init(&fb->filp_head); |
581 | 581 | ||
582 | /* This drops the fpriv->fbs reference. */ | 582 | /* This drops the fpriv->fbs reference. */ |
583 | drm_framebuffer_unreference(fb); | 583 | drm_framebuffer_put(fb); |
584 | } | 584 | } |
585 | } | 585 | } |
586 | 586 | ||
@@ -661,7 +661,7 @@ EXPORT_SYMBOL(drm_framebuffer_init); | |||
661 | * | 661 | * |
662 | * If successful, this grabs an additional reference to the framebuffer - | 662 | * If successful, this grabs an additional reference to the framebuffer - |
663 | * callers need to make sure to eventually unreference the returned framebuffer | 663 | * callers need to make sure to eventually unreference the returned framebuffer |
664 | * again, using @drm_framebuffer_unreference. | 664 | * again, using drm_framebuffer_put(). |
665 | */ | 665 | */ |
666 | struct drm_framebuffer *drm_framebuffer_lookup(struct drm_device *dev, | 666 | struct drm_framebuffer *drm_framebuffer_lookup(struct drm_device *dev, |
667 | uint32_t id) | 667 | uint32_t id) |
@@ -687,8 +687,8 @@ EXPORT_SYMBOL(drm_framebuffer_lookup); | |||
687 | * | 687 | * |
688 | * NOTE: This function is deprecated. For driver-private framebuffers it is not | 688 | * NOTE: This function is deprecated. For driver-private framebuffers it is not |
689 | * recommended to embed a framebuffer struct info fbdev struct, instead, a | 689 | * recommended to embed a framebuffer struct info fbdev struct, instead, a |
690 | * framebuffer pointer is preferred and drm_framebuffer_unreference() should be | 690 | * framebuffer pointer is preferred and drm_framebuffer_put() should be called |
691 | * called when the framebuffer is to be cleaned up. | 691 | * when the framebuffer is to be cleaned up. |
692 | */ | 692 | */ |
693 | void drm_framebuffer_unregister_private(struct drm_framebuffer *fb) | 693 | void drm_framebuffer_unregister_private(struct drm_framebuffer *fb) |
694 | { | 694 | { |
@@ -797,7 +797,7 @@ void drm_framebuffer_remove(struct drm_framebuffer *fb) | |||
797 | } | 797 | } |
798 | 798 | ||
799 | out: | 799 | out: |
800 | drm_framebuffer_unreference(fb); | 800 | drm_framebuffer_put(fb); |
801 | } | 801 | } |
802 | EXPORT_SYMBOL(drm_framebuffer_remove); | 802 | EXPORT_SYMBOL(drm_framebuffer_remove); |
803 | 803 | ||
diff --git a/drivers/gpu/drm/drm_plane.c b/drivers/gpu/drm/drm_plane.c index f42590049a3a..a22e76837065 100644 --- a/drivers/gpu/drm/drm_plane.c +++ b/drivers/gpu/drm/drm_plane.c | |||
@@ -293,7 +293,7 @@ void drm_plane_force_disable(struct drm_plane *plane) | |||
293 | return; | 293 | return; |
294 | } | 294 | } |
295 | /* disconnect the plane from the fb and crtc: */ | 295 | /* disconnect the plane from the fb and crtc: */ |
296 | drm_framebuffer_unreference(plane->old_fb); | 296 | drm_framebuffer_put(plane->old_fb); |
297 | plane->old_fb = NULL; | 297 | plane->old_fb = NULL; |
298 | plane->fb = NULL; | 298 | plane->fb = NULL; |
299 | plane->crtc = NULL; | 299 | plane->crtc = NULL; |
@@ -520,9 +520,9 @@ static int __setplane_internal(struct drm_plane *plane, | |||
520 | 520 | ||
521 | out: | 521 | out: |
522 | if (fb) | 522 | if (fb) |
523 | drm_framebuffer_unreference(fb); | 523 | drm_framebuffer_put(fb); |
524 | if (plane->old_fb) | 524 | if (plane->old_fb) |
525 | drm_framebuffer_unreference(plane->old_fb); | 525 | drm_framebuffer_put(plane->old_fb); |
526 | plane->old_fb = NULL; | 526 | plane->old_fb = NULL; |
527 | 527 | ||
528 | return ret; | 528 | return ret; |
@@ -638,7 +638,7 @@ static int drm_mode_cursor_universal(struct drm_crtc *crtc, | |||
638 | } else { | 638 | } else { |
639 | fb = crtc->cursor->fb; | 639 | fb = crtc->cursor->fb; |
640 | if (fb) | 640 | if (fb) |
641 | drm_framebuffer_reference(fb); | 641 | drm_framebuffer_get(fb); |
642 | } | 642 | } |
643 | 643 | ||
644 | if (req->flags & DRM_MODE_CURSOR_MOVE) { | 644 | if (req->flags & DRM_MODE_CURSOR_MOVE) { |
@@ -902,9 +902,9 @@ out: | |||
902 | if (ret && crtc->funcs->page_flip_target) | 902 | if (ret && crtc->funcs->page_flip_target) |
903 | drm_crtc_vblank_put(crtc); | 903 | drm_crtc_vblank_put(crtc); |
904 | if (fb) | 904 | if (fb) |
905 | drm_framebuffer_unreference(fb); | 905 | drm_framebuffer_put(fb); |
906 | if (crtc->primary->old_fb) | 906 | if (crtc->primary->old_fb) |
907 | drm_framebuffer_unreference(crtc->primary->old_fb); | 907 | drm_framebuffer_put(crtc->primary->old_fb); |
908 | crtc->primary->old_fb = NULL; | 908 | crtc->primary->old_fb = NULL; |
909 | drm_modeset_unlock_crtc(crtc); | 909 | drm_modeset_unlock_crtc(crtc); |
910 | 910 | ||
diff --git a/include/drm/drm_framebuffer.h b/include/drm/drm_framebuffer.h index 04c77eee9c20..45410ba0d4f7 100644 --- a/include/drm/drm_framebuffer.h +++ b/include/drm/drm_framebuffer.h | |||
@@ -101,8 +101,8 @@ struct drm_framebuffer_funcs { | |||
101 | * cleanup (like releasing the reference(s) on the backing GEM bo(s)) | 101 | * cleanup (like releasing the reference(s) on the backing GEM bo(s)) |
102 | * should be deferred. In cases like this, the driver would like to | 102 | * should be deferred. In cases like this, the driver would like to |
103 | * hold a ref to the fb even though it has already been removed from | 103 | * hold a ref to the fb even though it has already been removed from |
104 | * userspace perspective. See drm_framebuffer_reference() and | 104 | * userspace perspective. See drm_framebuffer_get() and |
105 | * drm_framebuffer_unreference(). | 105 | * drm_framebuffer_put(). |
106 | * | 106 | * |
107 | * The refcount is stored inside the mode object @base. | 107 | * The refcount is stored inside the mode object @base. |
108 | */ | 108 | */ |
@@ -204,25 +204,50 @@ void drm_framebuffer_cleanup(struct drm_framebuffer *fb); | |||
204 | void drm_framebuffer_unregister_private(struct drm_framebuffer *fb); | 204 | void drm_framebuffer_unregister_private(struct drm_framebuffer *fb); |
205 | 205 | ||
206 | /** | 206 | /** |
207 | * drm_framebuffer_reference - incr the fb refcnt | 207 | * drm_framebuffer_get - acquire a framebuffer reference |
208 | * @fb: framebuffer | 208 | * @fb: DRM framebuffer |
209 | * | ||
210 | * This function increments the framebuffer's reference count. | ||
211 | */ | ||
212 | static inline void drm_framebuffer_get(struct drm_framebuffer *fb) | ||
213 | { | ||
214 | drm_mode_object_get(&fb->base); | ||
215 | } | ||
216 | |||
217 | /** | ||
218 | * drm_framebuffer_put - release a framebuffer reference | ||
219 | * @fb: DRM framebuffer | ||
220 | * | ||
221 | * This function decrements the framebuffer's reference count and frees the | ||
222 | * framebuffer if the reference count drops to zero. | ||
223 | */ | ||
224 | static inline void drm_framebuffer_put(struct drm_framebuffer *fb) | ||
225 | { | ||
226 | drm_mode_object_put(&fb->base); | ||
227 | } | ||
228 | |||
229 | /** | ||
230 | * drm_framebuffer_reference - acquire a framebuffer reference | ||
231 | * @fb: DRM framebuffer | ||
209 | * | 232 | * |
210 | * This functions increments the fb's refcount. | 233 | * This is a compatibility alias for drm_framebuffer_get() and should not be |
234 | * used by new code. | ||
211 | */ | 235 | */ |
212 | static inline void drm_framebuffer_reference(struct drm_framebuffer *fb) | 236 | static inline void drm_framebuffer_reference(struct drm_framebuffer *fb) |
213 | { | 237 | { |
214 | drm_mode_object_reference(&fb->base); | 238 | drm_framebuffer_get(fb); |
215 | } | 239 | } |
216 | 240 | ||
217 | /** | 241 | /** |
218 | * drm_framebuffer_unreference - unref a framebuffer | 242 | * drm_framebuffer_unreference - release a framebuffer reference |
219 | * @fb: framebuffer to unref | 243 | * @fb: DRM framebuffer |
220 | * | 244 | * |
221 | * This functions decrements the fb's refcount and frees it if it drops to zero. | 245 | * This is a compatibility alias for drm_framebuffer_put() and should not be |
246 | * used by new code. | ||
222 | */ | 247 | */ |
223 | static inline void drm_framebuffer_unreference(struct drm_framebuffer *fb) | 248 | static inline void drm_framebuffer_unreference(struct drm_framebuffer *fb) |
224 | { | 249 | { |
225 | drm_mode_object_unreference(&fb->base); | 250 | drm_framebuffer_put(fb); |
226 | } | 251 | } |
227 | 252 | ||
228 | /** | 253 | /** |
@@ -248,9 +273,9 @@ static inline void drm_framebuffer_assign(struct drm_framebuffer **p, | |||
248 | struct drm_framebuffer *fb) | 273 | struct drm_framebuffer *fb) |
249 | { | 274 | { |
250 | if (fb) | 275 | if (fb) |
251 | drm_framebuffer_reference(fb); | 276 | drm_framebuffer_get(fb); |
252 | if (*p) | 277 | if (*p) |
253 | drm_framebuffer_unreference(*p); | 278 | drm_framebuffer_put(*p); |
254 | *p = fb; | 279 | *p = fb; |
255 | } | 280 | } |
256 | 281 | ||
diff --git a/scripts/coccinelle/api/drm-get-put.cocci b/scripts/coccinelle/api/drm-get-put.cocci index 8a4c2cb7889e..fd298c24a465 100644 --- a/scripts/coccinelle/api/drm-get-put.cocci +++ b/scripts/coccinelle/api/drm-get-put.cocci | |||
@@ -26,6 +26,12 @@ expression object; | |||
26 | | | 26 | | |
27 | - drm_connector_unreference(object) | 27 | - drm_connector_unreference(object) |
28 | + drm_connector_put(object) | 28 | + drm_connector_put(object) |
29 | | | ||
30 | - drm_framebuffer_reference(object) | ||
31 | + drm_framebuffer_get(object) | ||
32 | | | ||
33 | - drm_framebuffer_unreference(object) | ||
34 | + drm_framebuffer_put(object) | ||
29 | ) | 35 | ) |
30 | 36 | ||
31 | @r depends on report@ | 37 | @r depends on report@ |
@@ -41,6 +47,10 @@ drm_mode_object_reference@p(object) | |||
41 | drm_connector_unreference@p(object) | 47 | drm_connector_unreference@p(object) |
42 | | | 48 | | |
43 | drm_connector_reference@p(object) | 49 | drm_connector_reference@p(object) |
50 | | | ||
51 | drm_framebuffer_unreference@p(object) | ||
52 | | | ||
53 | drm_framebuffer_reference@p(object) | ||
44 | ) | 54 | ) |
45 | 55 | ||
46 | @script:python depends on report@ | 56 | @script:python depends on report@ |