Message ID | 8b3c3851a20e3f818145f79a43e00ad28dbeec28.1400075481.git.jani.nikula@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Hi On Wed, May 14, 2014 at 3:58 PM, Jani Nikula <jani.nikula@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@intel.com> Same as for 1/2, a followup would be nice. Reviewed-by: David Herrmann <dh.herrmann@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@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/dri-devel
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;
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@intel.com> --- drivers/gpu/drm/drm_crtc.c | 31 +++++++++++++++++-------------- include/drm/drm_crtc.h | 2 ++ 2 files changed, 19 insertions(+), 14 deletions(-)