From: Abdiel Janulgue <abdiel.janul...@linux.intel.com>

This simplifies adding new query item objects.

Signed-off-by: Abdiel Janulgue <abdiel.janul...@linux.intel.com>
Cc: Joonas Lahtinen <joonas.lahti...@linux.intel.com>
---
 drivers/gpu/drm/i915/i915_query.c | 40 ++++++++++++++++++++-----------
 1 file changed, 26 insertions(+), 14 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_query.c 
b/drivers/gpu/drm/i915/i915_query.c
index cbcb957b7141..b4f26605f617 100644
--- a/drivers/gpu/drm/i915/i915_query.c
+++ b/drivers/gpu/drm/i915/i915_query.c
@@ -10,12 +10,33 @@
 #include "i915_query.h"
 #include <uapi/drm/i915_drm.h>
 
+static int init_query_item_check(void* data_ptr, size_t data_sz,
+                                u32 total_length,
+                                struct drm_i915_query_item *query_item)
+{
+       if (query_item->length == 0)
+               return total_length;
+
+       if (query_item->length < total_length)
+               return -EINVAL;
+
+       if (copy_from_user(data_ptr, u64_to_user_ptr(query_item->data_ptr),
+                          data_sz))
+               return -EFAULT;
+
+       if (!access_ok(u64_to_user_ptr(query_item->data_ptr),
+                      total_length))
+               return -EFAULT;
+
+       return 0;
+}
+
 static int query_topology_info(struct drm_i915_private *dev_priv,
                               struct drm_i915_query_item *query_item)
 {
        const struct sseu_dev_info *sseu = &RUNTIME_INFO(dev_priv)->sseu;
        struct drm_i915_query_topology_info topo;
-       u32 slice_length, subslice_length, eu_length, total_length;
+       u32 ret, slice_length, subslice_length, eu_length, total_length;
 
        if (query_item->flags != 0)
                return -EINVAL;
@@ -33,23 +54,14 @@ static int query_topology_info(struct drm_i915_private 
*dev_priv,
 
        total_length = sizeof(topo) + slice_length + subslice_length + 
eu_length;
 
-       if (query_item->length == 0)
-               return total_length;
-
-       if (query_item->length < total_length)
-               return -EINVAL;
-
-       if (copy_from_user(&topo, u64_to_user_ptr(query_item->data_ptr),
-                          sizeof(topo)))
-               return -EFAULT;
+       ret = init_query_item_check(&topo, sizeof(topo), total_length,
+                                   query_item);
+       if (ret != 0)
+               return ret;
 
        if (topo.flags != 0)
                return -EINVAL;
 
-       if (!access_ok(u64_to_user_ptr(query_item->data_ptr),
-                      total_length))
-               return -EFAULT;
-
        memset(&topo, 0, sizeof(topo));
        topo.max_slices = sseu->max_slices;
        topo.max_subslices = sseu->max_subslices;
-- 
2.20.1

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to