All of lore.kernel.org
 help / color / mirror / Atom feed
* [RFC 0/6] Per context and per client GPU busyness tracking
@ 2019-05-10 13:22 Tvrtko Ursulin
  2019-05-10 13:22 ` [RFC 1/6] drm/i915: Move intel_engine_context_in/out into intel_lrc.c Tvrtko Ursulin
                   ` (8 more replies)
  0 siblings, 9 replies; 14+ messages in thread
From: Tvrtko Ursulin @ 2019-05-10 13:22 UTC (permalink / raw)
  To: Intel-gfx

From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>

Continuation of the old feature work, rebased to latest drm-tip and adapted to
expose data per engine class - making it compatible with the upcoming Virtual
Engine uapi.

Patch series adds core per context (intel_context) engine busyness tracking and
then also exports this data in sysfs, aggregated to per client and per engine
class.

Exported directory structure looks like this:

root@sc:/sys/class/drm/card0# grep  . -r clients/
clients/21/busy/3:0
clients/21/busy/1:0
clients/21/busy/2:24712242825
clients/21/busy/0:7830006484
clients/21/pid:5989
clients/21/name:gem_wsim
clients/22/busy/3:0
clients/22/busy/1:2778102816
clients/22/busy/2:0
clients/22/busy/0:14434594580
clients/22/pid:5991
clients/22/name:gem_wsim
clients/enable_stats:1

Each client has an opaque unique id named directory, under which are its name,
pid, and another subdirectory containing accumulated engine busyness per engine
class in nanoseconds.

Example output from extended intel_gpu_top:

==========================================================================
intel-gpu-top -  935/ 935 MHz;    0% RC6; 14.73 Watts;     1097 irqs/s

      IMC reads:     1401 MiB/s
     IMC writes:        4 MiB/s

          ENGINE      BUSY                                 MI_SEMA MI_WAIT
     Render/3D/0   63.73% |███████████████████           |      3%      0%
       Blitter/0    9.53% |██▊                           |      6%      0%
         Video/0   39.32% |███████████▊                  |     16%      0%
         Video/1   15.62% |████▋                         |      0%      0%
  VideoEnhance/0    0.00% |                              |      0%      0%

  PID            NAME     RCS          BCS          VCS         VECS
 4084        gem_wsim |█████▌     ||█          ||           ||           |
 4086        gem_wsim |█▌         ||           ||███        ||           |
==========================================================================

Tvrtko Ursulin (6):
  drm/i915: Move intel_engine_context_in/out into intel_lrc.c
  drm/i915: Track per-context engine busyness
  drm/i915: Expose list of clients in sysfs
  drm/i915: Update client name on context create
  drm/i915: Expose per-engine client busyness
  drm/i915: Add sysfs toggle to enable per-client engine stats

 drivers/gpu/drm/i915/gt/intel_context.c       |  21 ++
 drivers/gpu/drm/i915/gt/intel_context.h       |   9 +
 drivers/gpu/drm/i915/gt/intel_context_types.h |   9 +
 drivers/gpu/drm/i915/gt/intel_engine.h        |  55 -----
 drivers/gpu/drm/i915/gt/intel_engine_cs.c     |   8 +
 drivers/gpu/drm/i915/gt/intel_lrc.c           | 107 ++++++++-
 drivers/gpu/drm/i915/i915_drv.h               |  39 ++++
 drivers/gpu/drm/i915/i915_gem.c               | 215 +++++++++++++++++-
 drivers/gpu/drm/i915/i915_gem_context.c       |  18 +-
 drivers/gpu/drm/i915/i915_sysfs.c             |  81 +++++++
 10 files changed, 492 insertions(+), 70 deletions(-)

-- 
2.19.1

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

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [RFC 1/6] drm/i915: Move intel_engine_context_in/out into intel_lrc.c
  2019-05-10 13:22 [RFC 0/6] Per context and per client GPU busyness tracking Tvrtko Ursulin
@ 2019-05-10 13:22 ` Tvrtko Ursulin
  2019-05-10 13:22 ` [RFC 2/6] drm/i915: Track per-context engine busyness Tvrtko Ursulin
                   ` (7 subsequent siblings)
  8 siblings, 0 replies; 14+ messages in thread
From: Tvrtko Ursulin @ 2019-05-10 13:22 UTC (permalink / raw)
  To: Intel-gfx

From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>

Intel_lrc.c is the only caller and so to avoid some header file ordering
issues in future patches move these two over there.

Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
---
 drivers/gpu/drm/i915/gt/intel_engine.h | 55 -------------------------
 drivers/gpu/drm/i915/gt/intel_lrc.c    | 57 ++++++++++++++++++++++++++
 2 files changed, 57 insertions(+), 55 deletions(-)

diff --git a/drivers/gpu/drm/i915/gt/intel_engine.h b/drivers/gpu/drm/i915/gt/intel_engine.h
index 9359b3a7ad9c..3236153b5058 100644
--- a/drivers/gpu/drm/i915/gt/intel_engine.h
+++ b/drivers/gpu/drm/i915/gt/intel_engine.h
@@ -463,61 +463,6 @@ void intel_engine_dump(struct intel_engine_cs *engine,
 struct intel_engine_cs *
 intel_engine_lookup_user(struct drm_i915_private *i915, u8 class, u8 instance);
 
-static inline void intel_engine_context_in(struct intel_engine_cs *engine)
-{
-	unsigned long flags;
-
-	if (READ_ONCE(engine->stats.enabled) == 0)
-		return;
-
-	write_seqlock_irqsave(&engine->stats.lock, flags);
-
-	if (engine->stats.enabled > 0) {
-		if (engine->stats.active++ == 0)
-			engine->stats.start = ktime_get();
-		GEM_BUG_ON(engine->stats.active == 0);
-	}
-
-	write_sequnlock_irqrestore(&engine->stats.lock, flags);
-}
-
-static inline void intel_engine_context_out(struct intel_engine_cs *engine)
-{
-	unsigned long flags;
-
-	if (READ_ONCE(engine->stats.enabled) == 0)
-		return;
-
-	write_seqlock_irqsave(&engine->stats.lock, flags);
-
-	if (engine->stats.enabled > 0) {
-		ktime_t last;
-
-		if (engine->stats.active && --engine->stats.active == 0) {
-			/*
-			 * Decrement the active context count and in case GPU
-			 * is now idle add up to the running total.
-			 */
-			last = ktime_sub(ktime_get(), engine->stats.start);
-
-			engine->stats.total = ktime_add(engine->stats.total,
-							last);
-		} else if (engine->stats.active == 0) {
-			/*
-			 * After turning on engine stats, context out might be
-			 * the first event in which case we account from the
-			 * time stats gathering was turned on.
-			 */
-			last = ktime_sub(ktime_get(), engine->stats.enabled_at);
-
-			engine->stats.total = ktime_add(engine->stats.total,
-							last);
-		}
-	}
-
-	write_sequnlock_irqrestore(&engine->stats.lock, flags);
-}
-
 int intel_enable_engine_stats(struct intel_engine_cs *engine);
 void intel_disable_engine_stats(struct intel_engine_cs *engine);
 
diff --git a/drivers/gpu/drm/i915/gt/intel_lrc.c b/drivers/gpu/drm/i915/gt/intel_lrc.c
index e18623def282..170e394206ca 100644
--- a/drivers/gpu/drm/i915/gt/intel_lrc.c
+++ b/drivers/gpu/drm/i915/gt/intel_lrc.c
@@ -453,6 +453,63 @@ execlists_context_status_change(struct i915_request *rq, unsigned long status)
 				   status, rq);
 }
 
+static inline void
+intel_engine_context_in(struct intel_engine_cs *engine)
+{
+	unsigned long flags;
+
+	if (READ_ONCE(engine->stats.enabled) == 0)
+		return;
+
+	write_seqlock_irqsave(&engine->stats.lock, flags);
+
+	if (engine->stats.enabled > 0) {
+		if (engine->stats.active++ == 0)
+			engine->stats.start = ktime_get();
+		GEM_BUG_ON(engine->stats.active == 0);
+	}
+
+	write_sequnlock_irqrestore(&engine->stats.lock, flags);
+}
+
+static inline void
+intel_engine_context_out(struct intel_engine_cs *engine)
+{
+	unsigned long flags;
+
+	if (READ_ONCE(engine->stats.enabled) == 0)
+		return;
+
+	write_seqlock_irqsave(&engine->stats.lock, flags);
+
+	if (engine->stats.enabled > 0) {
+		ktime_t last;
+
+		if (engine->stats.active && --engine->stats.active == 0) {
+			/*
+			 * Decrement the active context count and in case GPU
+			 * is now idle add up to the running total.
+			 */
+			last = ktime_sub(ktime_get(), engine->stats.start);
+
+			engine->stats.total = ktime_add(engine->stats.total,
+							last);
+		} else if (engine->stats.active == 0) {
+			/*
+			 * After turning on engine stats, context out might be
+			 * the first event in which case we account from the
+			 * time stats gathering was turned on.
+			 */
+			last = ktime_sub(ktime_get(), engine->stats.enabled_at);
+
+			engine->stats.total = ktime_add(engine->stats.total,
+							last);
+		}
+	}
+
+	write_sequnlock_irqrestore(&engine->stats.lock, flags);
+}
+
 inline void
 execlists_user_begin(struct intel_engine_execlists *execlists,
 		     const struct execlist_port *port)
-- 
2.19.1

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

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [RFC 2/6] drm/i915: Track per-context engine busyness
  2019-05-10 13:22 [RFC 0/6] Per context and per client GPU busyness tracking Tvrtko Ursulin
  2019-05-10 13:22 ` [RFC 1/6] drm/i915: Move intel_engine_context_in/out into intel_lrc.c Tvrtko Ursulin
@ 2019-05-10 13:22 ` Tvrtko Ursulin
  2019-05-10 14:22   ` Chris Wilson
  2019-05-10 13:22 ` [RFC 3/6] drm/i915: Expose list of clients in sysfs Tvrtko Ursulin
                   ` (6 subsequent siblings)
  8 siblings, 1 reply; 14+ messages in thread
