[RFC PATCH 2/2] drm: store encoder name in encoder struct
David Herrmann
dh.herrmann at gmail.com
Mon May 19 06:08:43 PDT 2014
Hi
On Wed, May 14, 2014 at 3:58 PM, Jani Nikula <jani.nikula at intel.com> wrote:
> This makes drm_get_encoder_name() thread safe.
>
> Reference: http://lkml.kernel.org/r/645ee6e22cad47d38a2b35c21c8d5fe3@DC1-MBX-01\
> .ptsecurity.ru
> Signed-off-by: Jani Nikula <jani.nikula at intel.com>
Same as for 1/2, a followup would be nice.
Reviewed-by: David Herrmann <dh.herrmann at gmail.com>
Thanks
David
> ---
> drivers/gpu/drm/drm_crtc.c | 31 +++++++++++++++++--------------
> include/drm/drm_crtc.h | 2 ++
> 2 files changed, 19 insertions(+), 14 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
> index 5781130b4126..1c4cb74ede77 100644
> --- a/drivers/gpu/drm/drm_crtc.c
> +++ b/drivers/gpu/drm/drm_crtc.c
> @@ -257,21 +257,11 @@ void drm_connector_ida_destroy(void)
>
> /**
> * drm_get_encoder_name - return a string for encoder
> - * @encoder: encoder to compute name of
> - *
> - * Note that the buffer used by this function is globally shared and owned by
> - * the function itself.
> - *
> - * FIXME: This isn't really multithreading safe.
> + * @encoder: the encoder to get name for
> */
> const char *drm_get_encoder_name(const struct drm_encoder *encoder)
> {
> - static char buf[32];
> -
> - snprintf(buf, 32, "%s-%d",
> - drm_encoder_enum_list[encoder->encoder_type].name,
> - encoder->base.id);
> - return buf;
> + return encoder->name;
> }
> EXPORT_SYMBOL(drm_get_encoder_name);
>
> @@ -986,16 +976,27 @@ int drm_encoder_init(struct drm_device *dev,
>
> ret = drm_mode_object_get(dev, &encoder->base, DRM_MODE_OBJECT_ENCODER);
> if (ret)
> - goto out;
> + goto out_unlock;
>
> encoder->dev = dev;
> encoder->encoder_type = encoder_type;
> encoder->funcs = funcs;
> + encoder->name = kasprintf(GFP_KERNEL, "%s-%d",
> + drm_encoder_enum_list[encoder_type].name,
> + encoder->base.id);
> + if (!encoder->name) {
> + ret = -ENOMEM;
> + goto out_put;
> + }
>
> list_add_tail(&encoder->head, &dev->mode_config.encoder_list);
> dev->mode_config.num_encoder++;
>
> - out:
> +out_put:
> + if (ret)
> + drm_mode_object_put(dev, &encoder->base);
> +
> +out_unlock:
> drm_modeset_unlock_all(dev);
>
> return ret;
> @@ -1013,6 +1014,8 @@ void drm_encoder_cleanup(struct drm_encoder *encoder)
> struct drm_device *dev = encoder->dev;
> drm_modeset_lock_all(dev);
> drm_mode_object_put(dev, &encoder->base);
> + kfree(encoder->name);
> + encoder->name = NULL;
> list_del(&encoder->head);
> dev->mode_config.num_encoder--;
> drm_modeset_unlock_all(dev);
> diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
> index d4cd7e513280..219b533a2c15 100644
> --- a/include/drm/drm_crtc.h
> +++ b/include/drm/drm_crtc.h
> @@ -400,6 +400,7 @@ struct drm_encoder_funcs {
> * @dev: parent DRM device
> * @head: list management
> * @base: base KMS object
> + * @name: encoder name
> * @encoder_type: one of the %DRM_MODE_ENCODER_<foo> types in drm_mode.h
> * @possible_crtcs: bitmask of potential CRTC bindings
> * @possible_clones: bitmask of potential sibling encoders for cloning
> @@ -416,6 +417,7 @@ struct drm_encoder {
> struct list_head head;
>
> struct drm_mode_object base;
> + char *name;
> int encoder_type;
> uint32_t possible_crtcs;
> uint32_t possible_clones;
> --
> 1.9.1
>
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel
More information about the dri-devel
mailing list