[v5,13/13] drm/ast: Automatically clean up poll helper
Thomas Zimmermann
tzimmermann at suse.de
Thu Mar 21 09:57:27 UTC 2024
Hi
Am 21.03.24 um 10:00 schrieb Sui Jingfeng:
> Hi,
>
>
> On 2024/3/20 17:34, Thomas Zimmermann wrote:
>> Automatically clean up the conncetor-poll thread as part of the DRM
>> device release. The new helper drmm_kms_helper_poll_init() provides
>> a shared implementation for all drivers.
>>
>> Signed-off-by: Thomas Zimmermann <tzimmermann at suse.de>
>
>
> Nice feature!
>
> It seems that drm/loongson forget to calldrm_kms_helper_poll_fini() on
> driver leave, Opps.
Indeed. I'm surprised that this never blew up with ast. Without _fini(),
the polling thread would likely run on a stale DRM device. We only
release the device during shutdown and I guess it doesn't make
difference then.
Best regards
Thomas
>
>
> Acked-by: Sui Jingfeng <sui.jingfeng at linux.dev>
>
>
>
>> ---
>> drivers/gpu/drm/ast/ast_mode.c | 4 +++-
>> drivers/gpu/drm/drm_probe_helper.c | 27 +++++++++++++++++++++++++++
>> include/drm/drm_probe_helper.h | 2 ++
>> 3 files changed, 32 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/gpu/drm/ast/ast_mode.c
>> b/drivers/gpu/drm/ast/ast_mode.c
>> index a42a0956c51de..7e56a77bed635 100644
>> --- a/drivers/gpu/drm/ast/ast_mode.c
>> +++ b/drivers/gpu/drm/ast/ast_mode.c
>> @@ -1905,7 +1905,9 @@ int ast_mode_config_init(struct ast_device *ast)
>> drm_mode_config_reset(dev);
>> - drm_kms_helper_poll_init(dev);
>> + ret = drmm_kms_helper_poll_init(dev);
>> + if (ret)
>> + return ret;
>> return 0;
>> }
>> diff --git a/drivers/gpu/drm/drm_probe_helper.c
>> b/drivers/gpu/drm/drm_probe_helper.c
>> index b06dcc6c614e8..a39c98ceac68a 100644
>> --- a/drivers/gpu/drm/drm_probe_helper.c
>> +++ b/drivers/gpu/drm/drm_probe_helper.c
>> @@ -37,6 +37,7 @@
>> #include <drm/drm_crtc.h>
>> #include <drm/drm_edid.h>
>> #include <drm/drm_fourcc.h>
>> +#include <drm/drm_managed.h>
>> #include <drm/drm_modeset_helper_vtables.h>
>> #include <drm/drm_print.h>
>> #include <drm/drm_probe_helper.h>
>> @@ -944,6 +945,32 @@ void drm_kms_helper_poll_fini(struct drm_device
>> *dev)
>> }
>> EXPORT_SYMBOL(drm_kms_helper_poll_fini);
>> +static void drm_kms_helper_poll_init_release(struct drm_device
>> *dev, void *res)
>> +{
>> + drm_kms_helper_poll_fini(dev);
>> +}
>> +
>> +/**
>> + * devm_drm_kms_helper_poll_init - initialize and enable output polling
>> + * @dev: drm_device
>> + *
>> + * This function initializes and then also enables output polling
>> support for
>> + * @dev similar to drm_kms_helper_poll_init(). Polling will
>> automatically be
>> + * cleaned up when the DRM device goes away.
>> + *
>> + * See drm_kms_helper_poll_init() for more information.
>> + *
>> + * Returns:
>> + * 0 on success, or a negative errno code otherwise.
>> + */
>> +int drmm_kms_helper_poll_init(struct drm_device *dev)
>> +{
>> + drm_kms_helper_poll_init(dev);
>> +
>> + return drmm_add_action_or_reset(dev,
>> drm_kms_helper_poll_init_release, dev);
>> +}
>> +EXPORT_SYMBOL(drmm_kms_helper_poll_init);
>> +
>> static bool check_connector_changed(struct drm_connector *connector)
>> {
>> struct drm_device *dev = connector->dev;
>> diff --git a/include/drm/drm_probe_helper.h
>> b/include/drm/drm_probe_helper.h
>> index 031b044528c89..9925cff749296 100644
>> --- a/include/drm/drm_probe_helper.h
>> +++ b/include/drm/drm_probe_helper.h
>> @@ -16,6 +16,8 @@ int drm_helper_probe_single_connector_modes(struct
>> drm_connector
>> int drm_helper_probe_detect(struct drm_connector *connector,
>> struct drm_modeset_acquire_ctx *ctx,
>> bool force);
>> +
>> +int drmm_kms_helper_poll_init(struct drm_device *dev);
>> void drm_kms_helper_poll_init(struct drm_device *dev);
>> void drm_kms_helper_poll_fini(struct drm_device *dev);
>> bool drm_helper_hpd_irq_event(struct drm_device *dev);
>
--
--
Thomas Zimmermann
Graphics Driver Developer
SUSE Software Solutions Germany GmbH
Frankenstrasse 146, 90461 Nuernberg, Germany
GF: Ivo Totev, Andrew Myers, Andrew McDonald, Boudien Moerman
HRB 36809 (AG Nuernberg)
More information about the dri-devel
mailing list