diff mbox series

drm/i915/gsc: Mark internal GSC engine with reserved uabi class

Message ID 20231115110216.267138-1-tvrtko.ursulin@linux.intel.com (mailing list archive)
State New, archived
Headers show
Series drm/i915/gsc: Mark internal GSC engine with reserved uabi class | expand

Commit Message

Tvrtko Ursulin Nov. 15, 2023, 11:02 a.m. UTC
From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>

The GSC CS is not exposed to the user, so we skipped assigning a uabi
class number for it. However, the trace logs use the uabi class and
instance to identify the engine, so leaving uabi class unset makes the
GSC CS show up as the RCS in those logs.

Given that the engine is not exposed to the user, we can't add a new
case in the uabi enum, so we insted internally define a kernel
internal class as -1.

At the same time remove special handling for the name and complete
the uabi_classes array so internal class is automatically correctly
assigned.

Engine will show as 65535:0 other0 in the logs/traces which should
be unique enough.

Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Fixes: 194babe26bdc ("drm/i915/mtl: don't expose GSC command streamer to the user")
Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Cc: Alan Previn <alan.previn.teres.alexis@intel.com>
Cc: Matt Roper <matthew.d.roper@intel.com>
---
Daniele I borrowed most of your commit text as is, hope you don't mind but
I was lazy. See if you like this solution. It is also untested so lets see.
---
 drivers/gpu/drm/i915/gt/intel_engine_user.c | 37 ++++++++++++---------
 1 file changed, 21 insertions(+), 16 deletions(-)

Comments

kernel test robot Nov. 15, 2023, 5:09 p.m. UTC | #1
Hi Tvrtko,

kernel test robot noticed the following build warnings:

