[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