[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <mpoae5tfugsnvdyv5yzmiifr242mc62gouqqvql7ucjtdxo7b2@7y4plckbcdbn>
Date: Sun, 20 Apr 2025 12:32:26 +0300
From: Fedor Pchelkin <pchelkin@...ras.ru>
To: Martin Blumenstingl <martin.blumenstingl@...glemail.com>
Cc: linux-amlogic@...ts.infradead.org, dri-devel@...ts.freedesktop.org,
linux@...tijnvandeventer.nl, linux-kernel@...r.kernel.org,
linux-arm-kernel@...ts.infradead.org, jbrunet@...libre.com, neil.armstrong@...aro.org,
Furkan Kardame <f.kardame@...jaro.org>, Anastasia Belova <abelova@...ralinux.ru>
Subject: Re: [PATCH] drm/meson: fix resource cleanup in
meson_drv_bind_master() on error
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@...tijnvandeventer.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
Powered by blists - more mailing lists