]> www.infradead.org Git - users/willy/xarray.git/commitdiff
drm/qxl: Convert release_idr to XArray
authorMatthew Wilcox <willy@infradead.org>
Thu, 14 Feb 2019 21:55:20 +0000 (16:55 -0500)
committerMatthew Wilcox (Oracle) <willy@infradead.org>
Thu, 8 Aug 2019 03:39:34 +0000 (23:39 -0400)
Signed-off-by: Matthew Wilcox <willy@infradead.org>
drivers/gpu/drm/qxl/qxl_drv.h
drivers/gpu/drm/qxl/qxl_kms.c
drivers/gpu/drm/qxl/qxl_release.c

index 2896bb6fdbf4c929be54143bb5cc5d4cd9a1cb3c..66df8232091518ea6a9ff7cd91275d3807d6305e 100644 (file)
@@ -233,9 +233,8 @@ struct qxl_device {
        struct qxl_memslot surfaces_slot;
 
        spinlock_t      release_lock;
-       struct idr      release_idr;
+       struct xarray   releases;
        uint32_t        release_seqno;
-       spinlock_t release_idr_lock;
        struct mutex    async_io_mutex;
        unsigned int last_sent_io_cmd;
 
index bee61fa2c9bcb33f2d6166d1f5bf6aea22b38830..e649bad39cd65efa1deb7c57d8ff50436f74a9f3 100644 (file)
@@ -237,8 +237,7 @@ int qxl_device_init(struct qxl_device *qdev,
                goto cursor_ring_free;
        }
 
-       idr_init(&qdev->release_idr);
-       spin_lock_init(&qdev->release_idr_lock);
+       xa_init_flags(&qdev->releases, XA_FLAGS_ALLOC1);
        spin_lock_init(&qdev->release_lock);
 
        idr_init(&qdev->surf_id_idr);
index 49f9a9385393a3c51de9c07f4e881427196da844..0544115179a376d3c7134ce8b6923dd5db1a4054 100644 (file)
@@ -121,7 +121,7 @@ qxl_release_alloc(struct qxl_device *qdev, int type,
                  struct qxl_release **ret)
 {
        struct qxl_release *release;
-       int handle;
+       int err;
        size_t size = sizeof(*release);
 
        release = kmalloc(size, GFP_KERNEL);
@@ -135,21 +135,19 @@ qxl_release_alloc(struct qxl_device *qdev, int type,
        release->surface_release_id = 0;
        INIT_LIST_HEAD(&release->bos);
 
-       idr_preload(GFP_KERNEL);
-       spin_lock(&qdev->release_idr_lock);
-       handle = idr_alloc(&qdev->release_idr, release, 1, 0, GFP_NOWAIT);
+       xa_lock(&qdev->releases);
+       err = __xa_alloc(&qdev->releases, &release->id, release, xa_limit_31b,
+                       GFP_KERNEL);
        release->base.seqno = ++qdev->release_seqno;
-       spin_unlock(&qdev->release_idr_lock);
-       idr_preload_end();
-       if (handle < 0) {
+       xa_unlock(&qdev->releases);
+       if (err < 0) {
                kfree(release);
                *ret = NULL;
-               return handle;
+               return err;
        }
        *ret = release;
-       DRM_DEBUG_DRIVER("allocated release %d\n", handle);
-       release->id = handle;
-       return handle;
+       DRM_DEBUG_DRIVER("allocated release %d\n", release->id);
+       return release->id;
 }
 
 static void
@@ -178,9 +176,7 @@ qxl_release_free(struct qxl_device *qdev,
        if (release->surface_release_id)
                qxl_surface_id_dealloc(qdev, release->surface_release_id);
 
-       spin_lock(&qdev->release_idr_lock);
-       idr_remove(&qdev->release_idr, release->id);
-       spin_unlock(&qdev->release_idr_lock);
+       xa_erase(&qdev->releases, release->id);
 
        if (release->base.ops) {
                WARN_ON(list_empty(&release->bos));
@@ -288,14 +284,14 @@ int qxl_alloc_surface_release_reserved(struct qxl_device *qdev,
                                       struct qxl_release **release)
 {
        if (surface_cmd_type == QXL_SURFACE_CMD_DESTROY && create_rel) {
-               int idr_ret;
+               int id;
                struct qxl_bo *bo;
                union qxl_release_info *info;
 
                /* stash the release after the create command */
-               idr_ret = qxl_release_alloc(qdev, QXL_RELEASE_SURFACE_CMD, release);
-               if (idr_ret < 0)
-                       return idr_ret;
+               id = qxl_release_alloc(qdev, QXL_RELEASE_SURFACE_CMD, release);
+               if (id < 0)
+                       return id;
                bo = create_rel->release_bo;
 
                (*release)->release_bo = bo;
@@ -304,7 +300,7 @@ int qxl_alloc_surface_release_reserved(struct qxl_device *qdev,
                qxl_release_list_add(*release, bo);
 
                info = qxl_release_map(qdev, *release);
-               info->id = idr_ret;
+               info->id = id;
                qxl_release_unmap(qdev, *release, info);
                return 0;
        }
@@ -318,7 +314,7 @@ int qxl_alloc_release_reserved(struct qxl_device *qdev, unsigned long size,
                                       struct qxl_bo **rbo)
 {
        struct qxl_bo *bo;
-       int idr_ret;
+       int id;
        int ret = 0;
        union qxl_release_info *info;
        int cur_idx;
@@ -334,11 +330,11 @@ int qxl_alloc_release_reserved(struct qxl_device *qdev, unsigned long size,
                return -EINVAL;
        }
 
-       idr_ret = qxl_release_alloc(qdev, type, release);
-       if (idr_ret < 0) {
+       id = qxl_release_alloc(qdev, type, release);
+       if (id < 0) {
                if (rbo)
                        *rbo = NULL;
-               return idr_ret;
+               return id;
        }
 
        mutex_lock(&qdev->release_mutex);
@@ -375,7 +371,7 @@ int qxl_alloc_release_reserved(struct qxl_device *qdev, unsigned long size,
        }
 
        info = qxl_release_map(qdev, *release);
-       info->id = idr_ret;
+       info->id = id;
        qxl_release_unmap(qdev, *release, info);
 
        return ret;
@@ -386,13 +382,9 @@ struct qxl_release *qxl_release_from_id_locked(struct qxl_device *qdev,
 {
        struct qxl_release *release;
 
-       spin_lock(&qdev->release_idr_lock);
-       release = idr_find(&qdev->release_idr, id);
-       spin_unlock(&qdev->release_idr_lock);
-       if (!release) {
-               DRM_ERROR("failed to find id in release_idr\n");
-               return NULL;
-       }
+       release = xa_load(&qdev->releases, id);
+       if (!release)
+               DRM_ERROR("failed to find id in releases\n");
 
        return release;
 }