]> www.infradead.org Git - users/willy/xarray.git/commitdiff
vfio: Convert group_idr to XArray
authorMatthew Wilcox <willy@infradead.org>
Mon, 18 Feb 2019 23:59:04 +0000 (18:59 -0500)
committerMatthew Wilcox (Oracle) <willy@infradead.org>
Fri, 9 Aug 2019 01:38:18 +0000 (21:38 -0400)
Signed-off-by: Matthew Wilcox <willy@infradead.org>
drivers/vfio/vfio.c

index 388597930b648feafb04fb3a81a1b3ea43c0a749..dbd169f2bfffb994c1f3ce1655e2d1c3303363f1 100644 (file)
@@ -42,7 +42,7 @@ static struct vfio {
        struct list_head                iommu_drivers_list;
        struct mutex                    iommu_drivers_lock;
        struct list_head                group_list;
-       struct idr                      group_idr;
+       struct xarray                   groups;
        struct mutex                    group_lock;
        struct cdev                     group_cdev;
        dev_t                           group_devt;
@@ -270,12 +270,13 @@ EXPORT_SYMBOL_GPL(vfio_unregister_iommu_driver);
  */
 static int vfio_alloc_group_minor(struct vfio_group *group)
 {
-       return idr_alloc(&vfio.group_idr, group, 0, MINORMASK + 1, GFP_KERNEL);
+       return xa_alloc(&vfio.groups, &group->minor, group,
+                       XA_LIMIT(0, MINORMASK), GFP_KERNEL);
 }
 
 static void vfio_free_group_minor(int minor)
 {
-       idr_remove(&vfio.group_idr, minor);
+       xa_erase(&vfio.groups, minor);
 }
 
 static int vfio_iommu_group_notifier(struct notifier_block *nb,
@@ -324,7 +325,7 @@ static struct vfio_group *vfio_create_group(struct iommu_group *iommu_group)
 {
        struct vfio_group *group, *tmp;
        struct device *dev;
-       int ret, minor;
+       int ret;
 
        group = kzalloc(sizeof(*group), GFP_KERNEL);
        if (!group)
@@ -370,23 +371,22 @@ static struct vfio_group *vfio_create_group(struct iommu_group *iommu_group)
                }
        }
 
-       minor = vfio_alloc_group_minor(group);
-       if (minor < 0) {
+       ret = vfio_alloc_group_minor(group);
+       if (ret < 0) {
                vfio_group_unlock_and_free(group);
-               return ERR_PTR(minor);
+               return ERR_PTR(ret);
        }
 
        dev = device_create(vfio.class, NULL,
-                           MKDEV(MAJOR(vfio.group_devt), minor),
+                           MKDEV(MAJOR(vfio.group_devt), group->minor),
                            group, "%s%d", group->noiommu ? "noiommu-" : "",
                            iommu_group_id(iommu_group));
        if (IS_ERR(dev)) {
-               vfio_free_group_minor(minor);
+               vfio_free_group_minor(group->minor);
                vfio_group_unlock_and_free(group);
                return ERR_CAST(dev);
        }
 
-       group->minor = minor;
        group->dev = dev;
 
        list_add(&group->vfio_next, &vfio.group_list);
@@ -502,7 +502,7 @@ static struct vfio_group *vfio_group_get_from_minor(int minor)
        struct vfio_group *group;
 
        mutex_lock(&vfio.group_lock);
-       group = idr_find(&vfio.group_idr, minor);
+       group = xa_load(&vfio.groups, minor);
        if (!group) {
                mutex_unlock(&vfio.group_lock);
                return NULL;
@@ -2181,7 +2181,7 @@ static int __init vfio_init(void)
 {
        int ret;
 
-       idr_init(&vfio.group_idr);
+       xa_init_flags(&vfio.groups, XA_FLAGS_ALLOC);
        mutex_init(&vfio.group_lock);
        mutex_init(&vfio.iommu_drivers_lock);
        INIT_LIST_HEAD(&vfio.group_list);
@@ -2236,7 +2236,6 @@ static void __exit vfio_cleanup(void)
 #ifdef CONFIG_VFIO_NOIOMMU
        vfio_unregister_iommu_driver(&vfio_noiommu_ops);
 #endif
-       idr_destroy(&vfio.group_idr);
        cdev_del(&vfio.group_cdev);
        unregister_chrdev_region(vfio.group_devt, MINORMASK + 1);
        class_destroy(vfio.class);