From: Tvrtko Ursulin <tvrtko.ursulin@xxxxxxxxx> 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@xxxxxxxxx> Cc: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> --- 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 _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx