Message ID | 20250619-b4-of_drm_find_panel_part1-v2-1-0df94aecc43d@redhat.com |
---|---|
State | New |
Headers | show |
Series | Use drm_panel_get/put() in of_drm_find_panel() and its callers | expand |
On Fri, Jun 20, 2025 at 10:33:53AM +0200, Luca Ceresoli wrote: > Hello Anusha, > > On Thu, 19 Jun 2025 14:15:53 -0500 > Anusha Srivatsa <asrivats@redhat.com> wrote: > > > Take the panel reference and put it back as required. > > drm_panel_add() and drm_panel_remove() add a panel to > > the global registry and removes a panel respectively. > > Use get() and put() helpers to keep up with refcounting. > > > > Reviewed-by: Luca Ceresoli <luca.ceresoli@bootlin.com> > > Signed-off-by: Anusha Srivatsa <asrivats@redhat.com> > > This patch is good. > > I'd just point out that this must be applied only after all drivers > have been converted to the the _alloc API, otherwise with the following > sequence: > > panel = devm_kzalloc(); > drm_panel_init(panel); > drm_panel_add(panel); > ... > drm_panel_remove(panel); <----- > > at the drm_panel_remove() you'd have a warning: > > refcount_t: addition on 0; use-after-free. > > So, if all panel drivers are converted: Not all panels are yet: $ rg -l drm_panel_init -- drivers/gpu/drm/panel/ | wc -l 20 Maxime
diff --git a/drivers/gpu/drm/drm_panel.c b/drivers/gpu/drm/drm_panel.c index 805b4151ccefd8ec0107951162c3b71446102ffb..ced6b08923b2150ebda6e1d9001517103895def1 100644 --- a/drivers/gpu/drm/drm_panel.c +++ b/drivers/gpu/drm/drm_panel.c @@ -80,6 +80,7 @@ EXPORT_SYMBOL(drm_panel_init); */ void drm_panel_add(struct drm_panel *panel) { + drm_panel_get(panel); mutex_lock(&panel_lock); list_add_tail(&panel->list, &panel_list); mutex_unlock(&panel_lock); @@ -97,6 +98,7 @@ void drm_panel_remove(struct drm_panel *panel) mutex_lock(&panel_lock); list_del_init(&panel->list); mutex_unlock(&panel_lock); + drm_panel_put(panel); } EXPORT_SYMBOL(drm_panel_remove);