From: Tvrtko Ursulin @ 2019-05-10 13:22 UTC (permalink / raw)
  To: Intel-gfx

From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>

Some customers want to know how much of the GPU time are their clients
using in order to make dynamic load balancing decisions.

With the hooks already in place which track the overall engine busyness,
we can extend that slightly to split that time between contexts.

v2: Fix accounting for tail updates.
v3: Rebase.
v4: Mark currently running contexts as active on stats enable.
v5: Include some headers to fix the build.
v6: Added fine grained lock.
v7: Convert to seqlock. (Chris Wilson)
v8: Rebase and tidy with helpers.

Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
---
 drivers/gpu/drm/i915/gt/intel_context.c       | 21 +++++++
 drivers/gpu/drm/i915/gt/intel_context.h       |  9 +++
 drivers/gpu/drm/i915/gt/intel_context_types.h |  9 +++
 drivers/gpu/drm/i915/gt/intel_engine_cs.c     |  8 +++
 drivers/gpu/drm/i915/gt/intel_lrc.c           | 62 ++++++++++++++++---
 5 files changed, 99 insertions(+), 10 deletions(-)

diff --git a/drivers/gpu/drm/i915/gt/intel_context.c b/drivers/gpu/drm/i915/gt/intel_context.c
index 5b31e1e05ddd..9adf63ff02e0 100644
--- a/drivers/gpu/drm/i915/gt/intel_context.c
+++ b/drivers/gpu/drm/i915/gt/intel_context.c
@@ -125,6 +125,8 @@ intel_context_init(struct intel_context *ce,
 
 	i915_active_request_init(&ce->active_tracker,
 				 NULL, intel_context_retire);
+
+	seqlock_init(&ce->stats.lock);
 }
 
 static void i915_global_context_shrink(void)
@@ -177,3 +179,22 @@ struct i915_request *intel_context_create_request(struct intel_context *ce)
 
 	return rq;
 }
+
+ktime_t intel_context_get_busy_time(struct intel_context *ce)
+{
+	unsigned int seq;
+	ktime_t total;
+
+	do {
+		seq = read_seqbegin(&ce->stats.lock);
+
+		total = ce->stats.total;
+
+		if (ce->stats.active)
+			total = ktime_add(total,
+					  ktime_sub(ktime_get(),
+						    ce->stats.start));
+	} while (read_seqretry(&ce->stats.lock, seq));
+
+	return total;
+}
diff --git a/drivers/gpu/drm/i915/gt/intel_context.h b/drivers/gpu/drm/i915/gt/intel_context.h
index 63392c88cd98..657dcdce7152 100644
--- a/drivers/gpu/drm/i915/gt/intel_context.h
+++ b/drivers/gpu/drm/i915/gt/intel_context.h
@@ -127,4 +127,13 @@ static inline void intel_context_timeline_unlock(struct intel_context *ce)
 
 struct i915_request *intel_context_create_request(struct intel_context *ce);
 
+static inline void
+__intel_context_stats_start(struct intel_context_stats *stats, ktime_t now)
+{
+	stats->start = now;
+	stats->active = true;
+}
+
+ktime_t intel_context_get_busy_time(struct intel_context *ce);
+
 #endif /* __INTEL_CONTEXT_H__ */
diff --git a/drivers/gpu/drm/i915/gt/intel_context_types.h b/drivers/gpu/drm/i915/gt/intel_context_types.h
index 963a312430e6..b33770f396e2 100644
--- a/drivers/gpu/drm/i915/gt/intel_context_types.h
+++ b/drivers/gpu/drm/i915/gt/intel_context_types.h
@@ -11,6 +11,7 @@
 #include <linux/list.h>
 #include <linux/mutex.h>
 #include <linux/types.h>
+#include <linux/seqlock.h>
 
 #include "i915_active_types.h"
 #include "intel_engine_types.h"
@@ -65,6 +66,14 @@ struct intel_context {
 
 	/** sseu: Control eu/slice partitioning */
 	struct intel_sseu sseu;
+
+	/** stats: Context GPU engine busyness tracking. */
+	struct intel_context_stats {
+		seqlock_t lock;
+		bool active;
+		ktime_t start;
+		ktime_t total;
+	} stats;
 };
 
 #endif /* __INTEL_CONTEXT_TYPES__ */
diff --git a/drivers/gpu/drm/i915/gt/intel_engine_cs.c b/drivers/gpu/drm/i915/gt/intel_engine_cs.c
index 4c3753c1b573..c97269e1beb3 100644
--- a/drivers/gpu/drm/i915/gt/intel_engine_cs.c
+++ b/drivers/gpu/drm/i915/gt/intel_engine_cs.c
@@ -1559,6 +1559,14 @@ int intel_enable_engine_stats(struct intel_engine_cs *engine)
 
 		engine->stats.enabled_at = ktime_get();
 
+		/* Mark currently running context as active. */
+		if (port_isset(port)) {
+			struct i915_request *rq = port_request(port);
+
+			__intel_context_stats_start(&rq->hw_context->stats,
+						    engine->stats.enabled_at);
+		}
+
 		/* XXX submission method oblivious? */
 		while (num_ports-- && port_isset(port)) {
 			engine->stats.active++;
diff --git a/drivers/gpu/drm/i915/gt/intel_lrc.c b/drivers/gpu/drm/i915/gt/intel_lrc.c
index 170e394206ca..3a96bddf9474 100644
--- a/drivers/gpu/drm/i915/gt/intel_lrc.c
+++ b/drivers/gpu/drm/i915/gt/intel_lrc.c
@@ -454,18 +454,48 @@ execlists_context_status_change(struct i915_request *rq, unsigned long status)
 }
 
 static inline void
-intel_engine_context_in(struct intel_engine_cs *engine)
+intel_context_stats_start(struct intel_context_stats *stats, ktime_t now)
 {
+	write_seqlock(&stats->lock);
+	__intel_context_stats_start(stats, now);
+	write_sequnlock(&stats->lock);
+}
+
+static inline void
+intel_context_stats_stop(struct intel_context_stats *stats, ktime_t now)
+{
+	write_seqlock(&stats->lock);
+	GEM_BUG_ON(!stats->start);
+	stats->total = ktime_add(stats->total, ktime_sub(now, stats->start));
+	stats->active = false;
+	write_sequnlock(&stats->lock);
+}
+
+static inline void
+intel_context_in(struct intel_context *ce, bool submit)
+{
+	struct intel_engine_cs *engine = ce->engine;
 	unsigned long flags;
+	ktime_t now;
 
 	if (READ_ONCE(engine->stats.enabled) == 0)
 		return;
 
 	write_seqlock_irqsave(&engine->stats.lock, flags);
 
+	if (submit) {
+		now = ktime_get();
+		intel_context_stats_start(&ce->stats, now);
+	} else {
+		now = 0;
+	}
+
 	if (engine->stats.enabled > 0) {
-		if (engine->stats.active++ == 0)
-			engine->stats.start = ktime_get();
+		if (engine->stats.active++ == 0) {
+			if (!now)
+				now = ktime_get();
+			engine->stats.start = now;
+		}
 		GEM_BUG_ON(engine->stats.active == 0);
 	}
 
@@ -473,8 +503,9 @@ intel_engine_context_in(struct intel_engine_cs *engine)
 }
 
 static inline void
