[PATCH] drm/meson: fix resource cleanup in meson_drv_bind_master() on error
Fedor Pchelkin
pchelkin at ispras.ru
Sun Apr 20 02:32:26 PDT 2025
Martin Blumenstingl wrote:
> @@ -360,6 +360,16 @@ static int meson_drv_bind_master(struct device *dev, bool has_components)
>
> uninstall_irq:
> free_irq(priv->vsync_irq, drm);
> +dsi_encoder_remove:
> + if (meson_vpu_is_compatible(priv, VPU_COMPATIBLE_G12A))
> + meson_encoder_dsi_remove(priv);
> +hdmi_encoder_remove:
> + meson_encoder_hdmi_remove(priv);
> +unbind_components:
> + if (has_components)
> + component_unbind_all(dev, drm);
As 6a044642988b ("drm/meson: fix unbind path if HDMI fails to bind")
states, it seems invalid to call component_unbind_all() before
drm_dev_put(). Wouldn't this patch reintroduce the problem here?
In that sense the diff proposed by Martijn <linux at martijnvandeventer.nl>
behaves more correctly.
I've also found this thread [1] with another error path fixing patch. It
was suggested to improve that fix with managed drm device [2] interfaces but
AFAICS using devm_drm_dev_alloc() will reintroduce the problem mentioned
in 6a044642988b, too.
I think [1] should be applied as well with Martijn's patch?
[1]: https://lore.kernel.org/dri-devel/20240809124725.17956-1-abelova@astralinux.ru/T/#u
[2]: https://lore.kernel.org/dri-devel/20240828110421.14956-1-abelova@astralinux.ru/T/#u
Thanks!
> +cvbs_encoder_remove:
> + meson_encoder_cvbs_remove(priv);
> exit_afbcd:
> if (priv->afbcd.ops)
> priv->afbcd.ops->exit(priv);
> @@ -374,13 +384,6 @@ static int meson_drv_bind_master(struct device *dev, bool has_components)
> free_drm:
> drm_dev_put(drm);
>
> - meson_encoder_dsi_remove(priv);
> - meson_encoder_hdmi_remove(priv);
> - meson_encoder_cvbs_remove(priv);
> -
> - if (has_components)
> - component_unbind_all(dev, drm);
> -
> return ret;
> }
>
> --
> 2.49.0
More information about the linux-amlogic
mailing list