diff mbox series

[1/2] drm/i915/perf: store the associated engine of a stream

Message ID 20191010072752.18495-1-chris@chris-wilson.co.uk (mailing list archive)
State New, archived
Headers show
Series [1/2] drm/i915/perf: store the associated engine of a stream | expand

Commit Message

Chris Wilson Oct. 10, 2019, 7:27 a.m. UTC
From: Lionel Landwerlin <lionel.g.landwerlin@intel.com>

We'll use this information later to verify that a client trying to
reconfigure the stream does so on the right engine. For now, we want to
pull the knowledge of which engine we use into a central property.

Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
---
 drivers/gpu/drm/i915/i915_perf.c       | 30 ++++++++++++++++++++++----
 drivers/gpu/drm/i915/i915_perf_types.h |  5 +++++
 2 files changed, 31 insertions(+), 4 deletions(-)

Comments

Lionel Landwerlin Oct. 10, 2019, 2:57 p.m. UTC | #1
On 10/10/2019 10:27, Chris Wilson wrote:
> From: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
>
> We'll use this information later to verify that a client trying to
> reconfigure the stream does so on the right engine. For now, we want to
> pull the knowledge of which engine we use into a central property.
>
> Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>


Your changes look fine :

Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>


Thanks!


> ---
>   drivers/gpu/drm/i915/i915_perf.c       | 30 ++++++++++++++++++++++----
>   drivers/gpu/drm/i915/i915_perf_types.h |  5 +++++
>   2 files changed, 31 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_perf.c b/drivers/gpu/drm/i915/i915_perf.c
> index 5a34cad7d824..1a5c6591b9bb 100644
> --- a/drivers/gpu/drm/i915/i915_perf.c
> +++ b/drivers/gpu/drm/i915/i915_perf.c
> @@ -197,6 +197,7 @@
>   
>   #include "gem/i915_gem_context.h"
>   #include "gem/i915_gem_pm.h"
> +#include "gt/intel_engine_user.h"
>   #include "gt/intel_lrc_reg.h"
>   
>   #include "i915_drv.h"
> @@ -347,6 +348,7 @@ static const struct i915_oa_format gen8_plus_oa_formats[I915_OA_FORMAT_MAX] = {
>    * @oa_format: An OA unit HW report format
>    * @oa_periodic: Whether to enable periodic OA unit sampling
>    * @oa_period_exponent: The OA unit sampling period is derived from this
> + * @engine: The engine (typically rcs0) being monitored by the OA unit
>    *
>    * As read_properties_unlocked() enumerates and validates the properties given
>    * to open a stream of metrics the configuration is built up in the structure
> @@ -363,6 +365,8 @@ struct perf_open_properties {
>   	int oa_format;
>   	bool oa_periodic;
>   	int oa_period_exponent;
> +
> +	struct intel_engine_cs *engine;
>   };
>   
>   static enum hrtimer_restart oa_poll_check_timer_cb(struct hrtimer *hrtimer);
> @@ -1205,7 +1209,7 @@ static struct intel_context *oa_pin_context(struct i915_perf_stream *stream)
>   	int err;
>   
>   	for_each_gem_engine(ce, i915_gem_context_lock_engines(ctx), it) {
> -		if (ce->engine->class != RENDER_CLASS)
> +		if (ce->engine != stream->engine) /* first match! */
>   			continue;
>   
>   		/*
> @@ -2127,7 +2131,13 @@ static int i915_oa_stream_init(struct i915_perf_stream *stream,
>   	int format_size;
>   	int ret;
>   
> -	/* If the sysfs metrics/ directory wasn't registered for some
> +	if (!props->engine) {
> +		DRM_DEBUG("OA engine not specified\n");
> +		return -EINVAL;
> +	}
> +
> +	/*
> +	 * If the sysfs metrics/ directory wasn't registered for some
>   	 * reason then don't let userspace try their luck with config
>   	 * IDs
>   	 */
> @@ -2146,7 +2156,8 @@ static int i915_oa_stream_init(struct i915_perf_stream *stream,
>   		return -ENODEV;
>   	}
>   
> -	/* To avoid the complexity of having to accurately filter
> +	/*
> +	 * To avoid the complexity of having to accurately filter
>   	 * counter reports and marshal to the appropriate client
>   	 * we currently only allow exclusive access
>   	 */
> @@ -2160,6 +2171,9 @@ static int i915_oa_stream_init(struct i915_perf_stream *stream,
>   		return -EINVAL;
>   	}
>   
> +	stream->engine = props->engine;
> +	stream->gt = stream->engine->gt;
> +
>   	stream->sample_size = sizeof(struct drm_i915_perf_record_header);
>   
>   	format_size = perf->oa_formats[props->oa_format].size;
> @@ -2711,7 +2725,6 @@ i915_perf_open_ioctl_locked(struct i915_perf *perf,
>   	}
>   
>   	stream->perf = perf;
> -	stream->gt = &perf->i915->gt;
>   	stream->ctx = specific_ctx;
>   
>   	ret = i915_oa_stream_init(stream, param, props);
> @@ -2796,6 +2809,15 @@ static int read_properties_unlocked(struct i915_perf *perf,
>   		return -EINVAL;
>   	}
>   
> +	/* At the moment we only support using i915-perf on the RCS. */
> +	props->engine = intel_engine_lookup_user(perf->i915,
> +						 I915_ENGINE_CLASS_RENDER,
> +						 0);
> +	if (!props->engine) {
> +		DRM_DEBUG("No RENDER-capable engines\n");
> +		return -EINVAL;
> +	}
> +
>   	/* Considering that ID = 0 is reserved and assuming that we don't
>   	 * (currently) expect any configurations to ever specify duplicate
>   	 * values for a particular property ID then the last _PROP_MAX value is
> diff --git a/drivers/gpu/drm/i915/i915_perf_types.h b/drivers/gpu/drm/i915/i915_perf_types.h
> index 2d17059d32ee..82cd3b295037 100644
> --- a/drivers/gpu/drm/i915/i915_perf_types.h
> +++ b/drivers/gpu/drm/i915/i915_perf_types.h
> @@ -140,6 +140,11 @@ struct i915_perf_stream {
>   	 */
>   	intel_wakeref_t wakeref;
>   
> +	/**
> +	 * @engine: Engine associated with this performance stream.
> +	 */
> +	struct intel_engine_cs *engine;
> +
>   	/**
>   	 * @sample_flags: Flags representing the `DRM_I915_PERF_PROP_SAMPLE_*`
>   	 * properties given when opening a stream, representing the contents
Chris Wilson Oct. 10, 2019, 3:04 p.m. UTC | #2
Quoting Lionel Landwerlin (2019-10-10 15:57:32)
> On 10/10/2019 10:27, Chris Wilson wrote:
> > From: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
> >
> > We'll use this information later to verify that a client trying to
> > reconfigure the stream does so on the right engine. For now, we want to
> > pull the knowledge of which engine we use into a central property.
> >
> > Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
> 
> 
> Your changes look fine :
> 
> Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>

And the queue gradually shrinks.
-Chris
diff mbox series

Patch

diff --git a/drivers/gpu/drm/i915/i915_perf.c b/drivers/gpu/drm/i915/i915_perf.c
index 5a34cad7d824..1a5c6591b9bb 100644
--- a/drivers/gpu/drm/i915/i915_perf.c
+++ b/drivers/gpu/drm/i915/i915_perf.c
@@ -197,6 +197,7 @@ 
 
 #include "gem/i915_gem_context.h"
 #include "gem/i915_gem_pm.h"
+#include "gt/intel_engine_user.h"
 #include "gt/intel_lrc_reg.h"
 
 #include "i915_drv.h"
@@ -347,6 +348,7 @@  static const struct i915_oa_format gen8_plus_oa_formats[I915_OA_FORMAT_MAX] = {
  * @oa_format: An OA unit HW report format
  * @oa_periodic: Whether to enable periodic OA unit sampling
  * @oa_period_exponent: The OA unit sampling period is derived from this
+ * @engine: The engine (typically rcs0) being monitored by the OA unit
  *
  * As read_properties_unlocked() enumerates and validates the properties given
  * to open a stream of metrics the configuration is built up in the structure
@@ -363,6 +365,8 @@  struct perf_open_properties {
 	int oa_format;
 	bool oa_periodic;
 	int oa_period_exponent;
+
+	struct intel_engine_cs *engine;
 };
 
 static enum hrtimer_restart oa_poll_check_timer_cb(struct hrtimer *hrtimer);
@@ -1205,7 +1209,7 @@  static struct intel_context *oa_pin_context(struct i915_perf_stream *stream)
 	int err;
 
 	for_each_gem_engine(ce, i915_gem_context_lock_engines(ctx), it) {
-		if (ce->engine->class != RENDER_CLASS)
+		if (ce->engine != stream->engine) /* first match! */
 			continue;
 
 		/*
@@ -2127,7 +2131,13 @@  static int i915_oa_stream_init(struct i915_perf_stream *stream,
 	int format_size;
 	int ret;
 
-	/* If the sysfs metrics/ directory wasn't registered for some
+	if (!props->engine) {
+		DRM_DEBUG("OA engine not specified\n");
+		return -EINVAL;
+	}
+
+	/*
+	 * If the sysfs metrics/ directory wasn't registered for some
 	 * reason then don't let userspace try their luck with config
 	 * IDs
 	 */
@@ -2146,7 +2156,8 @@  static int i915_oa_stream_init(struct i915_perf_stream *stream,
 		return -ENODEV;
 	}
 
-	/* To avoid the complexity of having to accurately filter
+	/*
+	 * To avoid the complexity of having to accurately filter
 	 * counter reports and marshal to the appropriate client
 	 * we currently only allow exclusive access
 	 */
@@ -2160,6 +2171,9 @@  static int i915_oa_stream_init(struct i915_perf_stream *stream,
 		return -EINVAL;
 	}
 
+	stream->engine = props->engine;
+	stream->gt = stream->engine->gt;
+
 	stream->sample_size = sizeof(struct drm_i915_perf_record_header);
 
 	format_size = perf->oa_formats[props->oa_format].size;
@@ -2711,7 +2725,6 @@  i915_perf_open_ioctl_locked(struct i915_perf *perf,
 	}
 
 	stream->perf = perf;
-	stream->gt = &perf->i915->gt;
 	stream->ctx = specific_ctx;
 
 	ret = i915_oa_stream_init(stream, param, props);
@@ -2796,6 +2809,15 @@  static int read_properties_unlocked(struct i915_perf *perf,
 		return -EINVAL;
 	}
 
+	/* At the moment we only support using i915-perf on the RCS. */
+	props->engine = intel_engine_lookup_user(perf->i915,
+						 I915_ENGINE_CLASS_RENDER,
+						 0);
+	if (!props->engine) {
+		DRM_DEBUG("No RENDER-capable engines\n");
+		return -EINVAL;
+	}
+
 	/* Considering that ID = 0 is reserved and assuming that we don't
 	 * (currently) expect any configurations to ever specify duplicate
 	 * values for a particular property ID then the last _PROP_MAX value is
diff --git a/drivers/gpu/drm/i915/i915_perf_types.h b/drivers/gpu/drm/i915/i915_perf_types.h
index 2d17059d32ee..82cd3b295037 100644
--- a/drivers/gpu/drm/i915/i915_perf_types.h
+++ b/drivers/gpu/drm/i915/i915_perf_types.h
@@ -140,6 +140,11 @@  struct i915_perf_stream {
 	 */
 	intel_wakeref_t wakeref;
 
+	/**
+	 * @engine: Engine associated with this performance stream.
+	 */
+	struct intel_engine_cs *engine;
+
 	/**
 	 * @sample_flags: Flags representing the `DRM_I915_PERF_PROP_SAMPLE_*`
 	 * properties given when opening a stream, representing the contents