@@ -62,17 +62,16 @@ int drm_getmagic(struct drm_device *dev, void *data, struct drm_file *file_priv)
mutex_lock(&dev->master_mutex);
if (!file_priv->magic) {
- ret = idr_alloc(&file_priv->master->magic_map, file_priv,
- 1, 0, GFP_KERNEL);
- if (ret >= 0)
- file_priv->magic = ret;
+ ret = xa_alloc(&file_priv->master->magic_map,
+ &file_priv->magic, file_priv,
+ xa_limit_31b, GFP_KERNEL);
}
auth->magic = file_priv->magic;
mutex_unlock(&dev->master_mutex);
DRM_DEBUG("%u\n", auth->magic);
- return ret < 0 ? ret : 0;
+ return ret;
}
int drm_authmagic(struct drm_device *dev, void *data,
@@ -84,10 +83,10 @@ int drm_authmagic(struct drm_device *dev, void *data,
DRM_DEBUG("%u\n", auth->magic);
mutex_lock(&dev->master_mutex);
- file = idr_find(&file_priv->master->magic_map, auth->magic);
+ file = xa_load(&file_priv->master->magic_map, auth->magic);
if (file) {
file->authenticated = 1;
- idr_replace(&file_priv->master->magic_map, NULL, auth->magic);
+ xa_store(&file_priv->master->magic_map, auth->magic, NULL, 0);
}
mutex_unlock(&dev->master_mutex);
@@ -105,7 +104,7 @@ struct drm_master *drm_master_create(struct drm_device *dev)
kref_init(&master->refcount);
spin_lock_init(&master->lock.spinlock);
init_waitqueue_head(&master->lock.lock_queue);
- idr_init(&master->magic_map);
+ xa_init_flags(&master->magic_map, XA_FLAGS_ALLOC1);
master->dev = dev;
/* initialize the tree of output resource lessees */
@@ -269,7 +268,7 @@ void drm_master_release(struct drm_file *file_priv)
mutex_lock(&dev->master_mutex);
if (file_priv->magic)
- idr_remove(&file_priv->master->magic_map, file_priv->magic);
+ xa_erase(&file_priv->master->magic_map, file_priv->magic);
if (!drm_is_current_master(file_priv))
goto out;
@@ -348,7 +347,6 @@ static void drm_master_destroy(struct kref *kref)
drm_legacy_master_rmmaps(dev, master);
- idr_destroy(&master->magic_map);
idr_destroy(&master->leases);
idr_destroy(&master->lessee_idr);
@@ -76,10 +76,9 @@ struct drm_master {
*/
int unique_len;
/**
- * @magic_map: Map of used authentication tokens. Protected by
- * &drm_device.master_mutex.
+ * @magic_map: Map of used authentication tokens.
*/
- struct idr magic_map;
+ struct xarray magic_map;
struct drm_lock_data lock;
void *driver_priv;
Signed-off-by: Matthew Wilcox <willy@infradead.org> --- drivers/gpu/drm/drm_auth.c | 18 ++++++++---------- include/drm/drm_auth.h | 5 ++--- 2 files changed, 10 insertions(+), 13 deletions(-)