diff options
author | Jerome Glisse <glisse@freedesktop.org> | 2008-11-16 18:13:16 +0100 |
---|---|---|
committer | Jerome Glisse <glisse@freedesktop.org> | 2008-11-16 18:13:16 +0100 |
commit | f46aba43329786c9b2776e82af31d90e1c67eae0 (patch) | |
tree | d7e78e61e884383949dfad2f20b703481e520d44 | |
parent | 7270731a8b7ebe11fe6df4f368c2ed613a530b52 (diff) |
gem: protect idr_pre with the spinlock
There seems to be an issue if we don't protect idr_pre with
the spinlock we use for idr operations.
-rw-r--r-- | linux-core/drm_gem.c | 8 |
1 files changed, 3 insertions, 5 deletions
diff --git a/linux-core/drm_gem.c b/linux-core/drm_gem.c index 607c8b67..0078929a 100644 --- a/linux-core/drm_gem.c +++ b/linux-core/drm_gem.c @@ -175,12 +175,11 @@ drm_gem_handle_create(struct drm_file *file_priv, * Get the user-visible handle using idr. */ again: + /* do the allocation under our spinlock */ + spin_lock(&file_priv->table_lock); /* ensure there is space available to allocate a handle */ if (idr_pre_get(&file_priv->object_idr, GFP_KERNEL) == 0) return -ENOMEM; - - /* do the allocation under our spinlock */ - spin_lock(&file_priv->table_lock); ret = idr_get_new_above(&file_priv->object_idr, obj, 1, handlep); spin_unlock(&file_priv->table_lock); if (ret == -EAGAIN) @@ -258,10 +257,9 @@ drm_gem_flink_ioctl(struct drm_device *dev, void *data, return -EINVAL; again: + spin_lock(&dev->object_name_lock); if (idr_pre_get(&dev->object_name_idr, GFP_KERNEL) == 0) return -ENOMEM; - - spin_lock(&dev->object_name_lock); if (obj->name) { args->name = (uint64_t) obj->name; spin_unlock(&dev->object_name_lock); |