diff options
| author | Daniel Vetter <daniel.vetter@ffwll.ch> | 2013-08-14 18:02:44 -0400 |
|---|---|---|
| committer | Dave Airlie <airlied@redhat.com> | 2013-08-20 22:58:01 -0400 |
| commit | cd4f013f3a4b6a55d484cc2e206dc08e055e5291 (patch) | |
| tree | 1af8117ef7955b830c9af6a54a9cafe24943641d | |
| parent | 84341c280acb8217a301344082c7ad8b9af870a6 (diff) | |
drm/gem: switch dev->object_name_lock to a mutex
I want to wrap the creation of a dma-buf from a gem object in it,
so that the obj->export_dma_buf cache can be atomically filled in.
Instead of creating a new mutex just for that variable I've figured
I can reuse the existing dev->object_name_lock, especially since
the new semantics will exactly mirror the flink obj->name already
protected by that lock.
v2: idr_preload/idr_preload_end is now an atomic section, so need to
move the mutex locking outside.
[airlied: fix up conflict with patch to make debugfs use lock]
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: Dave Airlie <airlied@redhat.com>
| -rw-r--r-- | drivers/gpu/drm/drm_gem.c | 18 | ||||
| -rw-r--r-- | drivers/gpu/drm/drm_info.c | 4 | ||||
| -rw-r--r-- | include/drm/drmP.h | 2 |
3 files changed, 12 insertions, 12 deletions
diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c index 52548fd34b15..adb9eda4fa1a 100644 --- a/drivers/gpu/drm/drm_gem.c +++ b/drivers/gpu/drm/drm_gem.c | |||
| @@ -93,7 +93,7 @@ drm_gem_init(struct drm_device *dev) | |||
| 93 | { | 93 | { |
| 94 | struct drm_gem_mm *mm; | 94 | struct drm_gem_mm *mm; |
| 95 | 95 | ||
| 96 | spin_lock_init(&dev->object_name_lock); | 96 | mutex_init(&dev->object_name_lock); |
| 97 | idr_init(&dev->object_name_idr); | 97 | idr_init(&dev->object_name_idr); |
| 98 | 98 | ||
| 99 | mm = kzalloc(sizeof(struct drm_gem_mm), GFP_KERNEL); | 99 | mm = kzalloc(sizeof(struct drm_gem_mm), GFP_KERNEL); |
| @@ -243,10 +243,10 @@ drm_gem_object_handle_unreference_unlocked(struct drm_gem_object *obj) | |||
| 243 | * checked for a name | 243 | * checked for a name |
| 244 | */ | 244 | */ |
| 245 | 245 | ||
| 246 | spin_lock(&obj->dev->object_name_lock); | 246 | mutex_lock(&obj->dev->object_name_lock); |
| 247 | if (--obj->handle_count == 0) | 247 | if (--obj->handle_count == 0) |
| 248 | drm_gem_object_handle_free(obj); | 248 | drm_gem_object_handle_free(obj); |
| 249 | spin_unlock(&obj->dev->object_name_lock); | 249 | mutex_unlock(&obj->dev->object_name_lock); |
| 250 | 250 | ||
| 251 | drm_gem_object_unreference_unlocked(obj); | 251 | drm_gem_object_unreference_unlocked(obj); |
| 252 | } | 252 | } |
| @@ -324,16 +324,16 @@ drm_gem_handle_create(struct drm_file *file_priv, | |||
| 324 | * Get the user-visible handle using idr. Preload and perform | 324 | * Get the user-visible handle using idr. Preload and perform |
| 325 | * allocation under our spinlock. | 325 | * allocation under our spinlock. |
| 326 | */ | 326 | */ |
| 327 | mutex_lock(&dev->object_name_lock); | ||
| 327 | idr_preload(GFP_KERNEL); | 328 | idr_preload(GFP_KERNEL); |
| 328 | spin_lock(&dev->object_name_lock); | ||
| 329 | spin_lock(&file_priv->table_lock); | 329 | spin_lock(&file_priv->table_lock); |
| 330 | 330 | ||
| 331 | ret = idr_alloc(&file_priv->object_idr, obj, 1, 0, GFP_NOWAIT); | 331 | ret = idr_alloc(&file_priv->object_idr, obj, 1, 0, GFP_NOWAIT); |
| 332 | drm_gem_object_reference(obj); | 332 | drm_gem_object_reference(obj); |
| 333 | obj->handle_count++; | 333 | obj->handle_count++; |
| 334 | spin_unlock(&file_priv->table_lock); | 334 | spin_unlock(&file_priv->table_lock); |
| 335 | spin_unlock(&dev->object_name_lock); | ||
| 336 | idr_preload_end(); | 335 | idr_preload_end(); |
| 336 | mutex_unlock(&dev->object_name_lock); | ||
| 337 | if (ret < 0) { | 337 | if (ret < 0) { |
| 338 | drm_gem_object_handle_unreference_unlocked(obj); | 338 | drm_gem_object_handle_unreference_unlocked(obj); |
| 339 | return ret; | 339 | return ret; |
| @@ -578,8 +578,8 @@ drm_gem_flink_ioctl(struct drm_device *dev, void *data, | |||
| 578 | if (obj == NULL) | 578 | if (obj == NULL) |
| 579 | return -ENOENT; | 579 | return -ENOENT; |
| 580 | 580 | ||
| 581 | mutex_lock(&dev->object_name_lock); | ||
| 581 | idr_preload(GFP_KERNEL); | 582 | idr_preload(GFP_KERNEL); |
| 582 | spin_lock(&dev->object_name_lock); | ||
| 583 | /* prevent races with concurrent gem_close. */ | 583 | /* prevent races with concurrent gem_close. */ |
| 584 | if (obj->handle_count == 0) { | 584 | if (obj->handle_count == 0) { |
| 585 | ret = -ENOENT; | 585 | ret = -ENOENT; |
| @@ -601,8 +601,8 @@ drm_gem_flink_ioctl(struct drm_device *dev, void *data, | |||
| 601 | ret = 0; | 601 | ret = 0; |
| 602 | 602 | ||
| 603 | err: | 603 | err: |
| 604 | spin_unlock(&dev->object_name_lock); | ||
| 605 | idr_preload_end(); | 604 | idr_preload_end(); |
| 605 | mutex_unlock(&dev->object_name_lock); | ||
| 606 | drm_gem_object_unreference_unlocked(obj); | 606 | drm_gem_object_unreference_unlocked(obj); |
| 607 | return ret; | 607 | return ret; |
| 608 | } | 608 | } |
| @@ -625,11 +625,11 @@ drm_gem_open_ioctl(struct drm_device *dev, void *data, | |||
| 625 | if (!(dev->driver->driver_features & DRIVER_GEM)) | 625 | if (!(dev->driver->driver_features & DRIVER_GEM)) |
| 626 | return -ENODEV; | 626 | return -ENODEV; |
| 627 | 627 | ||
| 628 | spin_lock(&dev->object_name_lock); | 628 | mutex_lock(&dev->object_name_lock); |
| 629 | obj = idr_find(&dev->object_name_idr, (int) args->name); | 629 | obj = idr_find(&dev->object_name_idr, (int) args->name); |
| 630 | if (obj) | 630 | if (obj) |
| 631 | drm_gem_object_reference(obj); | 631 | drm_gem_object_reference(obj); |
| 632 | spin_unlock(&dev->object_name_lock); | 632 | mutex_unlock(&dev->object_name_lock); |
| 633 | if (!obj) | 633 | if (!obj) |
| 634 | return -ENOENT; | 634 | return -ENOENT; |
| 635 | 635 | ||
diff --git a/drivers/gpu/drm/drm_info.c b/drivers/gpu/drm/drm_info.c index 5351e811c421..53298320080b 100644 --- a/drivers/gpu/drm/drm_info.c +++ b/drivers/gpu/drm/drm_info.c | |||
| @@ -219,9 +219,9 @@ int drm_gem_name_info(struct seq_file *m, void *data) | |||
| 219 | 219 | ||
| 220 | seq_printf(m, " name size handles refcount\n"); | 220 | seq_printf(m, " name size handles refcount\n"); |
| 221 | 221 | ||
| 222 | spin_lock(&dev->object_name_lock); | 222 | mutex_lock(&dev->object_name_lock); |
| 223 | idr_for_each(&dev->object_name_idr, drm_gem_one_name_info, m); | 223 | idr_for_each(&dev->object_name_idr, drm_gem_one_name_info, m); |
| 224 | spin_unlock(&dev->object_name_lock); | 224 | mutex_unlock(&dev->object_name_lock); |
| 225 | 225 | ||
| 226 | return 0; | 226 | return 0; |
| 227 | } | 227 | } |
diff --git a/include/drm/drmP.h b/include/drm/drmP.h index 7782dbbbe126..bf058470a0fd 100644 --- a/include/drm/drmP.h +++ b/include/drm/drmP.h | |||
| @@ -1196,7 +1196,7 @@ struct drm_device { | |||
| 1196 | 1196 | ||
| 1197 | /** \name GEM information */ | 1197 | /** \name GEM information */ |
| 1198 | /*@{ */ | 1198 | /*@{ */ |
| 1199 | spinlock_t object_name_lock; | 1199 | struct mutex object_name_lock; |
| 1200 | struct idr object_name_idr; | 1200 | struct idr object_name_idr; |
| 1201 | /*@} */ | 1201 | /*@} */ |
| 1202 | int switch_power_state; | 1202 | int switch_power_state; |
