[PATCH 29/34] drm/vc4: Convert perfmon IDR to XArray

Matthew Wilcox willy at infradead.org
Thu Feb 21 18:42:16 UTC 2019


Signed-off-by: Matthew Wilcox <willy at infradead.org>
---
 drivers/gpu/drm/vc4/vc4_drv.h     |  2 +-
 drivers/gpu/drm/vc4/vc4_perfmon.c | 33 +++++++++++--------------------
 2 files changed, 13 insertions(+), 22 deletions(-)

diff --git a/drivers/gpu/drm/vc4/vc4_drv.h b/drivers/gpu/drm/vc4/vc4_drv.h
index 4f87b03f837d..845b84d27f82 100644
--- a/drivers/gpu/drm/vc4/vc4_drv.h
+++ b/drivers/gpu/drm/vc4/vc4_drv.h
@@ -561,7 +561,7 @@ struct vc4_exec_info {
  */
 struct vc4_file {
 	struct {
-		struct idr idr;
+		struct xarray array;
 		struct mutex lock;
 	} perfmon;
 };
diff --git a/drivers/gpu/drm/vc4/vc4_perfmon.c b/drivers/gpu/drm/vc4/vc4_perfmon.c
index 437e7a27f21d..d5485821f996 100644
--- a/drivers/gpu/drm/vc4/vc4_perfmon.c
+++ b/drivers/gpu/drm/vc4/vc4_perfmon.c
@@ -12,9 +12,6 @@
 #include "vc4_drv.h"
 #include "vc4_regs.h"
 
-#define VC4_PERFMONID_MIN	1
-#define VC4_PERFMONID_MAX	U32_MAX
-
 void vc4_perfmon_get(struct vc4_perfmon *perfmon)
 {
 	if (perfmon)
@@ -67,7 +64,7 @@ struct vc4_perfmon *vc4_perfmon_find(struct vc4_file *vc4file, int id)
 	struct vc4_perfmon *perfmon;
 
 	mutex_lock(&vc4file->perfmon.lock);
-	perfmon = idr_find(&vc4file->perfmon.idr, id);
+	perfmon = xa_load(&vc4file->perfmon.array, id);
 	vc4_perfmon_get(perfmon);
 	mutex_unlock(&vc4file->perfmon.lock);
 
@@ -77,23 +74,18 @@ struct vc4_perfmon *vc4_perfmon_find(struct vc4_file *vc4file, int id)
 void vc4_perfmon_open_file(struct vc4_file *vc4file)
 {
 	mutex_init(&vc4file->perfmon.lock);
-	idr_init(&vc4file->perfmon.idr);
-}
-
-static int vc4_perfmon_idr_del(int id, void *elem, void *data)
-{
-	struct vc4_perfmon *perfmon = elem;
-
-	vc4_perfmon_put(perfmon);
-
-	return 0;
+	xa_init_flags(&vc4file->perfmon.array, XA_FLAGS_ALLOC1);
 }
 
 void vc4_perfmon_close_file(struct vc4_file *vc4file)
 {
+	struct vc4_perfmon *perfmon;
+	unsigned long index;
+
 	mutex_lock(&vc4file->perfmon.lock);
-	idr_for_each(&vc4file->perfmon.idr, vc4_perfmon_idr_del, NULL);
-	idr_destroy(&vc4file->perfmon.idr);
+	xa_for_each(&vc4file->perfmon.array, index, perfmon)
+		vc4_perfmon_put(perfmon);
+	xa_destroy(&vc4file->perfmon.array);
 	mutex_unlock(&vc4file->perfmon.lock);
 }
 
@@ -130,8 +122,8 @@ int vc4_perfmon_create_ioctl(struct drm_device *dev, void *data,
 	refcount_set(&perfmon->refcnt, 1);
 
 	mutex_lock(&vc4file->perfmon.lock);
-	ret = idr_alloc(&vc4file->perfmon.idr, perfmon, VC4_PERFMONID_MIN,
-			VC4_PERFMONID_MAX, GFP_KERNEL);
+	ret = xa_alloc(&vc4file->perfmon.array, &req->id, perfmon,
+			xa_limit_32b, GFP_KERNEL);
 	mutex_unlock(&vc4file->perfmon.lock);
 
 	if (ret < 0) {
@@ -139,7 +131,6 @@ int vc4_perfmon_create_ioctl(struct drm_device *dev, void *data,
 		return ret;
 	}
 
-	req->id = ret;
 	return 0;
 }
 
@@ -151,7 +142,7 @@ int vc4_perfmon_destroy_ioctl(struct drm_device *dev, void *data,
 	struct vc4_perfmon *perfmon;
 
 	mutex_lock(&vc4file->perfmon.lock);
-	perfmon = idr_remove(&vc4file->perfmon.idr, req->id);
+	perfmon = xa_erase(&vc4file->perfmon.array, req->id);
 	mutex_unlock(&vc4file->perfmon.lock);
 
 	if (!perfmon)
@@ -170,7 +161,7 @@ int vc4_perfmon_get_values_ioctl(struct drm_device *dev, void *data,
 	int ret;
 
 	mutex_lock(&vc4file->perfmon.lock);
-	perfmon = idr_find(&vc4file->perfmon.idr, req->id);
+	perfmon = xa_load(&vc4file->perfmon.array, req->id);
 	vc4_perfmon_get(perfmon);
 	mutex_unlock(&vc4file->perfmon.lock);
 
-- 
2.20.1



More information about the dri-devel mailing list