[PATCH 6/8] drm/i915/guc: Don't disable GuC interrupts in i915_guc_log_unregister

Sagar Arun Kamble sagar.a.kamble at intel.com
Thu Sep 21 14:34:19 UTC 2017


Functionality needed to disable GuC interrupts and cleanup the
runtime/relay data structures is already covered in the unload path
via intel_guc_fini_hw and intel_guc_cleanup hence remove
i915_guc_log_unregister

v2: Removed the function i915_guc_log_unregister.

v3: Rebase as intel_guc.h is removed.

v4: Rebase as intel_guc.h is created again. :)

v5: Rebase as intel_guc.h is removed.

v6: Updating i915_guc_log_register to remove only disabling of GuC
interrupts. In order to handle proper access to relay channel and
the log vma we need to have mutex protection between creation of
log runtime, read of the logs and cleanup of log runtime. Created
new mutex in guc.log.runtime to achieve this.

Cc: Michal Wajdeczko <michal.wajdeczko at intel.com>
Reviewed-by: Michal Wajdeczko <michal.wajdeczko at intel.com>
Signed-off-by: Sagar Arun Kamble <sagar.a.kamble at intel.com>
---
 drivers/gpu/drm/i915/intel_guc_log.c | 40 +++++++++++++++++++++++-------------
 drivers/gpu/drm/i915/intel_uc.c      |  1 +
 drivers/gpu/drm/i915/intel_uc.h      |  1 +
 3 files changed, 28 insertions(+), 14 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_guc_log.c b/drivers/gpu/drm/i915/intel_guc_log.c
index 16d3b87..c77a432 100644
--- a/drivers/gpu/drm/i915/intel_guc_log.c
+++ b/drivers/gpu/drm/i915/intel_guc_log.c
@@ -440,17 +440,23 @@ static int guc_log_runtime_create(struct intel_guc *guc)
 
 static void guc_log_runtime_destroy(struct intel_guc *guc)
 {
+	mutex_lock(&guc->log.runtime.lock);
+
 	/*
 	 * It's possible that the runtime stuff was never allocated because
 	 * guc_log_level was < 0 at the time
 	 **/
-	if (!guc_log_has_runtime(guc))
+	if (!guc_log_has_runtime(guc)) {
+		mutex_unlock(&guc->log.runtime.lock);
 		return;
+	}
 
 	destroy_workqueue(guc->log.runtime.flush_wq);
 	relay_close(guc->log.runtime.relay_chan);
 	i915_gem_object_unpin_map(guc->log.vma->obj);
 	guc->log.runtime.buf_addr = NULL;
+
+	mutex_unlock(&guc->log.runtime.lock);
 }
 
 static int guc_log_late_setup(struct intel_guc *guc)
@@ -460,35 +466,43 @@ static int guc_log_late_setup(struct intel_guc *guc)
 
 	lockdep_assert_held(&dev_priv->drm.struct_mutex);
 
+	mutex_lock(&guc->log.runtime.lock);
+
 	if (!guc_log_has_runtime(guc)) {
 		/* If log_level was set as -1 at boot time, then setup needed to
 		 * handle log buffer flush interrupts would not have been done yet,
 		 * so do that now.
 		 */
 		ret = guc_log_runtime_create(guc);
-		if (ret)
-			goto err;
+		if (ret) {
+			/* logging will remain off */
+			i915.guc_log_level = -1;
+			mutex_unlock(&guc->log.runtime.lock);
+			return ret;
+		}
 	}
 
 	ret = guc_log_relay_file_create(guc);
-	if (ret)
-		goto err_runtime;
+	if (ret) {
+		mutex_unlock(&guc->log.runtime.lock);
+		guc_log_runtime_destroy(guc);
+		/* logging will remain off */
+		i915.guc_log_level = -1;
+		return ret;
+	}
 
-	return 0;
+	mutex_unlock(&guc->log.runtime.lock);
 
-err_runtime:
-	guc_log_runtime_destroy(guc);
-err:
-	/* logging will remain off */
-	i915.guc_log_level = -1;
-	return ret;
+	return 0;
 }
 
 static void guc_log_capture_logs(struct intel_guc *guc)
 {
 	struct drm_i915_private *dev_priv = guc_to_i915(guc);
 
+	mutex_lock(&guc->log.runtime.lock);
 	guc_read_update_log_buffer(guc);
+	mutex_unlock(&guc->log.runtime.lock);
 
 	/* Generally device is expected to be active only at this
 	 * time, so get/put should be really quick.
@@ -655,8 +669,6 @@ void i915_guc_log_unregister(struct drm_i915_private *dev_priv)
 		return;
 
 	mutex_lock(&dev_priv->drm.struct_mutex);
-	/* GuC logging is currently the only user of Guc2Host interrupts */
-	gen9_disable_guc_interrupts(dev_priv);
 	guc_log_runtime_destroy(&dev_priv->guc);
 	mutex_unlock(&dev_priv->drm.struct_mutex);
 }
diff --git a/drivers/gpu/drm/i915/intel_uc.c b/drivers/gpu/drm/i915/intel_uc.c
index 9807dcd..450625b 100644
--- a/drivers/gpu/drm/i915/intel_uc.c
+++ b/drivers/gpu/drm/i915/intel_uc.c
@@ -108,6 +108,7 @@ void intel_uc_init_early(struct drm_i915_private *dev_priv)
 	intel_guc_ct_init_early(&guc->ct);
 
 	mutex_init(&guc->send_mutex);
+	mutex_init(&guc->log.runtime.lock);
 	guc->send = intel_guc_send_nop;
 	guc->notify = gen8_guc_raise_irq;
 }
diff --git a/drivers/gpu/drm/i915/intel_uc.h b/drivers/gpu/drm/i915/intel_uc.h
index c6038de..620419c 100644
--- a/drivers/gpu/drm/i915/intel_uc.h
+++ b/drivers/gpu/drm/i915/intel_uc.h
@@ -147,6 +147,7 @@ struct intel_guc_log {
 		struct workqueue_struct *flush_wq;
 		struct work_struct flush_work;
 		struct rchan *relay_chan;
+		struct mutex lock;
 	} runtime;
 	/* logging related stats */
 	u32 capture_miss_count;
-- 
1.9.1



More information about the Intel-gfx-trybot mailing list