[Intel-gfx] [PATCH v2] drm/i915/guc: Enable guc logging on guc log relay write

Matthew Brost matthew.brost at intel.com
Tue Sep 17 21:00:26 UTC 2019


On Mon, Sep 16, 2019 at 03:50:18PM -0700, Robert M. Fosha wrote:
>Creating and opening the GuC log relay file enables and starts
>the relay potentially before the caller is ready to consume logs.
>Change the behavior so that relay starts only on an explicit call
>to the write function (with a value of '1'). Other values flush
>the log relay as before.
>
>v2: Style changes and fix typos. Add guc_log_relay_stop()
>function. (Daniele)
>
>Cc: Matthew Brost <matthew.brost at intel.com>
>Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio at intel.com>
>Cc: Michal Wajdeczko <michal.wajdeczko at intel.com>
>Signed-off-by: Robert M. Fosha <robert.m.fosha at intel.com>
>---
> drivers/gpu/drm/i915/gt/uc/intel_guc_log.c | 53 +++++++++++++++++-----
> drivers/gpu/drm/i915/gt/uc/intel_guc_log.h |  4 +-
> drivers/gpu/drm/i915/i915_debugfs.c        | 22 +++++++--
> 3 files changed, 62 insertions(+), 17 deletions(-)
>

Reviewed-by: Matthew Brost <matthew.brost at intel.com>