[auto build test WARNING on drm-intel/for-linux-next-fixes]
[also build test WARNING on drm-tip/drm-tip drm/drm-next drm-exynos/exynos-drm-next drm-misc/drm-misc-next linus/master v6.7-rc1 next-20231115]
[cannot apply to drm-intel/for-linux-next]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Tvrtko-Ursulin/drm-i915-gsc-Mark-internal-GSC-engine-with-reserved-uabi-class/20231115-190507
base:   git://anongit.freedesktop.org/drm-intel for-linux-next-fixes
patch link:    https://lore.kernel.org/r/20231115110216.267138-1-tvrtko.ursulin%40linux.intel.com
patch subject: [PATCH] drm/i915/gsc: Mark internal GSC engine with reserved uabi class
config: x86_64-rhel-8.3-rust (https://download.01.org/0day-ci/archive/20231116/202311160136.EtOH3ghf-lkp@intel.com/config)
compiler: clang version 16.0.4 (https://github.com/llvm/llvm-project.git ae42196bc493ffe877a7e3dff8be32035dea4d07)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20231116/202311160136.EtOH3ghf-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202311160136.EtOH3ghf-lkp@intel.com/

All warnings (new ones prefixed by >>):

>> drivers/gpu/drm/i915/gt/intel_engine_user.c:225:26: warning: result of comparison of constant -1 with expression of type 'u16' (aka 'unsigned short') is always false [-Wtautological-constant-out-of-range-compare]
                   if (engine->uabi_class == I915_NO_UABI_CLASS) {
                       ~~~~~~~~~~~~~~~~~~ ^  ~~~~~~~~~~~~~~~~~~
   drivers/gpu/drm/i915/gt/intel_engine_user.c:243:26: warning: result of comparison of constant -1 with expression of type 'u16' (aka 'unsigned short') is always false [-Wtautological-constant-out-of-range-compare]
                   if (engine->uabi_class == I915_NO_UABI_CLASS)
                       ~~~~~~~~~~~~~~~~~~ ^  ~~~~~~~~~~~~~~~~~~
   2 warnings generated.


vim +225 drivers/gpu/drm/i915/gt/intel_engine_user.c

   203	
   204	void intel_engines_driver_register(struct drm_i915_private *i915)
   205	{
   206		u16 name_instance, other_instance = 0;
   207		struct legacy_ring ring = {};
   208		struct list_head *it, *next;
   209		struct rb_node **p, *prev;
   210		LIST_HEAD(engines);
   211	
   212		sort_engines(i915, &engines);
   213	
   214		prev = NULL;
   215		p = &i915->uabi_engines.rb_node;
   216		list_for_each_safe(it, next, &engines) {
   217			struct intel_engine_cs *engine =
   218				container_of(it, typeof(*engine), uabi_list);
   219	
   220			if (intel_gt_has_unrecoverable_error(engine->gt))
   221				continue; /* ignore incomplete engines */
   222	
   223			GEM_BUG_ON(engine->class >= ARRAY_SIZE(uabi_classes));
   224			engine->uabi_class = uabi_classes[engine->class];
 > 225			if (engine->uabi_class == I915_NO_UABI_CLASS) {
   226				name_instance = other_instance++;
   227			} else {
   228				GEM_BUG_ON(engine->uabi_class >=
   229					   ARRAY_SIZE(i915->engine_uabi_class_count));
   230				name_instance =
   231					i915->engine_uabi_class_count[engine->uabi_class]++;
   232			}
   233			engine->uabi_instance = name_instance;
   234	
   235			/*
   236			 * Replace the internal name with the final user and log facing
   237			 * name.
   238			 */
   239			engine_rename(engine,
   240				      intel_engine_class_repr(engine->class),
   241				      name_instance);
   242	
   243			if (engine->uabi_class == I915_NO_UABI_CLASS)
   244				continue;
   245	
   246			rb_link_node(&engine->uabi_node, prev, p);
   247			rb_insert_color(&engine->uabi_node, &i915->uabi_engines);
   248	
   249			GEM_BUG_ON(intel_engine_lookup_user(i915,
   250							    engine->uabi_class,
   251							    engine->uabi_instance) != engine);
   252	
   253			/* Fix up the mapping to match default execbuf::user_map[] */
   254			add_legacy_ring(&ring, engine);
   255	
   256			prev = &engine->uabi_node;
   257			p = &prev->rb_right;
   258		}
   259	
   260		if (IS_ENABLED(CONFIG_DRM_I915_SELFTESTS) &&
   261		    IS_ENABLED(CONFIG_DRM_I915_DEBUG_GEM)) {
   262			struct intel_engine_cs *engine;
   263			unsigned int isolation;
   264			int class, inst;
   265			int errors = 0;
   266	
   267			for (class = 0; class < ARRAY_SIZE(i915->engine_uabi_class_count); class++) {
   268				for (inst = 0; inst < i915->engine_uabi_class_count[class]; inst++) {
   269					engine = intel_engine_lookup_user(i915,
   270									  class, inst);
   271					if (!engine) {
   272						pr_err("UABI engine not found for { class:%d, instance:%d }\n",
   273						       class, inst);
   274						errors++;
   275						continue;
   276					}
   277	
   278					if (engine->uabi_class != class ||
   279					    engine->uabi_instance != inst) {
   280						pr_err("Wrong UABI engine:%s { class:%d, instance:%d } found for { class:%d, instance:%d }\n",
   281						       engine->name,
   282						       engine->uabi_class,
   283						       engine->uabi_instance,
   284						       class, inst);
   285						errors++;
   286						continue;
   287					}
   288				}
   289			}
   290	
   291			/*
   292			 * Make sure that classes with multiple engine instances all
   293			 * share the same basic configuration.
   294			 */
   295			isolation = intel_engines_has_context_isolation(i915);
   296			for_each_uabi_engine(engine, i915) {
   297				unsigned int bit = BIT(engine->uabi_class);
   298				unsigned int expected = engine->default_state ? bit : 0;
   299	
   300				if ((isolation & bit) != expected) {
   301					pr_err("mismatching default context state for class %d on engine %s\n",
   302					       engine->uabi_class, engine->name);
   303					errors++;
   304				}
   305			}
   306	
   307			if (drm_WARN(&i915->drm, errors,
   308				     "Invalid UABI engine mapping found"))
   309				i915->uabi_engines = RB_ROOT;
   310		}
   311	
   312		set_scheduler_caps(i915);
   313	}
   314
Daniele Ceraolo Spurio Nov. 15, 2023, 7:02 p.m. UTC | #2
On 11/15/2023 3:02 AM, Tvrtko Ursulin wrote:
> From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
>
> The GSC CS is not exposed to the user, so we skipped assigning a uabi
> class number for it. However, the trace logs use the uabi class and
> instance to identify the engine, so leaving uabi class unset makes the
> GSC CS show up as the RCS in those logs.
>
> Given that the engine is not exposed to the user, we can't add a new
> case in the uabi enum, so we insted internally define a kernel
> internal class as -1.
>
> At the same time remove special handling for the name and complete
> the uabi_classes array so internal class is automatically correctly
> assigned.
>
> Engine will show as 65535:0 other0 in the logs/traces which should
> be unique enough.
>
> Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
> Fixes: 194babe26bdc ("drm/i915/mtl: don't expose GSC command streamer to the user")
> Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
> Cc: Alan Previn <alan.previn.teres.alexis@intel.com>
> Cc: Matt Roper <matthew.d.roper@intel.com>
> ---
> Daniele I borrowed most of your commit text as is, hope you don't mind but
> I was lazy. See if you like this solution. It is also untested so lets see.

I'm ok with this approach. As you said the naming is unique so we can 
easily identify the engine. I've tested this locally with a small change 
(see below) and I see the expected values in the logs.

> ---
>   drivers/gpu/drm/i915/gt/intel_engine_user.c | 37 ++++++++++++---------
>   1 file changed, 21 insertions(+), 16 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/gt/intel_engine_user.c b/drivers/gpu/drm/i915/gt/intel_engine_user.c
> index 118164ddbb2e..7693ccfac1f9 100644
> --- a/drivers/gpu/drm/i915/gt/intel_engine_user.c
> +++ b/drivers/gpu/drm/i915/gt/intel_engine_user.c
> @@ -41,12 +41,15 @@ void intel_engine_add_user(struct intel_engine_cs *engine)
>   	llist_add(&engine->uabi_llist, &engine->i915->uabi_engines_llist);
>   }
>   
> +#define I915_NO_UABI_CLASS (-1)

I see the lkp is complaining about using this for comparison against a 
u16. When I locally tried to reduce this to u16 my compiler also 
complained that we're assigning it to a u8 in the uabi_classes array, so 
I've just set I915_NO_UABI_CLASS directly to 255 and it all worked as 
expected. With that fix, or an alternative change to work with all the 
involved types:

Reviewed-by: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>

Daniele

> +
>   static const u8 uabi_classes[] = {
>   	[RENDER_CLASS] = I915_ENGINE_CLASS_RENDER,
>   	[COPY_ENGINE_CLASS] = I915_ENGINE_CLASS_COPY,
>   	[VIDEO_DECODE_CLASS] = I915_ENGINE_CLASS_VIDEO,
>   	[VIDEO_ENHANCEMENT_CLASS] = I915_ENGINE_CLASS_VIDEO_ENHANCE,
>   	[COMPUTE_CLASS] = I915_ENGINE_CLASS_COMPUTE,
> +	[OTHER_CLASS] = I915_NO_UABI_CLASS, /* Not exposed to users, no uabi class. */
>   };
>   
>   static int engine_cmp(void *priv, const struct list_head *A,
> @@ -200,6 +203,7 @@ static void engine_rename(struct intel_engine_cs *engine, const char *name, u16
>   
>   void intel_engines_driver_register(struct drm_i915_private *i915)
>   {
> +	u16 name_instance, other_instance = 0;
>   	struct legacy_ring ring = {};
>   	struct list_head *it, *next;
>   	struct rb_node **p, *prev;
> @@ -216,27 +220,28 @@ void intel_engines_driver_register(struct drm_i915_private *i915)
>   		if (intel_gt_has_unrecoverable_error(engine->gt))
>   			continue; /* ignore incomplete engines */
>   
> -		/*
> -		 * We don't want to expose the GSC engine to the users, but we
> -		 * still rename it so it is easier to identify in the debug logs
> -		 */
> -		if (engine->id == GSC0) {
> -			engine_rename(engine, "gsc", 0);
> -			continue;
> -		}
> -
>   		GEM_BUG_ON(engine->class >= ARRAY_SIZE(uabi_classes));
>   		engine->uabi_class = uabi_classes[engine->class];
> +		if (engine->uabi_class == I915_NO_UABI_CLASS) {
> +			name_instance = other_instance++;
> +		} else {
> +			GEM_BUG_ON(engine->uabi_class >=
> +				   ARRAY_SIZE(i915->engine_uabi_class_count));
> +			name_instance =
> +				i915->engine_uabi_class_count[engine->uabi_class]++;
> +		}
> +		engine->uabi_instance = name_instance;
>   
> -		GEM_BUG_ON(engine->uabi_class >=
> -			   ARRAY_SIZE(i915->engine_uabi_class_count));
> -		engine->uabi_instance =
> -			i915->engine_uabi_class_count[engine->uabi_class]++;
> -
> -		/* Replace the internal name with the final user facing name */
> +		/*
> +		 * Replace the internal name with the final user and log facing
> +		 * name.
> +		 */
>   		engine_rename(engine,
>   			      intel_engine_class_repr(engine->class),
> -			      engine->uabi_instance);
> +			      name_instance);
> +
> +		if (engine->uabi_class == I915_NO_UABI_CLASS)
> +			continue;
>   
>   		rb_link_node(&engine->uabi_node, prev, p);
>   		rb_insert_color(&engine->uabi_node, &i915->uabi_engines);
diff mbox series

Patch

diff --git a/drivers/gpu/drm/i915/gt/intel_engine_user.c b/drivers/gpu/drm/i915/gt/intel_engine_user.c
index 118164ddbb2e..7693ccfac1f9 100644
--- a/drivers/gpu/drm/i915/gt/intel_engine_user.c
+++ b/drivers/gpu/drm/i915/gt/intel_engine_user.c
@@ -41,12 +41,15 @@  void intel_engine_add_user(struct intel_engine_cs *engine)
 	llist_add(&engine->uabi_llist, &engine->i915->uabi_engines_llist);
 }
 
+#define I915_NO_UABI_CLASS (-1)
+
 static const u8 uabi_classes[] = {
 	[RENDER_CLASS] = I915_ENGINE_CLASS_RENDER,
 	[COPY_ENGINE_CLASS] = I915_ENGINE_CLASS_COPY,
 	[VIDEO_DECODE_CLASS] = I915_ENGINE_CLASS_VIDEO,
 	[VIDEO_ENHANCEMENT_CLASS] = I915_ENGINE_CLASS_VIDEO_ENHANCE,
 	[COMPUTE_CLASS] = I915_ENGINE_CLASS_COMPUTE,
+	[OTHER_CLASS] = I915_NO_UABI_CLASS, /* Not exposed to users, no uabi class. */
 };
 
 static int engine_cmp(void *priv, const struct list_head *A,
@@ -200,6 +203,7 @@  static void engine_rename(struct intel_engine_cs *engine, const char *name, u16
 
 void intel_engines_driver_register(struct drm_i915_private *i915)
 {
+	u16 name_instance, other_instance = 0;
 	struct legacy_ring ring = {};
 	struct list_head *it, *next;
 	struct rb_node **p, *prev;
@@ -216,27 +220,28 @@  void intel_engines_driver_register(struct drm_i915_private *i915)
 		if (intel_gt_has_unrecoverable_error(engine->gt))
 			continue; /* ignore incomplete engines */
 
-		/*
-		 * We don't want to expose the GSC engine to the users, but we
-		 * still rename it so it is easier to identify in the debug logs
-		 */
-		if (engine->id == GSC0) {
-			engine_rename(engine, "gsc", 0);
-			continue;
-		}
-
 		GEM_BUG_ON(engine->class >= ARRAY_SIZE(uabi_classes));
 		engine->uabi_class = uabi_classes[engine->class];
+		if (engine->uabi_class == I915_NO_UABI_CLASS) {
+			name_instance = other_instance++;
+		} else {
+			GEM_BUG_ON(engine->uabi_class >=
+				   ARRAY_SIZE(i915->engine_uabi_class_count));
+			name_instance =
+				i915->engine_uabi_class_count[engine->uabi_class]++;
+		}
+		engine->uabi_instance = name_instance;
 
-		GEM_BUG_ON(engine->uabi_class >=
-			   ARRAY_SIZE(i915->engine_uabi_class_count));
-		engine->uabi_instance =
-			i915->engine_uabi_class_count[engine->uabi_class]++;
-
-		/* Replace the internal name with the final user facing name */
+		/*
+		 * Replace the internal name with the final user and log facing
+		 * name.
+		 */
 		engine_rename(engine,
 			      intel_engine_class_repr(engine->class),
-			      engine->uabi_instance);
+			      name_instance);
+
+		if (engine->uabi_class == I915_NO_UABI_CLASS)
+			continue;
 
 		rb_link_node(&engine->uabi_node, prev, p);
 		rb_insert_color(&engine->uabi_node, &i915->uabi_engines);