diff mbox

[RFC,1/2] drm: store connector name in connector struct

Message ID 881f57fb7f6a7f5ad45e28afbe9d6b2d147c78c4.1400075481.git.jani.nikula@intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Jani Nikula May 14, 2014, 1:58 p.m. UTC
This makes drm_get_connector_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 | 36 ++++++++++++++++++++----------------
 include/drm/drm_crtc.h     |  2 ++
 2 files changed, 22 insertions(+), 16 deletions(-)

Comments

David Herrmann May 19, 2014, 11:08 a.m. UTC | #1
Hi

On Wed, May 14, 2014 at 3:58 PM, Jani Nikula <jani.nikula@intel.com> wrote:
> This makes drm_get_connector_name() thread safe.
>
> Reference: http://lkml.kernel.org/r/645ee6e22cad47d38a2b35c21c8d5fe3@DC1-MBX-01.ptsecurity.ru
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>

I like that approach, but we should also kill drm_get_connector_name()
in a follow-up. I don't see why that wrapper is needed.

Reviewed-by: David Herrmann <dh.herrmann@gmail.com>

Thanks
David

> ---
>  drivers/gpu/drm/drm_crtc.c | 36 ++++++++++++++++++++----------------
>  include/drm/drm_crtc.h     |  2 ++
>  2 files changed, 22 insertions(+), 16 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
> index 461d19bd14ee..5781130b4126 100644
> --- a/drivers/gpu/drm/drm_crtc.c
> +++ b/drivers/gpu/drm/drm_crtc.c
> @@ -277,21 +277,11 @@ EXPORT_SYMBOL(drm_get_encoder_name);
>
>  /**
>   * drm_get_connector_name - return a string for connector
> - * @connector: connector 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.
> + * @connector: the connector to get name for
>   */
>  const char *drm_get_connector_name(const struct drm_connector *connector)
>  {
> -       static char buf[32];
> -
> -       snprintf(buf, 32, "%s-%d",
> -                drm_connector_enum_list[connector->connector_type].name,
> -                connector->connector_type_id);
> -       return buf;
> +       return connector->name;
>  }
>  EXPORT_SYMBOL(drm_get_connector_name);
>
> @@ -824,7 +814,7 @@ int drm_connector_init(struct drm_device *dev,
>
>         ret = drm_mode_object_get(dev, &connector->base, DRM_MODE_OBJECT_CONNECTOR);
>         if (ret)
> -               goto out;
> +               goto out_unlock;
>
>         connector->base.properties = &connector->properties;
>         connector->dev = dev;
> @@ -834,9 +824,17 @@ int drm_connector_init(struct drm_device *dev,
>                 ida_simple_get(connector_ida, 1, 0, GFP_KERNEL);
>         if (connector->connector_type_id < 0) {
>                 ret = connector->connector_type_id;
> -               drm_mode_object_put(dev, &connector->base);
> -               goto out;
> +               goto out_out;
>         }
> +       connector->name =
> +               kasprintf(GFP_KERNEL, "%s-%d",
> +                         drm_connector_enum_list[connector_type].name,
> +                         connector->connector_type_id);
> +       if (!connector->name) {
> +               ret = -ENOMEM;
> +               goto out_put;
> +       }
> +
>         INIT_LIST_HEAD(&connector->probed_modes);
>         INIT_LIST_HEAD(&connector->modes);
>         connector->edid_blob_ptr = NULL;
> @@ -853,7 +851,11 @@ int drm_connector_init(struct drm_device *dev,
>         drm_object_attach_property(&connector->base,
>                                       dev->mode_config.dpms_property, 0);
>
> - out:
> +out_put:
> +       if (ret)
> +               drm_mode_object_put(dev, &connector->base);
> +
> +out_unlock:
>         drm_modeset_unlock_all(dev);
>
>         return ret;
> @@ -881,6 +883,8 @@ void drm_connector_cleanup(struct drm_connector *connector)
>                    connector->connector_type_id);
>
>         drm_mode_object_put(dev, &connector->base);
> +       kfree(connector->name);
> +       connector->name = NULL;
>         list_del(&connector->head);
>         dev->mode_config.num_connector--;
>  }
> diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
> index c061bb372199..d4cd7e513280 100644
> --- a/include/drm/drm_crtc.h
> +++ b/include/drm/drm_crtc.h
> @@ -444,6 +444,7 @@ struct drm_encoder {
>   * @attr: sysfs attributes
>   * @head: list management
>   * @base: base KMS object
> + * @name: connector name
>   * @connector_type: one of the %DRM_MODE_CONNECTOR_<foo> types from drm_mode.h
>   * @connector_type_id: index into connector type enum
>   * @interlace_allowed: can this connector handle interlaced modes?
> @@ -482,6 +483,7 @@ struct drm_connector {
>
>         struct drm_mode_object base;
>
> +       char *name;
>         int connector_type;
>         int connector_type_id;
>         bool interlace_allowed;
> --
> 1.9.1
>
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel
Dave Airlie May 27, 2014, 6:01 a.m. UTC | #2
> Reference: http://lkml.kernel.org/r/645ee6e22cad47d38a2b35c21c8d5fe3@DC1-MBX-01.ptsecurity.ru
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>


> @@ -834,9 +824,17 @@ int drm_connector_init(struct drm_device *dev,
>                 ida_simple_get(connector_ida, 1, 0, GFP_KERNEL);
>         if (connector->connector_type_id < 0) {
>                 ret = connector->connector_type_id;
> -               drm_mode_object_put(dev, &connector->base);
> -               goto out;
> +               goto out_out;

^^ one of these things is not like the other,


>         }
> +       connector->name =
> +               kasprintf(GFP_KERNEL, "%s-%d",
> +                         drm_connector_enum_list[connector_type].name,
> +                         connector->connector_type_id);
> +       if (!connector->name) {
> +               ret = -ENOMEM;
> +               goto out_put;

^^,

I've merged this fixed into my tree, I'm sure Daniel won't mind :)

Dave.
Jani Nikula May 27, 2014, 6:18 a.m. UTC | #3
On Tue, 27 May 2014, Dave Airlie <airlied@gmail.com> wrote:
>> Reference: http://lkml.kernel.org/r/645ee6e22cad47d38a2b35c21c8d5fe3@DC1-MBX-01.ptsecurity.ru
>> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
>
>
>> @@ -834,9 +824,17 @@ int drm_connector_init(struct drm_device *dev,
>>                 ida_simple_get(connector_ida, 1, 0, GFP_KERNEL);
>>         if (connector->connector_type_id < 0) {
>>                 ret = connector->connector_type_id;
>> -               drm_mode_object_put(dev, &connector->base);
>> -               goto out;
>> +               goto out_out;
>
> ^^ one of these things is not like the other,
>
>
>>         }
>> +       connector->name =
>> +               kasprintf(GFP_KERNEL, "%s-%d",
>> +                         drm_connector_enum_list[connector_type].name,
>> +                         connector->connector_type_id);
>> +       if (!connector->name) {
>> +               ret = -ENOMEM;
>> +               goto out_put;
>
> ^^,
>
> I've merged this fixed into my tree, I'm sure Daniel won't mind :)

Thanks. I'll hide behind the "RFC PATCH" subject. ;)

BR,
Jani.
diff mbox

Patch

diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
index 461d19bd14ee..5781130b4126 100644
--- a/drivers/gpu/drm/drm_crtc.c
+++ b/drivers/gpu/drm/drm_crtc.c
@@ -277,21 +277,11 @@  EXPORT_SYMBOL(drm_get_encoder_name);
 
 /**
  * drm_get_connector_name - return a string for connector
- * @connector: connector 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.
+ * @connector: the connector to get name for
  */
 const char *drm_get_connector_name(const struct drm_connector *connector)
 {
-	static char buf[32];
-
-	snprintf(buf, 32, "%s-%d",
-		 drm_connector_enum_list[connector->connector_type].name,
-		 connector->connector_type_id);
-	return buf;
+	return connector->name;
 }
 EXPORT_SYMBOL(drm_get_connector_name);
 
@@ -824,7 +814,7 @@  int drm_connector_init(struct drm_device *dev,
 
 	ret = drm_mode_object_get(dev, &connector->base, DRM_MODE_OBJECT_CONNECTOR);
 	if (ret)
-		goto out;
+		goto out_unlock;
 
 	connector->base.properties = &connector->properties;
 	connector->dev = dev;
@@ -834,9 +824,17 @@  int drm_connector_init(struct drm_device *dev,
 		ida_simple_get(connector_ida, 1, 0, GFP_KERNEL);
 	if (connector->connector_type_id < 0) {
 		ret = connector->connector_type_id;
-		drm_mode_object_put(dev, &connector->base);
-		goto out;
+		goto out_out;
 	}
+	connector->name =
+		kasprintf(GFP_KERNEL, "%s-%d",
+			  drm_connector_enum_list[connector_type].name,
+			  connector->connector_type_id);
+	if (!connector->name) {
+		ret = -ENOMEM;
+		goto out_put;
+	}
+
 	INIT_LIST_HEAD(&connector->probed_modes);
 	INIT_LIST_HEAD(&connector->modes);
 	connector->edid_blob_ptr = NULL;
@@ -853,7 +851,11 @@  int drm_connector_init(struct drm_device *dev,
 	drm_object_attach_property(&connector->base,
 				      dev->mode_config.dpms_property, 0);
 
- out:
+out_put:
+	if (ret)
+		drm_mode_object_put(dev, &connector->base);
+
+out_unlock:
 	drm_modeset_unlock_all(dev);
 
 	return ret;
@@ -881,6 +883,8 @@  void drm_connector_cleanup(struct drm_connector *connector)
 		   connector->connector_type_id);
 
 	drm_mode_object_put(dev, &connector->base);
+	kfree(connector->name);
+	connector->name = NULL;
 	list_del(&connector->head);
 	dev->mode_config.num_connector--;
 }
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
index c061bb372199..d4cd7e513280 100644
--- a/include/drm/drm_crtc.h
+++ b/include/drm/drm_crtc.h
@@ -444,6 +444,7 @@  struct drm_encoder {
  * @attr: sysfs attributes
  * @head: list management
  * @base: base KMS object
+ * @name: connector name
  * @connector_type: one of the %DRM_MODE_CONNECTOR_<foo> types from drm_mode.h
  * @connector_type_id: index into connector type enum
  * @interlace_allowed: can this connector handle interlaced modes?
@@ -482,6 +483,7 @@  struct drm_connector {
 
 	struct drm_mode_object base;
 
+	char *name;
 	int connector_type;
 	int connector_type_id;
 	bool interlace_allowed;