On Wed, 2009-01-14 at 10:48 -0800, Jesse Barnes wrote:
> >From fc3b2a31f1d2274bcf98929d5f3a5aeaee1baf4d Mon Sep 17 00:00:00 2001
> From: Jesse Barnes <jbar...@virtuousgeek.org>
> Date: Wed, 14 Jan 2009 10:38:13 -0800
> Subject: [PATCH] drm: create mode_config idr lock
> 
> Create a separate mode_config IDR lock for simplicity.  The core DRM
> config structures (connector, mode, etc. lists) are still protected by
> the mode_config mutex, but the CRTC IDR (used for the various identifier
> IDs) is now protected by the mode_config idr_mutex.  Simplifies the
> locking a bit and removes a warning.

So, I don't see any refcounting on these objects.  What's keeping them
alive over the time that the consumer of these APIs uses an object
returned by drm_mode_object_find()?

> Signed-off-by: Jesse Barnes <jbar...@virtuousgeek.org>
> ---
>  drivers/gpu/drm/drm_crtc.c |   15 ++++++++++-----
>  include/drm/drm_crtc.h     |    3 ++-
>  2 files changed, 12 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
> index 53c8725..6c9ead8 100644
> --- a/drivers/gpu/drm/drm_crtc.c
> +++ b/drivers/gpu/drm/drm_crtc.c
> @@ -194,7 +194,6 @@ char *drm_get_connector_status_name(enum 
> drm_connector_status status)
>   * @type: object type
>   *
>   * LOCKING:
> - * Caller must hold DRM mode_config lock.
>   *
>   * Create a unique identifier based on @ptr in @dev's identifier space.  Used
>   * for tracking modes, CRTCs and connectors.
> @@ -209,15 +209,15 @@ static int drm_mode_object_get(struct drm_device *dev,
>       int new_id = 0;
>       int ret;
>  
> -     WARN(!mutex_is_locked(&dev->mode_config.mutex),
> -          "%s called w/o mode_config lock\n", __FUNCTION__);
>  again:
>       if (idr_pre_get(&dev->mode_config.crtc_idr, GFP_KERNEL) == 0) {
>               DRM_ERROR("Ran out memory getting a mode number\n");
>               return -EINVAL;
>       }
>  
> +     mutex_lock(&dev->mode_config.idr_mutex);
>       ret = idr_get_new_above(&dev->mode_config.crtc_idr, obj, 1, &new_id);
> +     mutex_unlock(&dev->mode_config.idr_mutex);
>       if (ret == -EAGAIN)
>               goto again;
>  
> @@ -239,16 +239,20 @@ again:
>  static void drm_mode_object_put(struct drm_device *dev,
>                               struct drm_mode_object *object)
>  {
> +     mutex_lock(&dev->mode_config.idr_mutex);
>       idr_remove(&dev->mode_config.crtc_idr, object->id);
> +     mutex_unlock(&dev->mode_config.idr_mutex);
>  }

Fix the doc on this function
 
>  void *drm_mode_object_find(struct drm_device *dev, uint32_t id, uint32_t 
> type)
>  {
> -     struct drm_mode_object *obj;
> +     struct drm_mode_object *obj = NULL;
>  
> +     mutex_lock(&dev->mode_config.idr_mutex);
>       obj = idr_find(&dev->mode_config.crtc_idr, id);
>       if (!obj || (obj->type != type) || (obj->id != id))
> -             return NULL;
> +             obj = NULL;
> +     mutex_unlock(&dev->mode_config.idr_mutex);
>  
>       return obj;
>  }
> @@ -786,6 +790,7 @@ EXPORT_SYMBOL(drm_mode_create_dithering_property);
>  void drm_mode_config_init(struct drm_device *dev)
>  {
>       mutex_init(&dev->mode_config.mutex);
> +     mutex_init(&dev->mode_config.idr_mutex);
>       INIT_LIST_HEAD(&dev->mode_config.fb_list);
>       INIT_LIST_HEAD(&dev->mode_config.fb_kernel_list);
>       INIT_LIST_HEAD(&dev->mode_config.crtc_list);
> diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
> index 0acb07f..ad113c7 100644
> --- a/include/drm/drm_crtc.h
> +++ b/include/drm/drm_crtc.h
> @@ -528,7 +528,8 @@ struct drm_mode_group {
>   *
>   */
>  struct drm_mode_config {
> -     struct mutex mutex; /* protects configuration and IDR */
> +     struct mutex mutex; /* protects configuration (mode lists etc.) */
> +     struct mutex idr_mutex; /* for IDR management */
>       struct idr crtc_idr; /* use this idr for all IDs, fb, crtc, connector, 
> modes - just makes life easier */
>       /* this is limited to one for now */
>       int num_fb;
-- 
Eric Anholt
e...@anholt.net                         eric.anh...@intel.com


Attachment: signature.asc
Description: This is a digitally signed message part

------------------------------------------------------------------------------
This SF.net email is sponsored by:
SourcForge Community
SourceForge wants to tell your story.
http://p.sf.net/sfu/sf-spreadtheword
--
_______________________________________________
Dri-devel mailing list
Dri-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/dri-devel

Reply via email to