]> www.infradead.org Git - users/willy/xarray.git/commitdiff
drm/amdgpu: Convert bo_list_handles to XArray
authorMatthew Wilcox <willy@infradead.org>
Thu, 14 Feb 2019 17:36:10 +0000 (12:36 -0500)
committerMatthew Wilcox (Oracle) <willy@infradead.org>
Thu, 8 Aug 2019 03:39:31 +0000 (23:39 -0400)
Signed-off-by: Matthew Wilcox <willy@infradead.org>
drivers/gpu/drm/amd/amdgpu/amdgpu.h
drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c
drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c

index 8199d201b43a477a8460f63452a5494ca403b554..f9c379d664585fb954010ee6900db9c229ee26a4 100644 (file)
@@ -417,8 +417,7 @@ struct amdgpu_fpriv {
        struct amdgpu_vm        vm;
        struct amdgpu_bo_va     *prt_va;
        struct amdgpu_bo_va     *csa_va;
-       struct mutex            bo_list_lock;
-       struct idr              bo_list_handles;
+       struct xarray           bo_list_handles;
        struct amdgpu_ctx_mgr   ctx_mgr;
 };
 
index 7bcf86c61999513c13c72bcdc1fccc3c24633ff9..065535137a3a3b561fe5d6196f4615bedafd177c 100644 (file)
@@ -154,9 +154,7 @@ static void amdgpu_bo_list_destroy(struct amdgpu_fpriv *fpriv, int id)
 {
        struct amdgpu_bo_list *list;
 
-       mutex_lock(&fpriv->bo_list_lock);
-       list = idr_remove(&fpriv->bo_list_handles, id);
-       mutex_unlock(&fpriv->bo_list_lock);
+       list = xa_erase(&fpriv->bo_list_handles, id);
        if (list)
                kref_put(&list->refcount, amdgpu_bo_list_free);
 }
@@ -165,7 +163,7 @@ int amdgpu_bo_list_get(struct amdgpu_fpriv *fpriv, int id,
                       struct amdgpu_bo_list **result)
 {
        rcu_read_lock();
-       *result = idr_find(&fpriv->bo_list_handles, id);
+       *result = xa_load(&fpriv->bo_list_handles, id);
 
        if (*result && kref_get_unless_zero(&(*result)->refcount)) {
                rcu_read_unlock();
@@ -279,15 +277,13 @@ int amdgpu_bo_list_ioctl(struct drm_device *dev, void *data,
                if (r)
                        goto error_free;
 
-               mutex_lock(&fpriv->bo_list_lock);
-               r = idr_alloc(&fpriv->bo_list_handles, list, 1, 0, GFP_KERNEL);
-               mutex_unlock(&fpriv->bo_list_lock);
+               r = xa_alloc(&fpriv->bo_list_handles, &handle, list,
+                               xa_limit_31b, GFP_KERNEL);
                if (r < 0) {
                        amdgpu_bo_list_put(list);
                        return r;
                }
 
-               handle = r;
                break;
 
        case AMDGPU_BO_LIST_OP_DESTROY:
@@ -301,13 +297,11 @@ int amdgpu_bo_list_ioctl(struct drm_device *dev, void *data,
                if (r)
                        goto error_free;
 
-               mutex_lock(&fpriv->bo_list_lock);
-               old = idr_replace(&fpriv->bo_list_handles, list, handle);
-               mutex_unlock(&fpriv->bo_list_lock);
-
-               if (IS_ERR(old)) {
+               old = xa_store(&fpriv->bo_list_handles, handle, list,
+                               GFP_KERNEL);
+               if (xa_is_err(old)) {
                        amdgpu_bo_list_put(list);
-                       r = PTR_ERR(old);
+                       r = xa_err(old);
                        goto error_free;
                }
 
index 0cf7e8606fd3d8e6df5f43cc15d33536e512d4bb..e138517a8093362ad84baae3e0da9f368c9f0515 100644 (file)
@@ -1019,8 +1019,7 @@ int amdgpu_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv)
                        goto error_vm;
        }
 
-       mutex_init(&fpriv->bo_list_lock);
-       idr_init(&fpriv->bo_list_handles);
+       xa_init_flags(&fpriv->bo_list_handles, XA_FLAGS_ALLOC1);
 
        amdgpu_ctx_mgr_init(&fpriv->ctx_mgr);
 
@@ -1059,7 +1058,7 @@ void amdgpu_driver_postclose_kms(struct drm_device *dev,
        struct amdgpu_bo_list *list;
        struct amdgpu_bo *pd;
        unsigned int pasid;
-       int handle;
+       unsigned long handle;
 
        if (!fpriv)
                return;
@@ -1091,11 +1090,10 @@ void amdgpu_driver_postclose_kms(struct drm_device *dev,
                amdgpu_pasid_free_delayed(pd->tbo.resv, pasid);
        amdgpu_bo_unref(&pd);
 
-       idr_for_each_entry(&fpriv->bo_list_handles, list, handle)
+       xa_for_each(&fpriv->bo_list_handles, handle, list)
                amdgpu_bo_list_put(list);
 
-       idr_destroy(&fpriv->bo_list_handles);
-       mutex_destroy(&fpriv->bo_list_lock);
+       xa_destroy(&fpriv->bo_list_handles);
 
        kfree(fpriv);
        file_priv->driver_priv = NULL;