-intel_engine_context_out(struct intel_engine_cs *engine)
+intel_context_out(struct intel_context *ce)
 {
+	struct intel_engine_cs *engine = ce->engine;
 	unsigned long flags;
 
 	if (READ_ONCE(engine->stats.enabled) == 0)
@@ -483,14 +514,25 @@ intel_engine_context_out(struct intel_engine_cs *engine)
 	write_seqlock_irqsave(&engine->stats.lock, flags);
 
 	if (engine->stats.enabled > 0) {
+		struct execlist_port *next_port = &engine->execlists.port[1];
+		ktime_t now = ktime_get();
 		ktime_t last;
 
+		intel_context_stats_stop(&ce->stats, now);
+
+		if (port_isset(next_port)) {
+			struct i915_request *next_rq = port_request(next_port);
+
+			intel_context_stats_start(&next_rq->hw_context->stats,
+						  now);
+		}
+
 		if (engine->stats.active && --engine->stats.active == 0) {
 			/*
 			 * Decrement the active context count and in case GPU
 			 * is now idle add up to the running total.
 			 */
-			last = ktime_sub(ktime_get(), engine->stats.start);
+			last = ktime_sub(now, engine->stats.start);
 
 			engine->stats.total = ktime_add(engine->stats.total,
 							last);
@@ -500,7 +542,7 @@ intel_engine_context_out(struct intel_engine_cs *engine)
 			 * the first event in which case we account from the
 			 * time stats gathering was turned on.
 			 */
-			last = ktime_sub(ktime_get(), engine->stats.enabled_at);
+			last = ktime_sub(now, engine->stats.enabled_at);
 
 			engine->stats.total = ktime_add(engine->stats.total,
 							last);
@@ -524,12 +566,12 @@ execlists_user_end(struct intel_engine_execlists *execlists)
 }
 
 static inline void
-execlists_context_schedule_in(struct i915_request *rq)
+execlists_context_schedule_in(struct i915_request *rq, unsigned int port)
 {
 	GEM_BUG_ON(rq->hw_context->active);
 
 	execlists_context_status_change(rq, INTEL_CONTEXT_SCHEDULE_IN);
-	intel_engine_context_in(rq->engine);
+	intel_context_in(rq->hw_context, port == 0);
 	rq->hw_context->active = rq->engine;
 }
 
@@ -537,7 +579,7 @@ static inline void
 execlists_context_schedule_out(struct i915_request *rq, unsigned long status)
 {
 	rq->hw_context->active = NULL;
-	intel_engine_context_out(rq->engine);
+	intel_context_out(rq->hw_context);
 	execlists_context_status_change(rq, status);
 	trace_i915_request_out(rq);
 }
@@ -610,7 +652,7 @@ static void execlists_submit_ports(struct intel_engine_cs *engine)
 		if (rq) {
 			GEM_BUG_ON(count > !n);
 			if (!count++)
-				execlists_context_schedule_in(rq);
+				execlists_context_schedule_in(rq, n);
 			port_set(&port[n], port_pack(rq, count));
 			desc = execlists_update_context(rq);
 			GEM_DEBUG_EXEC(port[n].context_id = upper_32_bits(desc));
-- 
2.19.1

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

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [RFC 3/6] drm/i915: Expose list of clients in sysfs
  2019-05-10 13:22 [RFC 0/6] Per context and per client GPU busyness tracking Tvrtko Ursulin
  2019-05-10 13:22 ` [RFC 1/6] drm/i915: Move intel_engine_context_in/out into intel_lrc.c Tvrtko Ursulin
  2019-05-10 13:22 ` [RFC 2/6] drm/i915: Track per-context engine busyness Tvrtko Ursulin
@ 2019-05-10 13:22 ` Tvrtko Ursulin
  2019-05-10 14:12   ` Chris Wilson
  2019-05-10 13:22 ` [RFC 4/6] drm/i915: Update client name on context create Tvrtko Ursulin
                   ` (5 subsequent siblings)
  8 siblings, 1 reply; 14+ messages in thread
From: Tvrtko Ursulin @ 2019-05-10 13:22 UTC (permalink / raw)
  To: Intel-gfx

From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>

Expose a list of clients with open file handles in sysfs.

This will be a basis for a top-like utility showing per-client and per-
engine GPU load.

Currently we only expose each client's pid and name under opaque numbered
directories in /sys/class/drm/card0/clients/.

For instance:

/sys/class/drm/card0/clients/3/name: Xorg
/sys/class/drm/card0/clients/3/pid: 5664

v2:
 Chris Wilson:
 * Enclose new members into dedicated structs.
 * Protect against failed sysfs registration.

v3:
 * sysfs_attr_init.

Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
---
 drivers/gpu/drm/i915/i915_drv.h   |  19 +++++
 drivers/gpu/drm/i915/i915_gem.c   | 121 ++++++++++++++++++++++++++++--
 drivers/gpu/drm/i915/i915_sysfs.c |   8 ++
 3 files changed, 140 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index d0257808734c..1d7a94555a87 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -242,6 +242,20 @@ struct drm_i915_file_private {
 	/** ban_score: Accumulated score of all ctx bans and fast hangs. */
 	atomic_t ban_score;
 	unsigned long hang_timestamp;
+
+	struct i915_drm_client {
+		unsigned int id;
+
+		pid_t pid;
+		char *name;
+
+		struct kobject *root;
+
+		struct {
+			struct device_attribute pid;
+			struct device_attribute name;
+		} attr;
+	} client;
 };
 
 /* Interface history:
@@ -2057,6 +2071,11 @@ struct drm_i915_private {
 
 	struct i915_pmu pmu;
 
+	struct i915_drm_clients {
+		struct kobject *root;
+		atomic_t serial;
+	} clients;
+
 	struct i915_hdcp_comp_master *hdcp_master;
 	bool hdcp_comp_added;
 
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 2fcec1bfb038..0ae5764a58d2 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -4814,6 +4814,96 @@ int i915_gem_freeze_late(struct drm_i915_private *i915)
 	return 0;
 }
 
+static ssize_t
+show_client_name(struct device *kdev, struct device_attribute *attr, char *buf)
+{
+	struct drm_i915_file_private *file_priv =
+		container_of(attr, struct drm_i915_file_private,
+			     client.attr.name);
+
+	return snprintf(buf, PAGE_SIZE, "%s", file_priv->client.name);
+}
+
+static ssize_t
+show_client_pid(struct device *kdev, struct device_attribute *attr, char *buf)
+{
+	struct drm_i915_file_private *file_priv =
+		container_of(attr, struct drm_i915_file_private,
+			     client.attr.pid);
+
+	return snprintf(buf, PAGE_SIZE, "%u", file_priv->client.pid);
+}
+
+static int
+i915_gem_add_client(struct drm_i915_private *i915,
+		struct drm_i915_file_private *file_priv,
+		struct task_struct *task,
+		unsigned int serial)
+{
+	int ret = -ENOMEM;
+	struct device_attribute *attr;
+	char id[32];
+
+	if (!i915->clients.root)
+		goto err_name;
+
+	file_priv->client.name = kstrdup(task->comm, GFP_KERNEL);
+	if (!file_priv->client.name)
+		goto err_name;
+
+	snprintf(id, sizeof(id), "%u", serial);
+	file_priv->client.root = kobject_create_and_add(id,
+							i915->clients.root);
+	if (!file_priv->client.root)
+		goto err_client;
+
+	attr = &file_priv->client.attr.name;
+	sysfs_attr_init(&attr->attr);
+	attr->attr.name = "name";
+	attr->attr.mode = 0444;
+	attr->show = show_client_name;
+
+	ret = sysfs_create_file(file_priv->client.root,
+				(struct attribute *)attr);
+	if (ret)
+		goto err_attr_name;
+
+	attr = &file_priv->client.attr.pid;
+	sysfs_attr_init(&attr->attr);
+	attr->attr.name = "pid";
+	attr->attr.mode = 0444;
+	attr->show = show_client_pid;
+
+	ret = sysfs_create_file(file_priv->client.root,
+				(struct attribute *)attr);
+	if (ret)
+		goto err_attr_pid;
+
+	file_priv->client.pid = pid_nr(get_task_pid(task, PIDTYPE_PID));
+
+	return 0;
+
+err_attr_pid:
+	sysfs_remove_file(file_priv->client.root,
+			  (struct attribute *)&file_priv->client.attr.name);
+err_attr_name:
+	kobject_put(file_priv->client.root);
+err_client:
+	kfree(file_priv->client.name);
+err_name:
+	return ret;
+}
+
+static void i915_gem_remove_client(struct drm_i915_file_private *file_priv)
+{
+	sysfs_remove_file(file_priv->client.root,
+			  (struct attribute *)&file_priv->client.attr.pid);
+	sysfs_remove_file(file_priv->client.root,
+			  (struct attribute *)&file_priv->client.attr.name);
+	kobject_put(file_priv->client.root);
+	kfree(file_priv->client.name);
+}
+
 void i915_gem_release(struct drm_device *dev, struct drm_file *file)
 {
 	struct drm_i915_file_private *file_priv = file->driver_priv;
@@ -4827,33 +4917,48 @@ void i915_gem_release(struct drm_device *dev, struct drm_file *file)
 	list_for_each_entry(request, &file_priv->mm.request_list, client_link)
 		request->file_priv = NULL;
 	spin_unlock(&file_priv->mm.lock);
+
+	i915_gem_remove_client(file_priv);
 }
 
 int i915_gem_open(struct drm_i915_private *i915, struct drm_file *file)
 {
+	int ret = -ENOMEM;
 	struct drm_i915_file_private *file_priv;
-	int ret;
 
 	DRM_DEBUG("\n");
 
 	file_priv = kzalloc(sizeof(*file_priv), GFP_KERNEL);
 	if (!file_priv)
-		return -ENOMEM;
+		goto err_alloc;
+
+	file_priv->client.id = atomic_inc_return(&i915->clients.serial);
+	ret = i915_gem_add_client(i915, file_priv, current,
+				  file_priv->client.id);
+	if (ret)
+		goto err_client;
 
 	file->driver_priv = file_priv;
+	ret = i915_gem_context_open(i915, file);
+	if (ret)
+		goto err_context;
+
 	file_priv->dev_priv = i915;
 	file_priv->file = file;
+	file_priv->bsd_engine = -1;
+	file_priv->hang_timestamp = jiffies;
 
 	spin_lock_init(&file_priv->mm.lock);
 	INIT_LIST_HEAD(&file_priv->mm.request_list);
 
-	file_priv->bsd_engine = -1;
-	file_priv->hang_timestamp = jiffies;
-
-	ret = i915_gem_context_open(i915, file);
-	if (ret)
-		kfree(file_priv);
+	return 0;
 
+err_context:
+	i915_gem_remove_client(file_priv);
+err_client:
+	atomic_dec(&i915->clients.serial);
+	kfree(file_priv);
+err_alloc:
 	return ret;
 }
 
diff --git a/drivers/gpu/drm/i915/i915_sysfs.c b/drivers/gpu/drm/i915/i915_sysfs.c
index 3ef07b987d40..06a558436f54 100644
--- a/drivers/gpu/drm/i915/i915_sysfs.c
+++ b/drivers/gpu/drm/i915/i915_sysfs.c
@@ -576,6 +576,11 @@ void i915_setup_sysfs(struct drm_i915_private *dev_priv)
 	struct device *kdev = dev_priv->drm.primary->kdev;
 	int ret;
 
+	dev_priv->clients.root =
+		kobject_create_and_add("clients", &kdev->kobj);
+	if (!dev_priv->clients.root)
+		DRM_ERROR("Per-client sysfs setup failed\n");
+
 #ifdef CONFIG_PM
 	if (HAS_RC6(dev_priv)) {
 		ret = sysfs_merge_group(&kdev->kobj,
@@ -636,4 +641,7 @@ void i915_teardown_sysfs(struct drm_i915_private *dev_priv)
 	sysfs_unmerge_group(&kdev->kobj, &rc6_attr_group);
 	sysfs_unmerge_group(&kdev->kobj, &rc6p_attr_group);
 #endif
+
+	if (dev_priv->clients.root)
+		kobject_put(dev_priv->clients.root);
 }
-- 
2.19.1

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

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [RFC 4/6] drm/i915: Update client name on context create
  2019-05-10 13:22 [RFC 0/6] Per context and per client GPU busyness tracking Tvrtko Ursulin
                   ` (2 preceding siblings ...)
  2019-05-10 13:22 ` [RFC 3/6] drm/i915: Expose list of clients in sysfs Tvrtko Ursulin
@ 2019-05-10 13:22 ` Tvrtko Ursulin
  2019-05-10 13:22 ` [RFC 5/6] drm/i915: Expose per-engine client busyness Tvrtko Ursulin
                   ` (4 subsequent siblings)
  8 siblings, 0 replies; 14+ messages in thread
From: Tvrtko Ursulin @ 2019-05-10 13:22 UTC (permalink / raw)
  To: Intel-gfx

From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>

Some clients have the DRM fd passed to them over a socket by the X server.

Grab the real client and pid when they create their first context and
update the exposed data for more useful enumeration.

Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
---
 drivers/gpu/drm/i915/i915_drv.h         |  8 ++++++++
 drivers/gpu/drm/i915/i915_gem.c         |  4 ++--
 drivers/gpu/drm/i915/i915_gem_context.c | 18 +++++++++++++++---
 3 files changed, 25 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 1d7a94555a87..b6fa3d45ed22 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -3086,6 +3086,14 @@ i915_gem_object_pin_to_display_plane(struct drm_i915_gem_object *obj,
 void i915_gem_object_unpin_from_display_plane(struct i915_vma *vma);
 int i915_gem_object_attach_phys(struct drm_i915_gem_object *obj,
 				int align);
+
+int
+i915_gem_add_client(struct drm_i915_private *i915,
+		struct drm_i915_file_private *file_priv,
+		struct task_struct *task,
+		unsigned int serial);
+void i915_gem_remove_client(struct drm_i915_file_private *file_priv);
+
 int i915_gem_open(struct drm_i915_private *i915, struct drm_file *file);
 void i915_gem_release(struct drm_device *dev, struct drm_file *file);
 
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 0ae5764a58d2..03cac6ce0c31 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -4834,7 +4834,7 @@ show_client_pid(struct device *kdev, struct device_attribute *attr, char *buf)
 	return snprintf(buf, PAGE_SIZE, "%u", file_priv->client.pid);
 }
 
-static int
+int
 i915_gem_add_client(struct drm_i915_private *i915,
 		struct drm_i915_file_private *file_priv,
 		struct task_struct *task,
@@ -4894,7 +4894,7 @@ i915_gem_add_client(struct drm_i915_private *i915,
 	return ret;
 }
 
-static void i915_gem_remove_client(struct drm_i915_file_private *file_priv)
+void i915_gem_remove_client(struct drm_i915_file_private *file_priv)
 {
 	sysfs_remove_file(file_priv->client.root,
 			  (struct attribute *)&file_priv->client.attr.pid);
diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c
index 65cefc520e79..1ac2521fc448 100644
--- a/drivers/gpu/drm/i915/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/i915_gem_context.c
@@ -1499,6 +1499,8 @@ int i915_gem_context_create_ioctl(struct drm_device *dev, void *data,
 {
 	struct drm_i915_private *i915 = to_i915(dev);
 	struct drm_i915_gem_context_create_ext *args = data;
+	pid_t pid = pid_nr(get_task_pid(current, PIDTYPE_PID));
+	struct drm_i915_file_private *file_priv = file->driver_priv;
 	struct create_ext ext_data;
 	int ret;
 
@@ -1512,11 +1514,11 @@ int i915_gem_context_create_ioctl(struct drm_device *dev, void *data,
 	if (ret)
 		return ret;
 
-	ext_data.fpriv = file->driver_priv;
+	ext_data.fpriv = file_priv;
 	if (client_is_banned(ext_data.fpriv)) {
 		DRM_DEBUG("client %s[%d] banned from creating ctx\n",
-			  current->comm,
-			  pid_nr(get_task_pid(current, PIDTYPE_PID)));
+			  current->comm, pid);
+
 		return -EIO;
 	}
 
@@ -1524,6 +1526,16 @@ int i915_gem_context_create_ioctl(struct drm_device *dev, void *data,
 	if (ret)
 		return ret;
 
+	if (file_priv->client.pid != pid) {
+		i915_gem_remove_client(file_priv);
+		ret = i915_gem_add_client(i915, file_priv, current,
+					  file_priv->client.id);
+		if (ret) {
+			mutex_unlock(&dev->struct_mutex);
+			return ret;
+		}
+	}
+
 	ext_data.ctx = i915_gem_create_context(i915, args->flags);
 	mutex_unlock(&dev->struct_mutex);
 	if (IS_ERR(ext_data.ctx))
-- 
2.19.1

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

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [RFC 5/6] drm/i915: Expose per-engine client busyness
  2019-05-10 13:22 [RFC 0/6] Per context and per client GPU busyness tracking Tvrtko Ursulin
                   ` (3 preceding siblings ...)
  2019-05-10 13:22 ` [RFC 4/6] drm/i915: Update client name on context create Tvrtko Ursulin
@ 2019-05-10 13:22 ` Tvrtko Ursulin
  2019-05-10 13:57   ` Chris Wilson
  2019-05-10 13:22 ` [RFC 6/6] drm/i915: Add sysfs toggle to enable per-client engine stats Tvrtko Ursulin
                   ` (3 subsequent siblings)
  8 siblings, 1 reply; 14+ messages in thread
From: Tvrtko Ursulin @ 2019-05-10 13:22 UTC (permalink / raw)
  To: Intel-gfx

From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>

Expose per-client and per-engine busyness under the previously added sysfs
client root.

The new files are one per-engine instance and located under the 'busy'
directory. Each contains a monotonically increasing nano-second resolution
times each client's jobs were executing on the GPU.

This enables userspace to create a top-like tool for GPU utilization:

==========================================================================
intel-gpu-top -  935/ 935 MHz;    0% RC6; 14.73 Watts;     1097 irqs/s

      IMC reads:     1401 MiB/s
     IMC writes:        4 MiB/s

          ENGINE      BUSY                                 MI_SEMA MI_WAIT
     Render/3D/0   63.73% |███████████████████           |      3%      0%
       Blitter/0    9.53% |██▊                           |      6%      0%
         Video/0   39.32% |███████████▊                  |     16%      0%
         Video/1   15.62% |████▋                         |      0%      0%
  VideoEnhance/0    0.00% |                              |      0%      0%

  PID            NAME     RCS          BCS          VCS         VECS
 4084        gem_wsim |█████▌     ||█          ||           ||           |
 4086        gem_wsim |█▌         ||           ||███        ||           |
==========================================================================

v2: Use intel_context_engine_get_busy_time.
v3: New directory structure.
v4: Rebase.
v5: sysfs_attr_init.
v6: Small tidy in i915_gem_add_client.
v7: Rebase to be engine class based.

Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
---
 drivers/gpu/drm/i915/i915_drv.h |   8 +++
 drivers/gpu/drm/i915/i915_gem.c | 102 ++++++++++++++++++++++++++++++--
 2 files changed, 106 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index b6fa3d45ed22..e663924dfc78 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -204,6 +204,12 @@ struct drm_i915_private;
 struct i915_mm_struct;
 struct i915_mmu_object;
 
+struct i915_engine_busy_attribute {
+	struct device_attribute attr;
+	struct drm_i915_file_private *file_priv;
+	unsigned int engine_class;
+};
+
 struct drm_i915_file_private {
 	struct drm_i915_private *dev_priv;
 	struct drm_file *file;
@@ -250,10 +256,12 @@ struct drm_i915_file_private {
 		char *name;
 
 		struct kobject *root;
+		struct kobject *busy_root;
 
 		struct {
 			struct device_attribute pid;
 			struct device_attribute name;
+			struct i915_engine_busy_attribute busy[MAX_ENGINE_CLASS];
 		} attr;
 	} client;
 };
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 03cac6ce0c31..adeba5c1d343 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -4834,15 +4834,67 @@ show_client_pid(struct device *kdev, struct device_attribute *attr, char *buf)
 	return snprintf(buf, PAGE_SIZE, "%u", file_priv->client.pid);
 }
 
+struct busy_ctx {
+	unsigned int engine_class;
+	u64 total;
+};
+
+static int busy_add(int id, void *p, void *data)
+{
+	struct busy_ctx *bc = data;
+	struct i915_gem_context *ctx = p;
+	unsigned int engine_class = bc->engine_class;
+	struct i915_gem_engines_iter it;
+	struct intel_context *ce;
+	uint64_t total = bc->total;
+
+	for_each_gem_engine(ce, i915_gem_context_lock_engines(ctx), it) {
+		if (ce->engine->uabi_class == engine_class)
+			total += ktime_to_ns(intel_context_get_busy_time(ce));
+	}
+	i915_gem_context_unlock_engines(ctx);
+
+	bc->total = total;
+
+	return 0;
+}
+
+static ssize_t
+show_client_busy(struct device *kdev, struct device_attribute *attr, char *buf)
+{
+	struct i915_engine_busy_attribute *i915_attr =
+		container_of(attr, typeof(*i915_attr), attr);
+	struct drm_i915_file_private *file_priv = i915_attr->file_priv;
+	struct busy_ctx bc = { .engine_class = i915_attr->engine_class };
+	int ret;
+
+	ret = mutex_lock_interruptible(&file_priv->context_idr_lock);
+	if (ret)
+		return ret;
+
+	idr_for_each(&file_priv->context_idr, busy_add, &bc);
+
+	mutex_unlock(&file_priv->context_idr_lock);
+
+	return snprintf(buf, PAGE_SIZE, "%llu\n", bc.total);
+}
+
+static const char *uabi_class_names[] = {
+	[I915_ENGINE_CLASS_RENDER] = "0",
+	[I915_ENGINE_CLASS_COPY] = "1",
+	[I915_ENGINE_CLASS_VIDEO] = "2",
+	[COPY_ENGINE_CLASS] = "3",
+};
+
 int
 i915_gem_add_client(struct drm_i915_private *i915,
 		struct drm_i915_file_private *file_priv,
 		struct task_struct *task,
 		unsigned int serial)
 {
-	int ret = -ENOMEM;
+	int i, ret = -ENOMEM;
 	struct device_attribute *attr;
-	char id[32];
+	char idstr[32];
 
 	if (!i915->clients.root)
 		goto err_name;
@@ -4851,8 +4903,8 @@ i915_gem_add_client(struct drm_i915_private *i915,
 	if (!file_priv->client.name)
 		goto err_name;
 
-	snprintf(id, sizeof(id), "%u", serial);
-	file_priv->client.root = kobject_create_and_add(id,
+	snprintf(idstr, sizeof(idstr), "%u", serial);
+	file_priv->client.root = kobject_create_and_add(idstr,
 							i915->clients.root);
 	if (!file_priv->client.root)
 		goto err_client;
@@ -4879,10 +4931,44 @@ i915_gem_add_client(struct drm_i915_private *i915,
 	if (ret)
 		goto err_attr_pid;
 
+	file_priv->client.busy_root =
+			kobject_create_and_add("busy", file_priv->client.root);
+	if (!file_priv->client.busy_root)
+		goto err_busy_root;
+
+	for (i = 0; i < ARRAY_SIZE(uabi_class_names); i++) {
+		struct i915_engine_busy_attribute *i915_attr =
+			&file_priv->client.attr.busy[i];
+
+		i915_attr->file_priv = file_priv;
+		i915_attr->engine_class = i;
+
+		attr = &i915_attr->attr;
+
+		sysfs_attr_init(&attr->attr);
+
+		attr->attr.name = uabi_class_names[i];
+		attr->attr.mode = 0444;
+		attr->show = show_client_busy;
+
+		ret = sysfs_create_file(file_priv->client.busy_root,
+				        (struct attribute *)attr);
+		if (ret)
+			goto err_attr_busy;
+	}
+
 	file_priv->client.pid = pid_nr(get_task_pid(task, PIDTYPE_PID));
 
 	return 0;
 
+err_attr_busy:
+	for (--i; i >= 0; i--)
+		sysfs_remove_file(file_priv->client.busy_root,
+				  (struct attribute *)&file_priv->client.attr.busy[i]);
+	kobject_put(file_priv->client.busy_root);
+err_busy_root:
+	sysfs_remove_file(file_priv->client.root,
+			  (struct attribute *)&file_priv->client.attr.pid);
 err_attr_pid:
 	sysfs_remove_file(file_priv->client.root,
 			  (struct attribute *)&file_priv->client.attr.name);
@@ -4896,6 +4982,14 @@ i915_gem_add_client(struct drm_i915_private *i915,
 
 void i915_gem_remove_client(struct drm_i915_file_private *file_priv)
 {
+	unsigned int i;
+
+	for (i = 0; i < ARRAY_SIZE(uabi_class_names); i++)
+		sysfs_remove_file(file_priv->client.busy_root,
+				  (struct attribute *)&file_priv->client.attr.busy[i]);
+
+	kobject_put(file_priv->client.busy_root);
+
 	sysfs_remove_file(file_priv->client.root,
 			  (struct attribute *)&file_priv->client.attr.pid);
 	sysfs_remove_file(file_priv->client.root,
-- 
2.19.1

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

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [RFC 6/6] drm/i915: Add sysfs toggle to enable per-client engine stats
  2019-05-10 13:22 [RFC 0/6] Per context and per client GPU busyness tracking Tvrtko Ursulin
                   ` (4 preceding siblings ...)
  2019-05-10 13:22 ` [RFC 5/6] drm/i915: Expose per-engine client busyness Tvrtko Ursulin
@ 2019-05-10 13:22 ` Tvrtko Ursulin
  2019-05-10 14:13 ` ✗ Fi.CI.CHECKPATCH: warning for Per context and per client GPU busyness tracking Patchwork
                   ` (2 subsequent siblings)
  8 siblings, 0 replies; 14+ messages in thread
From: Tvrtko Ursulin @ 2019-05-10 13:22 UTC (permalink / raw)
  To: Intel-gfx

From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>

By default we are not collecting any per-engine and per-context
statistcs.

Add a new sysfs toggle to enable this facility:

$ echo 1 >/sys/class/drm/card0/clients/enable_stats

v2: Rebase.
v3: sysfs_attr_init.

Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
---
 drivers/gpu/drm/i915/i915_drv.h   |  4 ++
 drivers/gpu/drm/i915/i915_sysfs.c | 73 +++++++++++++++++++++++++++++++
 2 files changed, 77 insertions(+)

diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index e663924dfc78..490d863d1e1e 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -2082,6 +2082,10 @@ struct drm_i915_private {
 	struct i915_drm_clients {
 		struct kobject *root;
 		atomic_t serial;
+		struct {
+			bool enabled;
+			struct device_attribute attr;
+		} stats;
 	} clients;
 
 	struct i915_hdcp_comp_master *hdcp_master;
diff --git a/drivers/gpu/drm/i915/i915_sysfs.c b/drivers/gpu/drm/i915/i915_sysfs.c
index 06a558436f54..b60c0775951a 100644
--- a/drivers/gpu/drm/i915/i915_sysfs.c
+++ b/drivers/gpu/drm/i915/i915_sysfs.c
@@ -571,9 +571,67 @@ static void i915_setup_error_capture(struct device *kdev) {}
 static void i915_teardown_error_capture(struct device *kdev) {}
 #endif
 
+static ssize_t
+show_client_stats(struct device *kdev, struct device_attribute *attr, char *buf)
+{
+	struct drm_i915_private *i915 =
+		container_of(attr, struct drm_i915_private, clients.stats.attr);
+
+	return snprintf(buf, PAGE_SIZE, "%u\n", i915->clients.stats.enabled);
+}
+
+static ssize_t
+store_client_stats(struct device *kdev, struct device_attribute *attr,
+		   const char *buf, size_t count)
+{
+	struct drm_i915_private *i915 =
+		container_of(attr, struct drm_i915_private, clients.stats.attr);
+	bool disable = false;
+	bool enable = false;
+	bool val = false;
+	struct intel_engine_cs *engine;
+	enum intel_engine_id id;
+	int ret;
+
+	 /* Use RCS as proxy for all engines. */
+	if (!intel_engine_supports_stats(i915->engine[RCS0]))
+		return -EINVAL;
+
+	ret = kstrtobool(buf, &val);
+	if (ret)
+		return ret;
+
+	ret = i915_mutex_lock_interruptible(&i915->drm);
+	if (ret)
+		return ret;
+
+	if (val && !i915->clients.stats.enabled)
+		enable = true;
+	else if (!val && i915->clients.stats.enabled)
+		disable = true;
+
+	if (!enable && !disable)
+		goto out;
+
+	for_each_engine(engine, i915, id) {
+		if (enable)
+			WARN_ON_ONCE(intel_enable_engine_stats(engine));
+		else if (disable)
+			intel_disable_engine_stats(engine);
+	}
+
+	i915->clients.stats.enabled = val;
+
+out:
+	mutex_unlock(&i915->drm.struct_mutex);
+
+	return count;
+}
+
 void i915_setup_sysfs(struct drm_i915_private *dev_priv)
 {
 	struct device *kdev = dev_priv->drm.primary->kdev;
+	struct device_attribute *attr;
 	int ret;
 
 	dev_priv->clients.root =
@@ -581,6 +639,18 @@ void i915_setup_sysfs(struct drm_i915_private *dev_priv)
 	if (!dev_priv->clients.root)
 		DRM_ERROR("Per-client sysfs setup failed\n");
 
+	attr = &dev_priv->clients.stats.attr;
+	sysfs_attr_init(&attr->attr);
+	attr->attr.name = "enable_stats";
+	attr->attr.mode = 0664;
+	attr->show = show_client_stats;
+	attr->store = store_client_stats;
+
+	ret = sysfs_create_file(dev_priv->clients.root,
+				(struct attribute *)attr);
+	if (ret)
+		DRM_ERROR("Per-client sysfs setup failed! (%d)\n", ret);
+
 #ifdef CONFIG_PM
 	if (HAS_RC6(dev_priv)) {
 		ret = sysfs_merge_group(&kdev->kobj,
@@ -642,6 +712,9 @@ void i915_teardown_sysfs(struct drm_i915_private *dev_priv)
 	sysfs_unmerge_group(&kdev->kobj, &rc6p_attr_group);
 #endif
 
+	sysfs_remove_file(dev_priv->clients.root,
+			  (struct attribute *)&dev_priv->clients.stats.attr);
+
 	if (dev_priv->clients.root)
 		kobject_put(dev_priv->clients.root);
 }
-- 
2.19.1

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

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* Re: [RFC 5/6] drm/i915: Expose per-engine client busyness
  2019-05-10 13:22 ` [RFC 5/6] drm/i915: Expose per-engine client busyness Tvrtko Ursulin
@ 2019-05-10 13:57   ` Chris Wilson
  2019-05-10 14:02     ` Tvrtko Ursulin
  0 siblings, 1 reply; 14+ messages in thread
From: Chris Wilson @ 2019-05-10 13:57 UTC (permalink / raw)
  To: Intel-gfx, Tvrtko Ursulin

Quoting Tvrtko Ursulin (2019-05-10 14:22:39)
> +static const char *uabi_class_names[] = {
> +       [I915_ENGINE_CLASS_RENDER] = "0",
> +       [I915_ENGINE_CLASS_COPY] = "1",
> +       [I915_ENGINE_CLASS_VIDEO] = "2",
> +       [COPY_ENGINE_CLASS] = "3",

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

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [RFC 5/6] drm/i915: Expose per-engine client busyness
  2019-05-10 13:57   ` Chris Wilson
@ 2019-05-10 14:02     ` Tvrtko Ursulin
  0 siblings, 0 replies; 14+ messages in thread
From: Tvrtko Ursulin @ 2019-05-10 14:02 UTC (permalink / raw)
  To: Chris Wilson, Intel-gfx


On 10/05/2019 14:57, Chris Wilson wrote:
> Quoting Tvrtko Ursulin (2019-05-10 14:22:39)
>> +static const char *uabi_class_names[] = {
>> +       [I915_ENGINE_CLASS_RENDER] = "0",
>> +       [I915_ENGINE_CLASS_COPY] = "1",
>> +       [I915_ENGINE_CLASS_VIDEO] = "2",
>> +       [COPY_ENGINE_CLASS] = "3",
> 
> I915_ENGINE_CLASS_VIDEO_ENHANCE?

Yeah.. probably an interruption in the middle of converting this array. :)

Regards,

Tvrtko

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

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [RFC 3/6] drm/i915: Expose list of clients in sysfs
  2019-05-10 13:22 ` [RFC 3/6] drm/i915: Expose list of clients in sysfs Tvrtko Ursulin
@ 2019-05-10 14:12   ` Chris Wilson
  0 siblings, 0 replies; 14+ messages in thread
From: Chris Wilson @ 2019-05-10 14:12 UTC (permalink / raw)
  To: Intel-gfx, Tvrtko Ursulin

Quoting Tvrtko Ursulin (2019-05-10 14:22:37)
> From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
> 
> Expose a list of clients with open file handles in sysfs.
> 
> This will be a basis for a top-like utility showing per-client and per-
> engine GPU load.
> 
> Currently we only expose each client's pid and name under opaque numbered
> directories in /sys/class/drm/card0/clients/.
> 
> For instance:
> 
> /sys/class/drm/card0/clients/3/name: Xorg
> /sys/class/drm/card0/clients/3/pid: 5664

Random thought, should this be a symlink to /proc/$pid or a pidfd?
-Chris
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 14+ messages in thread

* ✗ Fi.CI.CHECKPATCH: warning for Per context and per client GPU busyness tracking
  2019-05-10 13:22 [RFC 0/6] Per context and per client GPU busyness tracking Tvrtko Ursulin
                   ` (5 preceding siblings ...)
  2019-05-10 13:22 ` [RFC 6/6] drm/i915: Add sysfs toggle to enable per-client engine stats Tvrtko Ursulin
@ 2019-05-10 14:13 ` Patchwork
  2019-05-10 15:06 ` ✓ Fi.CI.BAT: success " Patchwork
  2019-05-10 16:48 ` ✓ Fi.CI.IGT: " Patchwork
  8 siblings, 0 replies; 14+ messages in thread
From: Patchwork @ 2019-05-10 14:13 UTC (permalink / raw)
  To: Tvrtko Ursulin; +Cc: intel-gfx

== Series Details ==

Series: Per context and per client GPU busyness tracking
URL   : https://patchwork.freedesktop.org/series/60506/
State : warning

== Summary ==

$ dim checkpatch origin/drm-tip
3ae0f10d21d1 drm/i915: Move intel_engine_context_in/out into intel_lrc.c
e76b877d4273 drm/i915: Track per-context engine busyness
83be221853b1 drm/i915: Expose list of clients in sysfs
-:96: CHECK:PARENTHESIS_ALIGNMENT: Alignment should match open parenthesis
#96: FILE: drivers/gpu/drm/i915/i915_gem.c:4839:
+i915_gem_add_client(struct drm_i915_private *i915,
+		struct drm_i915_file_private *file_priv,

total: 0 errors, 0 warnings, 1 checks, 201 lines checked
4912359f0d14 drm/i915: Update client name on context create
-:24: CHECK:PARENTHESIS_ALIGNMENT: Alignment should match open parenthesis
#24: FILE: drivers/gpu/drm/i915/i915_drv.h:3092:
+i915_gem_add_client(struct drm_i915_private *i915,
+		struct drm_i915_file_private *file_priv,

total: 0 errors, 0 warnings, 1 checks, 68 lines checked
4c2ec282f33b drm/i915: Expose per-engine client busyness
-:25: WARNING:COMMIT_LOG_LONG_LINE: Possible unwrapped commit description (prefer a maximum 75 chars per line)
#25: 
     Render/3D/0   63.73% |███████████████████           |      3%      0%

-:95: CHECK:PREFER_KERNEL_TYPES: Prefer kernel type 'u64' over 'uint64_t'
#95: FILE: drivers/gpu/drm/i915/i915_gem.c:4849:
+	uint64_t total = bc->total;

-:128: WARNING:STATIC_CONST_CHAR_ARRAY: static const char * array should probably be static const char * const
#128: FILE: drivers/gpu/drm/i915/i915_gem.c:4882:
+static const char *uabi_class_names[] = {

-:185: ERROR:CODE_INDENT: code indent should use tabs where possible
#185: FILE: drivers/gpu/drm/i915/i915_gem.c:4955:
+^I^I^I^I        (struct attribute *)attr);$

-:185: CHECK:PARENTHESIS_ALIGNMENT: Alignment should match open parenthesis
#185: FILE: drivers/gpu/drm/i915/i915_gem.c:4955:
+		ret = sysfs_create_file(file_priv->client.busy_root,
+				        (struct attribute *)attr);

total: 1 errors, 2 warnings, 2 checks, 161 lines checked
816d25263191 drm/i915: Add sysfs toggle to enable per-client engine stats

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

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [RFC 2/6] drm/i915: Track per-context engine busyness
  2019-05-10 13:22 ` [RFC 2/6] drm/i915: Track per-context engine busyness Tvrtko Ursulin
@ 2019-05-10 14:22   ` Chris Wilson
  0 siblings, 0 replies; 14+ messages in thread
From: Chris Wilson @ 2019-05-10 14:22 UTC (permalink / raw)
  To: Intel-gfx, Tvrtko Ursulin

Quoting Tvrtko Ursulin (2019-05-10 14:22:36)
> +static inline void
> +intel_context_in(struct intel_context *ce, bool submit)
> +{
> +       struct intel_engine_cs *engine = ce->engine;
>         unsigned long flags;
> +       ktime_t now;
>  
>         if (READ_ONCE(engine->stats.enabled) == 0)
>                 return;
>  
>         write_seqlock_irqsave(&engine->stats.lock, flags);
>  
> +       if (submit) {
> +               now = ktime_get();
> +               intel_context_stats_start(&ce->stats, now);
> +       } else {
> +               now = 0;
> +       }
> +
>         if (engine->stats.enabled > 0) {
> -               if (engine->stats.active++ == 0)
> -                       engine->stats.start = ktime_get();
> +               if (engine->stats.active++ == 0) {
> +                       if (!now)
> +                               now = ktime_get();
> +                       engine->stats.start = now;
> +               }
>                 GEM_BUG_ON(engine->stats.active == 0);
>         }
>  
> @@ -473,8 +503,9 @@ intel_engine_context_in(struct intel_engine_cs *engine)
>  }
>  
>  static inline void
> -intel_engine_context_out(struct intel_engine_cs *engine)
> +intel_context_out(struct intel_context *ce)
>  {
> +       struct intel_engine_cs *engine = ce->engine;

ce->bound/ce->inflight at this point.

>         unsigned long flags;
>  
>         if (READ_ONCE(engine->stats.enabled) == 0)
> @@ -483,14 +514,25 @@ intel_engine_context_out(struct intel_engine_cs *engine)
>         write_seqlock_irqsave(&engine->stats.lock, flags);
>  
>         if (engine->stats.enabled > 0) {
> +               struct execlist_port *next_port = &engine->execlists.port[1];
> +               ktime_t now = ktime_get();
>                 ktime_t last;
>  
> +               intel_context_stats_stop(&ce->stats, now);
> +
> +               if (port_isset(next_port)) {
> +                       struct i915_request *next_rq = port_request(next_port);
> +
> +                       intel_context_stats_start(&next_rq->hw_context->stats,
> +                                                 now);

Oh crikey. Yeah, I am thinking we need to bite bullet and add the explicit
tracking to ELSP promotion. As luck would happen...
-Chris
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 14+ messages in thread

* ✓ Fi.CI.BAT: success for Per context and per client GPU busyness tracking
  2019-05-10 13:22 [RFC 0/6] Per context and per client GPU busyness tracking Tvrtko Ursulin
                   ` (6 preceding siblings ...)
  2019-05-10 14:13 ` ✗ Fi.CI.CHECKPATCH: warning for Per context and per client GPU busyness tracking Patchwork
@ 2019-05-10 15:06 ` Patchwork
  2019-05-10 16:48 ` ✓ Fi.CI.IGT: " Patchwork
  8 siblings, 0 replies; 14+ messages in thread
From: Patchwork @ 2019-05-10 15:06 UTC (permalink / raw)
  To: Tvrtko Ursulin; +Cc: intel-gfx

== Series Details ==

Series: Per context and per client GPU busyness tracking
URL   : https://patchwork.freedesktop.org/series/60506/
State : success

== Summary ==

CI Bug Log - changes from CI_DRM_6073 -> Patchwork_13002
====================================================

Summary
-------

  **SUCCESS**

  No regressions found.

  External URL: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13002/

Known issues
------------

  Here are the changes found in Patchwork_13002 that come from known issues:

### IGT changes ###

#### Possible fixes ####

  * igt@i915_selftest@live_hangcheck:
    - {fi-icl-u2}:        [INCOMPLETE][1] ([fdo#107713] / [fdo#108569]) -> [PASS][2]
   [1]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6073/fi-icl-u2/igt@i915_selftest@live_hangcheck.html
   [2]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13002/fi-icl-u2/igt@i915_selftest@live_hangcheck.html

  
  {name}: This element is suppressed. This means it is ignored when computing
          the status of the difference (SUCCESS, WARNING, or FAILURE).

  [fdo#107713]: https://bugs.freedesktop.org/show_bug.cgi?id=107713
  [fdo#108569]: https://bugs.freedesktop.org/show_bug.cgi?id=108569


Participating hosts (47 -> 45)
------------------------------

  Additional (3): fi-icl-y fi-blb-e6850 fi-apl-guc 
  Missing    (5): fi-ilk-m540 fi-hsw-4200u fi-byt-squawks fi-bsw-cyan fi-byt-clapper 


Build changes
-------------

  * Linux: CI_DRM_6073 -> Patchwork_13002

  CI_DRM_6073: c059ddabfe60a5072ace44a34a9de9b4202df6ec @ git://anongit.freedesktop.org/gfx-ci/linux
  IGT_4978: b9b3646d4f04dd0204ead2a1a10f9e1806a0b622 @ git://anongit.freedesktop.org/xorg/app/intel-gpu-tools
  Patchwork_13002: 816d2526319110e8920c8995c49d4f7f4c95515c @ git://anongit.freedesktop.org/gfx-ci/linux


== Linux commits ==

816d25263191 drm/i915: Add sysfs toggle to enable per-client engine stats
4c2ec282f33b drm/i915: Expose per-engine client busyness
4912359f0d14 drm/i915: Update client name on context create
83be221853b1 drm/i915: Expose list of clients in sysfs
e76b877d4273 drm/i915: Track per-context engine busyness
3ae0f10d21d1 drm/i915: Move intel_engine_context_in/out into intel_lrc.c

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13002/
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 14+ messages in thread

* ✓ Fi.CI.IGT: success for Per context and per client GPU busyness tracking
  2019-05-10 13:22 [RFC 0/6] Per context and per client GPU busyness tracking Tvrtko Ursulin
                   ` (7 preceding siblings ...)
  2019-05-10 15:06 ` ✓ Fi.CI.BAT: success " Patchwork
@ 2019-05-10 16:48 ` Patchwork
  8 siblings, 0 replies; 14+ messages in thread
From: Patchwork @ 2019-05-10 16:48 UTC (permalink / raw)
  To: Tvrtko Ursulin; +Cc: intel-gfx

== Series Details ==

Series: Per context and per client GPU busyness tracking
URL   : https://patchwork.freedesktop.org/series/60506/
State : success

== Summary ==

CI Bug Log - changes from CI_DRM_6073_full -> Patchwork_13002_full
====================================================

Summary
-------

  **SUCCESS**

  No regressions found.

  

Known issues
------------

  Here are the changes found in Patchwork_13002_full that come from known issues:

### IGT changes ###

#### Issues hit ####

  * igt@gem_softpin@noreloc-s3:
    - shard-apl:          ([PASS][1], [PASS][2]) -> [DMESG-WARN][3] ([fdo#108566])
   [1]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6073/shard-apl7/igt@gem_softpin@noreloc-s3.html
   [2]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6073/shard-apl8/igt@gem_softpin@noreloc-s3.html
   [3]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13002/shard-apl7/igt@gem_softpin@noreloc-s3.html

  * igt@i915_pm_rpm@basic-pci-d3-state:
    - shard-skl:          ([PASS][4], [PASS][5]) -> [INCOMPLETE][6] ([fdo#107807])
   [4]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6073/shard-skl1/igt@i915_pm_rpm@basic-pci-d3-state.html
   [5]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6073/shard-skl2/igt@i915_pm_rpm@basic-pci-d3-state.html
   [6]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13002/shard-skl2/igt@i915_pm_rpm@basic-pci-d3-state.html

  * igt@i915_pm_rpm@gem-execbuf-stress:
    - shard-skl:          ([PASS][7], [PASS][8]) -> [INCOMPLETE][9] ([fdo#107803] / [fdo#107807])
   [7]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6073/shard-skl7/igt@i915_pm_rpm@gem-execbuf-stress.html
   [8]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6073/shard-skl9/igt@i915_pm_rpm@gem-execbuf-stress.html
   [9]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13002/shard-skl7/igt@i915_pm_rpm@gem-execbuf-stress.html

  * igt@i915_pm_rpm@legacy-planes-dpms:
    - shard-skl:          [PASS][10] -> [INCOMPLETE][11] ([fdo#107807]) +1 similar issue
   [10]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6073/shard-skl5/igt@i915_pm_rpm@legacy-planes-dpms.html
   [11]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13002/shard-skl2/igt@i915_pm_rpm@legacy-planes-dpms.html

  * igt@kms_dp_dsc@basic-dsc-enable-edp:
    - shard-iclb:         [PASS][12] -> [SKIP][13] ([fdo#109349])
   [12]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6073/shard-iclb2/igt@kms_dp_dsc@basic-dsc-enable-edp.html
   [13]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13002/shard-iclb1/igt@kms_dp_dsc@basic-dsc-enable-edp.html

  * igt@kms_flip@2x-flip-vs-modeset-vs-hang:
    - shard-hsw:          ([PASS][14], [PASS][15]) -> [INCOMPLETE][16] ([fdo#103540])
   [14]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6073/shard-hsw2/igt@kms_flip@2x-flip-vs-modeset-vs-hang.html
   [15]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6073/shard-hsw1/igt@kms_flip@2x-flip-vs-modeset-vs-hang.html
   [16]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13002/shard-hsw1/igt@kms_flip@2x-flip-vs-modeset-vs-hang.html

  * igt@kms_flip@flip-vs-expired-vblank:
    - shard-glk:          ([PASS][17], [PASS][18]) -> [FAIL][19] ([fdo#102887] / [fdo#105363])
   [17]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6073/shard-glk5/igt@kms_flip@flip-vs-expired-vblank.html
   [18]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6073/shard-glk2/igt@kms_flip@flip-vs-expired-vblank.html
   [19]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13002/shard-glk1/igt@kms_flip@flip-vs-expired-vblank.html

  * igt@kms_frontbuffer_tracking@fbc-rgb565-draw-pwrite:
    - shard-iclb:         [PASS][20] -> [FAIL][21] ([fdo#103167])
   [20]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6073/shard-iclb2/igt@kms_frontbuffer_tracking@fbc-rgb565-draw-pwrite.html
   [21]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13002/shard-iclb6/igt@kms_frontbuffer_tracking@fbc-rgb565-draw-pwrite.html

  * igt@kms_psr@psr2_primary_mmap_gtt:
    - shard-iclb:         [PASS][22] -> [SKIP][23] ([fdo#109441]) +2 similar issues
   [22]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6073/shard-iclb2/igt@kms_psr@psr2_primary_mmap_gtt.html
   [23]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13002/shard-iclb6/igt@kms_psr@psr2_primary_mmap_gtt.html

  * igt@tools_test@tools_test:
    - shard-glk:          [PASS][24] -> [SKIP][25] ([fdo#109271])
   [24]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6073/shard-glk4/igt@tools_test@tools_test.html
   [25]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13002/shard-glk4/igt@tools_test@tools_test.html

  
#### Possible fixes ####

  * igt@gem_tiled_swapping@non-threaded:
    - shard-hsw:          ([FAIL][26], [PASS][27]) ([fdo#108686]) -> [PASS][28]
   [26]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6073/shard-hsw4/igt@gem_tiled_swapping@non-threaded.html
   [27]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6073/shard-hsw6/igt@gem_tiled_swapping@non-threaded.html
   [28]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13002/shard-hsw8/igt@gem_tiled_swapping@non-threaded.html

  * igt@i915_pm_rpm@reg-read-ioctl:
    - shard-skl:          ([PASS][29], [INCOMPLETE][30]) ([fdo#107807]) -> [PASS][31]
   [29]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6073/shard-skl6/igt@i915_pm_rpm@reg-read-ioctl.html
   [30]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6073/shard-skl1/igt@i915_pm_rpm@reg-read-ioctl.html
   [31]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13002/shard-skl9/igt@i915_pm_rpm@reg-read-ioctl.html

  * igt@kms_cursor_crc@cursor-128x128-suspend:
    - shard-apl:          ([DMESG-WARN][32], [DMESG-WARN][33]) ([fdo#108566]) -> [PASS][34]
   [32]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6073/shard-apl1/igt@kms_cursor_crc@cursor-128x128-suspend.html
   [33]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6073/shard-apl8/igt@kms_cursor_crc@cursor-128x128-suspend.html
   [34]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13002/shard-apl3/igt@kms_cursor_crc@cursor-128x128-suspend.html

  * igt@kms_cursor_crc@cursor-64x64-suspend:
    - shard-skl:          [INCOMPLETE][35] ([fdo#104108] / [fdo#107773]) -> [PASS][36]
   [35]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6073/shard-skl9/igt@kms_cursor_crc@cursor-64x64-suspend.html
   [36]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13002/shard-skl10/igt@kms_cursor_crc@cursor-64x64-suspend.html

  * igt@kms_cursor_legacy@cursor-vs-flip-atomic:
    - shard-hsw:          ([PASS][37], [INCOMPLETE][38]) ([fdo#103540]) -> [PASS][39]
   [37]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6073/shard-hsw6/igt@kms_cursor_legacy@cursor-vs-flip-atomic.html
   [38]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6073/shard-hsw2/igt@kms_cursor_legacy@cursor-vs-flip-atomic.html
   [39]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13002/shard-hsw6/igt@kms_cursor_legacy@cursor-vs-flip-atomic.html

  * igt@kms_flip@flip-vs-expired-vblank:
    - shard-skl:          [FAIL][40] ([fdo#105363]) -> [PASS][41]
   [40]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6073/shard-skl5/igt@kms_flip@flip-vs-expired-vblank.html
   [41]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13002/shard-skl1/igt@kms_flip@flip-vs-expired-vblank.html

  * igt@kms_frontbuffer_tracking@fbc-1p-primscrn-indfb-pgflip-blt:
    - shard-iclb:         [FAIL][42] ([fdo#103167]) -> [PASS][43] +1 similar issue
   [42]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6073/shard-iclb6/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-indfb-pgflip-blt.html
   [43]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13002/shard-iclb6/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-indfb-pgflip-blt.html

  * igt@kms_frontbuffer_tracking@fbc-stridechange:
    - shard-iclb:         ([FAIL][44], [PASS][45]) ([fdo#103167]) -> [PASS][46] +6 similar issues
   [44]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6073/shard-iclb7/igt@kms_frontbuffer_tracking@fbc-stridechange.html
   [45]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6073/shard-iclb6/igt@kms_frontbuffer_tracking@fbc-stridechange.html
   [46]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13002/shard-iclb1/igt@kms_frontbuffer_tracking@fbc-stridechange.html

  * igt@kms_plane_lowres@pipe-a-tiling-y:
    - shard-iclb:         ([PASS][47], [FAIL][48]) ([fdo#103166]) -> [PASS][49]
   [47]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6073/shard-iclb3/igt@kms_plane_lowres@pipe-a-tiling-y.html
   [48]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6073/shard-iclb4/igt@kms_plane_lowres@pipe-a-tiling-y.html
   [49]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13002/shard-iclb7/igt@kms_plane_lowres@pipe-a-tiling-y.html

  * igt@kms_psr2_su@page_flip:
    - shard-iclb:         ([SKIP][50], [SKIP][51]) ([fdo#109642]) -> [PASS][52]
   [50]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6073/shard-iclb5/igt@kms_psr2_su@page_flip.html
   [51]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6073/shard-iclb6/igt@kms_psr2_su@page_flip.html
   [52]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13002/shard-iclb2/igt@kms_psr2_su@page_flip.html

  * igt@kms_psr@psr2_dpms:
    - shard-iclb:         ([SKIP][53], [SKIP][54]) ([fdo#109441]) -> [PASS][55]
   [53]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6073/shard-iclb6/igt@kms_psr@psr2_dpms.html
   [54]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6073/shard-iclb7/igt@kms_psr@psr2_dpms.html
   [55]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13002/shard-iclb2/igt@kms_psr@psr2_dpms.html

  * igt@kms_sysfs_edid_timing:
    - shard-iclb:         ([PASS][56], [FAIL][57]) ([fdo#100047]) -> [PASS][58]
   [56]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6073/shard-iclb5/igt@kms_sysfs_edid_timing.html
   [57]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6073/shard-iclb3/igt@kms_sysfs_edid_timing.html
   [58]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13002/shard-iclb8/igt@kms_sysfs_edid_timing.html

  
#### Warnings ####

  * igt@i915_pm_rpm@modeset-pc8-residency-stress:
    - shard-skl:          [INCOMPLETE][59] ([fdo#107807]) -> [SKIP][60] ([fdo#109271])
   [59]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6073/shard-skl4/igt@i915_pm_rpm@modeset-pc8-residency-stress.html
   [60]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13002/shard-skl6/igt@i915_pm_rpm@modeset-pc8-residency-stress.html

  * igt@i915_suspend@debugfs-reader:
    - shard-apl:          ([DMESG-WARN][61], [PASS][62]) ([fdo#108566]) -> [DMESG-WARN][63] ([fdo#108566]) +5 similar issues
   [61]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6073/shard-apl4/igt@i915_suspend@debugfs-reader.html
   [62]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6073/shard-apl8/igt@i915_suspend@debugfs-reader.html
   [63]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13002/shard-apl5/igt@i915_suspend@debugfs-reader.html

  * igt@kms_cursor_crc@cursor-128x128-onscreen:
    - shard-skl:          ([PASS][64], [FAIL][65]) ([fdo#103232]) -> [FAIL][66] ([fdo#103232]) +1 similar issue
   [64]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6073/shard-skl8/igt@kms_cursor_crc@cursor-128x128-onscreen.html
   [65]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6073/shard-skl2/igt@kms_cursor_crc@cursor-128x128-onscreen.html
   [66]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13002/shard-skl3/igt@kms_cursor_crc@cursor-128x128-onscreen.html

  * igt@kms_frontbuffer_tracking@fbc-1p-pri-indfb-multidraw:
    - shard-iclb:         ([FAIL][67], [PASS][68]) ([fdo#103167]) -> [FAIL][69] ([fdo#103167])
   [67]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6073/shard-iclb1/igt@kms_frontbuffer_tracking@fbc-1p-pri-indfb-multidraw.html
   [68]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6073/shard-iclb8/igt@kms_frontbuffer_tracking@fbc-1p-pri-indfb-multidraw.html
   [69]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13002/shard-iclb5/igt@kms_frontbuffer_tracking@fbc-1p-pri-indfb-multidraw.html

  * igt@kms_plane_alpha_blend@pipe-a-constant-alpha-min:
    - shard-skl:          ([FAIL][70], [PASS][71]) ([fdo#108145]) -> [FAIL][72] ([fdo#108145])
   [70]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6073/shard-skl9/igt@kms_plane_alpha_blend@pipe-a-constant-alpha-min.html
   [71]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6073/shard-skl7/igt@kms_plane_alpha_blend@pipe-a-constant-alpha-min.html
   [72]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13002/shard-skl7/igt@kms_plane_alpha_blend@pipe-a-constant-alpha-min.html

  * igt@kms_plane_alpha_blend@pipe-b-coverage-7efc:
    - shard-skl:          ([PASS][73], [FAIL][74]) ([fdo#108145] / [fdo#110403]) -> [FAIL][75] ([fdo#108145] / [fdo#110403])
   [73]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6073/shard-skl8/igt@kms_plane_alpha_blend@pipe-b-coverage-7efc.html
   [74]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6073/shard-skl2/igt@kms_plane_alpha_blend@pipe-b-coverage-7efc.html
   [75]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13002/shard-skl3/igt@kms_plane_alpha_blend@pipe-b-coverage-7efc.html

  * igt@kms_psr@psr2_cursor_render:
    - shard-iclb:         ([SKIP][76], [PASS][77]) ([fdo#109441]) -> [SKIP][78] ([fdo#109441]) +2 similar issues
   [76]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6073/shard-iclb3/igt@kms_psr@psr2_cursor_render.html
   [77]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6073/shard-iclb2/igt@kms_psr@psr2_cursor_render.html
   [78]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13002/shard-iclb1/igt@kms_psr@psr2_cursor_render.html

  * igt@kms_setmode@basic:
    - shard-apl:          ([FAIL][79], [PASS][80]) ([fdo#99912]) -> [FAIL][81] ([fdo#99912])
   [79]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6073/shard-apl5/igt@kms_setmode@basic.html
   [80]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6073/shard-apl4/igt@kms_setmode@basic.html
   [81]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13002/shard-apl7/igt@kms_setmode@basic.html

  
  [fdo#100047]: https://bugs.freedesktop.org/show_bug.cgi?id=100047
  [fdo#102887]: https://bugs.freedesktop.org/show_bug.cgi?id=102887
  [fdo#103166]: https://bugs.freedesktop.org/show_bug.cgi?id=103166
  [fdo#103167]: https://bugs.freedesktop.org/show_bug.cgi?id=103167
  [fdo#103232]: https://bugs.freedesktop.org/show_bug.cgi?id=103232
  [fdo#103540]: https://bugs.freedesktop.org/show_bug.cgi?id=103540
  [fdo#104108]: https://bugs.freedesktop.org/show_bug.cgi?id=104108
  [fdo#105363]: https://bugs.freedesktop.org/show_bug.cgi?id=105363
  [fdo#107773]: https://bugs.freedesktop.org/show_bug.cgi?id=107773
  [fdo#107803]: https://bugs.freedesktop.org/show_bug.cgi?id=107803
  [fdo#107807]: https://bugs.freedesktop.org/show_bug.cgi?id=107807
  [fdo#108145]: https://bugs.freedesktop.org/show_bug.cgi?id=108145
  [fdo#108566]: https://bugs.freedesktop.org/show_bug.cgi?id=108566
  [fdo#108686]: https://bugs.freedesktop.org/show_bug.cgi?id=108686
  [fdo#109271]: https://bugs.freedesktop.org/show_bug.cgi?id=109271
  [fdo#109349]: https://bugs.freedesktop.org/show_bug.cgi?id=109349
  [fdo#109441]: https://bugs.freedesktop.org/show_bug.cgi?id=109441
  [fdo#109642]: https://bugs.freedesktop.org/show_bug.cgi?id=109642
  [fdo#110403]: https://bugs.freedesktop.org/show_bug.cgi?id=110403
  [fdo#99912]: https://bugs.freedesktop.org/show_bug.cgi?id=99912


Participating hosts (10 -> 10)
------------------------------

  No changes in participating hosts


Build changes
-------------

  * Linux: CI_DRM_6073 -> Patchwork_13002

  CI_DRM_6073: c059ddabfe60a5072ace44a34a9de9b4202df6ec @ git://anongit.freedesktop.org/gfx-ci/linux
  IGT_4978: b9b3646d4f04dd0204ead2a1a10f9e1806a0b622 @ git://anongit.freedesktop.org/xorg/app/intel-gpu-tools
  Patchwork_13002: 816d2526319110e8920c8995c49d4f7f4c95515c @ git://anongit.freedesktop.org/gfx-ci/linux
  piglit_4509: fdc5a4ca11124ab8413c7988896eec4c97336694 @ git://anongit.freedesktop.org/piglit

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13002/
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2019-05-10 16:48 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-05-10 13:22 [RFC 0/6] Per context and per client GPU busyness tracking Tvrtko Ursulin
2019-05-10 13:22 ` [RFC 1/6] drm/i915: Move intel_engine_context_in/out into intel_lrc.c Tvrtko Ursulin
2019-05-10 13:22 ` [RFC 2/6] drm/i915: Track per-context engine busyness Tvrtko Ursulin
2019-05-10 14:22   ` Chris Wilson
2019-05-10 13:22 ` [RFC 3/6] drm/i915: Expose list of clients in sysfs Tvrtko Ursulin
2019-05-10 14:12   ` Chris Wilson
2019-05-10 13:22 ` [RFC 4/6] drm/i915: Update client name on context create Tvrtko Ursulin
2019-05-10 13:22 ` [RFC 5/6] drm/i915: Expose per-engine client busyness Tvrtko Ursulin
2019-05-10 13:57   ` Chris Wilson
2019-05-10 14:02     ` Tvrtko Ursulin
2019-05-10 13:22 ` [RFC 6/6] drm/i915: Add sysfs toggle to enable per-client engine stats Tvrtko Ursulin
2019-05-10 14:13 ` ✗ Fi.CI.CHECKPATCH: warning for Per context and per client GPU busyness tracking Patchwork
2019-05-10 15:06 ` ✓ Fi.CI.BAT: success " Patchwork
2019-05-10 16:48 ` ✓ Fi.CI.IGT: " Patchwork

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.