[Intel-gfx] [RFC 2/2] drm/i915/tracing: Enable user interrupts while intel_engine_notify is active
Tvrtko Ursulin
tursulin at ursulin.net
Mon Jun 25 17:32:37 UTC 2018
From: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
Keep the user interrupt enabled while intel_engine_notify tracepoint is
enabled.
We use tracepoint (de)registration callbacks to enable user interrupts on
all devices (future proofing and avoiding ugly global pointers) and all
engines.
Premise is that if someone is listening, they want to see interrupts
logged.
Commit to be improved...
Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
Cc: Chris Wilson <chris at chris-wilson.co.uk>
---
drivers/gpu/drm/i915/Makefile | 1 +
drivers/gpu/drm/i915/i915_drv.c | 2 +
drivers/gpu/drm/i915/i915_drv.h | 2 +
drivers/gpu/drm/i915/i915_trace.h | 50 ++++++++-------
drivers/gpu/drm/i915/i915_tracing.c | 96 +++++++++++++++++++++++++++++
drivers/gpu/drm/i915/i915_tracing.h | 13 ++++
6 files changed, 141 insertions(+), 23 deletions(-)
create mode 100644 drivers/gpu/drm/i915/i915_tracing.c
create mode 100644 drivers/gpu/drm/i915/i915_tracing.h
diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile
index 4c6adae23e18..ee082addd328 100644
--- a/drivers/gpu/drm/i915/Makefile
+++ b/drivers/gpu/drm/i915/Makefile
@@ -77,6 +77,7 @@ i915-y += i915_cmd_parser.o \
i915_request.o \
i915_timeline.o \
i915_trace_points.o \
+ i915_tracing.o \
i915_vma.o \
intel_breadcrumbs.o \
intel_engine_cs.o \
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
index 8a3ea18d8416..c634583baf57 100644
--- a/drivers/gpu/drm/i915/i915_drv.c
+++ b/drivers/gpu/drm/i915/i915_drv.c
@@ -1271,6 +1271,7 @@ static void i915_driver_register(struct drm_i915_private *dev_priv)
INIT_LIST_HEAD(&dev_priv->driver_list_link);
mutex_lock(&i915_driver_list_lock);
list_add_tail(&dev_priv->driver_list_link, &i915_driver_list);
+ i915_tracing_register(dev_priv);
mutex_unlock(&i915_driver_list_lock);
}
@@ -1285,6 +1286,7 @@ static void i915_driver_unregister(struct drm_i915_private *dev_priv)
mutex_lock(&i915_driver_list_lock);
list_del(&dev_priv->driver_list_link);
+ i915_tracing_unregister(dev_priv);
mutex_unlock(&i915_driver_list_lock);
/*
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 685bfdca3a72..4e3230713491 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -2144,6 +2144,8 @@ struct drm_i915_private {
struct list_head driver_list_link;
+ bool engine_notify_tracepoint;
+
/*
* NOTE: This is the dri1/ums dungeon, don't add stuff here. Your patch
* will be rejected. Instead look for a better place.
diff --git a/drivers/gpu/drm/i915/i915_trace.h b/drivers/gpu/drm/i915/i915_trace.h
index c0352a1b036c..12555d2388fd 100644
--- a/drivers/gpu/drm/i915/i915_trace.h
+++ b/drivers/gpu/drm/i915/i915_trace.h
@@ -8,6 +8,7 @@
#include <drm/drmP.h>
#include "i915_drv.h"
+#include "i915_tracing.h"
#include "intel_drv.h"
#include "intel_ringbuffer.h"
@@ -750,29 +751,32 @@ TRACE_EVENT(i915_request_out,
__entry->global_seqno, __entry->completed)
);
-TRACE_EVENT(intel_engine_notify,
- TP_PROTO(struct intel_engine_cs *engine, bool waiters),
- TP_ARGS(engine, waiters),
-
- TP_STRUCT__entry(
- __field(u32, dev)
- __field(u16, class)
- __field(u16, instance)
- __field(u32, seqno)
- __field(bool, waiters)
- ),
-
- TP_fast_assign(
- __entry->dev = engine->i915->drm.primary->index;
- __entry->class = engine->uabi_class;
- __entry->instance = engine->instance;
- __entry->seqno = intel_engine_get_seqno(engine);
- __entry->waiters = waiters;
- ),
-
- TP_printk("dev=%u, engine=%u:%u, seqno=%u, waiters=%u",
- __entry->dev, __entry->class, __entry->instance,
- __entry->seqno, __entry->waiters)
+TRACE_EVENT_FN(intel_engine_notify,
+ TP_PROTO(struct intel_engine_cs *engine, bool waiters),
+ TP_ARGS(engine, waiters),
+
+ TP_STRUCT__entry(
+ __field(u32, dev)
+ __field(u16, class)
+ __field(u16, instance)
+ __field(u32, seqno)
+ __field(bool, waiters)
+ ),
+
+ TP_fast_assign(
+ __entry->dev = engine->i915->drm.primary->index;
+ __entry->class = engine->uabi_class;
+ __entry->instance = engine->instance;
+ __entry->seqno = intel_engine_get_seqno(engine);
+ __entry->waiters = waiters;
+ ),
+
+ TP_printk("dev=%u, engine=%u:%u, seqno=%u, waiters=%u",
+ __entry->dev, __entry->class, __entry->instance,
+ __entry->seqno, __entry->waiters),
+
+ intel_engine_notify_tracepoint_register,
+ intel_engine_notify_tracepoint_unregister
);
DEFINE_EVENT(i915_request, i915_request_retire,
diff --git a/drivers/gpu/drm/i915/i915_tracing.c b/drivers/gpu/drm/i915/i915_tracing.c
new file mode 100644
index 000000000000..a9f486278109
--- /dev/null
+++ b/drivers/gpu/drm/i915/i915_tracing.c
@@ -0,0 +1,96 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright © 2018 Intel Corporation
+ *
+ */
+
+#include "i915_tracing.h"
+
+#include "i915_drv.h"
+#include "intel_ringbuffer.h"
+
+void i915_tracing_register(struct drm_i915_private *i915)
+{
+ struct intel_engine_cs *engine;
+ struct drm_i915_private *p;
+ enum intel_engine_id id;
+ bool enable = false;
+
+ lockdep_assert_held(&i915_driver_list_lock);
+
+ list_for_each_entry(p, &i915_driver_list, driver_list_link) {
+ enable = p->engine_notify_tracepoint;
+ if (enable)
+ break;
+ }
+
+ if (!enable)
+ return;
+
+ for_each_engine(engine, i915, id)
+ intel_engine_pin_breadcrumbs_irq(engine);
+
+ i915->engine_notify_tracepoint = true;
+}
+
+void i915_tracing_unregister(struct drm_i915_private *i915)
+{
+ struct intel_engine_cs *engine;
+ enum intel_engine_id id;
+
+ lockdep_assert_held(&i915_driver_list_lock);
+
+ if (!i915->engine_notify_tracepoint)
+ return;
+
+ for_each_engine(engine, i915, id)
+ intel_engine_unpin_breadcrumbs_irq(engine);
+
+ i915->engine_notify_tracepoint = false;
+}
+
+int intel_engine_notify_tracepoint_register(void)
+{
+ struct drm_i915_private *i915;
+
+ mutex_lock(&i915_driver_list_lock);
+ list_for_each_entry(i915, &i915_driver_list, driver_list_link) {
+ struct intel_engine_cs *engine;
+ enum intel_engine_id id;
+
+ intel_runtime_pm_get(i915);
+
+ for_each_engine(engine, i915, id)
+ intel_engine_pin_breadcrumbs_irq(engine);
+
+ intel_runtime_pm_put(i915);
+
+ GEM_BUG_ON(i915->engine_notify_tracepoint);
+ i915->engine_notify_tracepoint = true;
+ }
+ mutex_unlock(&i915_driver_list_lock);
+
+ return 0;
+}
+
+void intel_engine_notify_tracepoint_unregister(void)
+{
+ struct drm_i915_private *i915;
+
+ mutex_lock(&i915_driver_list_lock);
+ list_for_each_entry(i915, &i915_driver_list, driver_list_link) {
+ struct intel_engine_cs *engine;
+ enum intel_engine_id id;
+
+ intel_runtime_pm_get(i915);
+
+ for_each_engine(engine, i915, id)
+ intel_engine_unpin_breadcrumbs_irq(engine);
+
+ intel_runtime_pm_put(i915);
+
+ GEM_BUG_ON(!i915->engine_notify_tracepoint);
+ i915->engine_notify_tracepoint = false;
+ }
+ mutex_unlock(&i915_driver_list_lock);
+}
diff --git a/drivers/gpu/drm/i915/i915_tracing.h b/drivers/gpu/drm/i915/i915_tracing.h
new file mode 100644
index 000000000000..f5ed92428ff1
--- /dev/null
+++ b/drivers/gpu/drm/i915/i915_tracing.h
@@ -0,0 +1,13 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright © 2018 Intel Corporation
+ *
+ */
+
+#include "i915_drv.h"
+
+void i915_tracing_register(struct drm_i915_private *i915);
+void i915_tracing_unregister(struct drm_i915_private *i915);
+
+int intel_engine_notify_tracepoint_register(void);
+void intel_engine_notify_tracepoint_unregister(void);
--
2.17.1
More information about the Intel-gfx
mailing list