]> git.itanic.dy.fi Git - linux-stable/commitdiff
drm/xe: Add max engine priority to xe query
authorJosé Roberto de Souza <jose.souza@intel.com>
Thu, 23 Mar 2023 19:24:59 +0000 (12:24 -0700)
committerRodrigo Vivi <rodrigo.vivi@intel.com>
Tue, 19 Dec 2023 23:30:21 +0000 (18:30 -0500)
Intel Vulkan driver needs to know what is the maximum priority to fill
a device info struct for applications.

Right now we getting this information by creating a engine and setting
priorities from min to high to know what is the maximum priority for
running process but this leads to info messages to be printed to
dmesg:

xe 0000:03:00.0: [drm] Ioctl argument check failed at drivers/gpu/drm/xe/xe_engine.c:178: value == DRM_SCHED_PRIORITY_HIGH && !capable(CAP_SYS_NICE)

It does not cause any harm but when executing a test suite like
crucible it causes thousands of those messages to be printed.

So here adding one more property to drm_xe_query_config to fetch the
max engine priority.

Cc: Matthew Brost <matthew.brost@intel.com>
Reviewed-by: Matthew Brost <matthew.brost@intel.com>
Signed-off-by: José Roberto de Souza <jose.souza@intel.com>
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
drivers/gpu/drm/xe/xe_engine.c
drivers/gpu/drm/xe/xe_engine.h
drivers/gpu/drm/xe/xe_query.c
include/uapi/drm/xe_drm.h

index 8011f5827cbee593fce59169d73bd49f5bcfabed..141cb223ba02254e5dd13c7169a0ee93b542d973 100644 (file)
@@ -169,14 +169,20 @@ struct xe_engine *xe_engine_lookup(struct xe_file *xef, u32 id)
        return e;
 }
 
+enum xe_engine_priority
+xe_engine_device_get_max_priority(struct xe_device *xe)
+{
+       return capable(CAP_SYS_NICE) ? XE_ENGINE_PRIORITY_HIGH :
+                                      XE_ENGINE_PRIORITY_NORMAL;
+}
+
 static int engine_set_priority(struct xe_device *xe, struct xe_engine *e,
                               u64 value, bool create)
 {
        if (XE_IOCTL_ERR(xe, value > XE_ENGINE_PRIORITY_HIGH))
                return -EINVAL;
 
-       if (XE_IOCTL_ERR(xe, value == XE_ENGINE_PRIORITY_HIGH &&
-                        !capable(CAP_SYS_NICE)))
+       if (XE_IOCTL_ERR(xe, value > xe_engine_device_get_max_priority(xe)))
                return -EPERM;
 
        return e->ops->set_priority(e, value);
index 1cf7f23c4afd66444c0a2a616dc0c4d7caaa355e..b95d9b0408773d53ff821135411304b195b40f0b 100644 (file)
@@ -54,5 +54,6 @@ int xe_engine_set_property_ioctl(struct drm_device *dev, void *data,
                                 struct drm_file *file);
 int xe_engine_get_property_ioctl(struct drm_device *dev, void *data,
                                 struct drm_file *file);
+enum xe_engine_priority xe_engine_device_get_max_priority(struct xe_device *xe);
 
 #endif
index 0f70945176f6005d943d6724c28ff6690ec523c0..dd64ff0d2a575850bcbadedc3aefc4e0ca9611bc 100644 (file)
@@ -12,6 +12,7 @@
 
 #include "xe_bo.h"
 #include "xe_device.h"
+#include "xe_engine.h"
 #include "xe_ggtt.h"
 #include "xe_gt.h"
 #include "xe_guc_hwconfig.h"
@@ -194,6 +195,8 @@ static int query_config(struct xe_device *xe, struct drm_xe_device_query *query)
        config->info[XE_QUERY_CONFIG_GT_COUNT] = xe->info.tile_count;
        config->info[XE_QUERY_CONFIG_MEM_REGION_COUNT] =
                hweight_long(xe->info.mem_region_mask);
+       config->info[XE_QUERY_CONFIG_MAX_ENGINE_PRIORITY] =
+               xe_engine_device_get_max_priority(xe);
 
        if (copy_to_user(query_ptr, config, size)) {
                kfree(config);
index 32a4265de402212aad5f55ae6e12078f8dac5456..b3bcb71068506f712ffb0291e7515cea076aa472 100644 (file)
@@ -184,7 +184,8 @@ struct drm_xe_query_config {
 #define XE_QUERY_CONFIG_VA_BITS                        3
 #define XE_QUERY_CONFIG_GT_COUNT               4
 #define XE_QUERY_CONFIG_MEM_REGION_COUNT       5
-#define XE_QUERY_CONFIG_NUM_PARAM              XE_QUERY_CONFIG_MEM_REGION_COUNT + 1
+#define XE_QUERY_CONFIG_MAX_ENGINE_PRIORITY    6
+#define XE_QUERY_CONFIG_NUM_PARAM              XE_QUERY_CONFIG_MAX_ENGINE_PRIORITY + 1
        __u64 info[];
 };