>diff --git a/drivers/gpu/drm/i915/gt/uc/intel_guc_log.c b/drivers/gpu/drm/i915/gt/uc/intel_guc_log.c
>index 36332064de9c..e26c7748358b 100644
>--- a/drivers/gpu/drm/i915/gt/uc/intel_guc_log.c
>+++ b/drivers/gpu/drm/i915/gt/uc/intel_guc_log.c
>@@ -226,7 +226,7 @@ static void guc_read_update_log_buffer(struct intel_guc_log *log)
>
> 	mutex_lock(&log->relay.lock);
>
>-	if (WARN_ON(!intel_guc_log_relay_enabled(log)))
>+	if (WARN_ON(!intel_guc_log_relay_created(log)))
> 		goto out_unlock;
>
> 	/* Get the pointer to shared GuC log buffer */
>@@ -361,6 +361,7 @@ void intel_guc_log_init_early(struct intel_guc_log *log)
> {
> 	mutex_init(&log->relay.lock);
> 	INIT_WORK(&log->relay.flush_work, capture_logs_work);
>+	log->relay.started = false;
> }
>
> static int guc_log_relay_create(struct intel_guc_log *log)
>@@ -546,7 +547,7 @@ int intel_guc_log_set_level(struct intel_guc_log *log, u32 level)
> 	return ret;
> }
>
>-bool intel_guc_log_relay_enabled(const struct intel_guc_log *log)
>+bool intel_guc_log_relay_created(const struct intel_guc_log *log)
> {
> 	return log->relay.buf_addr;
> }
>@@ -560,7 +561,7 @@ int intel_guc_log_relay_open(struct intel_guc_log *log)
>
> 	mutex_lock(&log->relay.lock);
>
>-	if (intel_guc_log_relay_enabled(log)) {
>+	if (intel_guc_log_relay_created(log)) {
> 		ret = -EEXIST;
> 		goto out_unlock;
> 	}
>@@ -585,6 +586,21 @@ int intel_guc_log_relay_open(struct intel_guc_log *log)
>
> 	mutex_unlock(&log->relay.lock);
>
>+	return 0;
>+
>+out_relay:
>+	guc_log_relay_destroy(log);
>+out_unlock:
>+	mutex_unlock(&log->relay.lock);
>+
>+	return ret;
>+}
>+
>+int intel_guc_log_relay_start(struct intel_guc_log *log)
>+{
>+	if (log->relay.started)
>+		return -EEXIST;
>+
> 	guc_log_enable_flush_events(log);
>
> 	/*
>@@ -594,14 +610,9 @@ int intel_guc_log_relay_open(struct intel_guc_log *log)
> 	 */
> 	queue_work(system_highpri_wq, &log->relay.flush_work);
>
>-	return 0;
>-
>-out_relay:
>-	guc_log_relay_destroy(log);
>-out_unlock:
>-	mutex_unlock(&log->relay.lock);
>+	log->relay.started = true;
>
>-	return ret;
>+	return 0;
> }
>
> void intel_guc_log_relay_flush(struct intel_guc_log *log)
>@@ -610,6 +621,9 @@ void intel_guc_log_relay_flush(struct intel_guc_log *log)
> 	struct drm_i915_private *i915 = guc_to_gt(guc)->i915;
> 	intel_wakeref_t wakeref;
>
>+	if (!log->relay.started)
>+		return;
>+
> 	/*
> 	 * Before initiating the forceful flush, wait for any pending/ongoing
> 	 * flush to complete otherwise forceful flush may not actually happen.
>@@ -623,18 +637,33 @@ void intel_guc_log_relay_flush(struct intel_guc_log *log)
> 	guc_log_capture_logs(log);
> }
>
>-void intel_guc_log_relay_close(struct intel_guc_log *log)
>+/*
>+ * Stops the relay log. Called from intel_guc_log_relay_close(), so no
>+ * possibility of race with start/flush since relay_write cannot race
>+ * relay_close.
>+ */
>+static void guc_log_relay_stop(struct intel_guc_log *log)
> {
> 	struct intel_guc *guc = log_to_guc(log);
> 	struct drm_i915_private *i915 = guc_to_gt(guc)->i915;
>
>+	if (!log->relay.started)
>+		return;
>+
> 	guc_log_disable_flush_events(log);
> 	intel_synchronize_irq(i915);
>
> 	flush_work(&log->relay.flush_work);
>
>+	log->relay.started = false;
>+}
>+
>+void intel_guc_log_relay_close(struct intel_guc_log *log)
>+{
>+	guc_log_relay_stop(log);
>+
> 	mutex_lock(&log->relay.lock);
>-	GEM_BUG_ON(!intel_guc_log_relay_enabled(log));
>+	GEM_BUG_ON(!intel_guc_log_relay_created(log));
> 	guc_log_unmap(log);
> 	guc_log_relay_destroy(log);
> 	mutex_unlock(&log->relay.lock);
>diff --git a/drivers/gpu/drm/i915/gt/uc/intel_guc_log.h b/drivers/gpu/drm/i915/gt/uc/intel_guc_log.h
>index 6f764879acb1..c252c022c5fc 100644
>--- a/drivers/gpu/drm/i915/gt/uc/intel_guc_log.h
>+++ b/drivers/gpu/drm/i915/gt/uc/intel_guc_log.h
>@@ -47,6 +47,7 @@ struct intel_guc_log {
> 	struct i915_vma *vma;
> 	struct {
> 		void *buf_addr;
>+		bool started;
> 		struct work_struct flush_work;
> 		struct rchan *channel;
> 		struct mutex lock;
>@@ -65,8 +66,9 @@ int intel_guc_log_create(struct intel_guc_log *log);
> void intel_guc_log_destroy(struct intel_guc_log *log);
>
> int intel_guc_log_set_level(struct intel_guc_log *log, u32 level);
>-bool intel_guc_log_relay_enabled(const struct intel_guc_log *log);
>+bool intel_guc_log_relay_created(const struct intel_guc_log *log);
> int intel_guc_log_relay_open(struct intel_guc_log *log);
>+int intel_guc_log_relay_start(struct intel_guc_log *log);
> void intel_guc_log_relay_flush(struct intel_guc_log *log);
> void intel_guc_log_relay_close(struct intel_guc_log *log);
>
>diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
>index 43db50095257..3f86f2b60b92 100644
>--- a/drivers/gpu/drm/i915/i915_debugfs.c
>+++ b/drivers/gpu/drm/i915/i915_debugfs.c
>@@ -1871,8 +1871,8 @@ static void i915_guc_log_info(struct seq_file *m,
> 	struct intel_guc_log *log = &dev_priv->gt.uc.guc.log;
> 	enum guc_log_buffer_type type;
>
>-	if (!intel_guc_log_relay_enabled(log)) {
>-		seq_puts(m, "GuC log relay disabled\n");
>+	if (!intel_guc_log_relay_created(log)) {
>+		seq_puts(m, "GuC log relay not created\n");
> 		return;
> 	}
>
>@@ -2059,9 +2059,23 @@ i915_guc_log_relay_write(struct file *filp,
> 			 loff_t *ppos)
> {
> 	struct intel_guc_log *log = filp->private_data;
>+	int val;
>+	int ret;
>
>-	intel_guc_log_relay_flush(log);
>-	return cnt;
>+	ret = kstrtoint_from_user(ubuf, cnt, 0, &val);
>+	if (ret < 0)
>+		return ret;
>+
>+	/*
>+	 * Enable and start the guc log relay on value of 1.
>+	 * Flush log relay for any other value.
>+	 */
>+	if (val == 1)
>+		ret = intel_guc_log_relay_start(log);
>+	else
>+		intel_guc_log_relay_flush(log);
>+
>+	return ret ?: cnt;
> }
>
> static int i915_guc_log_relay_release(struct inode *inode, struct file *file)
>-- 
>2.21.0.5.gaeb582a983
>


More information about the Intel-gfx mailing list