Commit 581c26e8 authored by John Harrison's avatar John Harrison Committed by Daniel Vetter

drm/i915: Convert 'trace_irq' to use requests rather than seqnos

Updated the trace_irq code to use requests instead of seqnos. This includes
reference counting the request object to ensure it sticks around when required.
Note that getting access to the reference counting functions means moving the
inline i915_trace_irq_get() function from intel_ringbuffer.h to i915_drv.h.

For: VIZ-4377
Signed-off-by: default avatarJohn Harrison <John.C.Harrison@Intel.com>
Reviewed-by: default avatarThomas Daniel <Thomas.Daniel@intel.com>
[danvet: Resolve conflict due to shuffled merge order.]
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent 3a8a946e
...@@ -3132,4 +3132,11 @@ wait_remaining_ms_from_jiffies(unsigned long timestamp_jiffies, int to_wait_ms) ...@@ -3132,4 +3132,11 @@ wait_remaining_ms_from_jiffies(unsigned long timestamp_jiffies, int to_wait_ms)
} }
} }
static inline void i915_trace_irq_get(struct intel_engine_cs *ring,
struct drm_i915_gem_request *req)
{
if (ring->trace_irq_req == NULL && ring->irq_get(ring))
i915_gem_request_assign(&ring->trace_irq_req, req);
}
#endif #endif
...@@ -2786,11 +2786,10 @@ i915_gem_retire_requests_ring(struct intel_engine_cs *ring) ...@@ -2786,11 +2786,10 @@ i915_gem_retire_requests_ring(struct intel_engine_cs *ring)
i915_gem_free_request(request); i915_gem_free_request(request);
} }
if (unlikely(ring->trace_irq_seqno && if (unlikely(ring->trace_irq_req &&
i915_seqno_passed(ring->get_seqno(ring, true), i915_gem_request_completed(ring->trace_irq_req, true))) {
ring->trace_irq_seqno))) {
ring->irq_put(ring); ring->irq_put(ring);
ring->trace_irq_seqno = 0; i915_gem_request_assign(&ring->trace_irq_req, NULL);
} }
WARN_ON(i915_verify_lists(ring->dev)); WARN_ON(i915_verify_lists(ring->dev));
......
...@@ -369,7 +369,7 @@ TRACE_EVENT(i915_gem_ring_dispatch, ...@@ -369,7 +369,7 @@ TRACE_EVENT(i915_gem_ring_dispatch,
__entry->ring = ring->id; __entry->ring = ring->id;
__entry->seqno = i915_gem_request_get_seqno(req); __entry->seqno = i915_gem_request_get_seqno(req);
__entry->flags = flags; __entry->flags = flags;
i915_trace_irq_get(ring, __entry->seqno); i915_trace_irq_get(ring, req);
), ),
TP_printk("dev=%u, ring=%u, seqno=%u, flags=%x", TP_printk("dev=%u, ring=%u, seqno=%u, flags=%x",
......
...@@ -142,7 +142,7 @@ struct intel_engine_cs { ...@@ -142,7 +142,7 @@ struct intel_engine_cs {
unsigned irq_refcount; /* protected by dev_priv->irq_lock */ unsigned irq_refcount; /* protected by dev_priv->irq_lock */
u32 irq_enable_mask; /* bitmask to enable ring interrupt */ u32 irq_enable_mask; /* bitmask to enable ring interrupt */
u32 trace_irq_seqno; struct drm_i915_gem_request *trace_irq_req;
bool __must_check (*irq_get)(struct intel_engine_cs *ring); bool __must_check (*irq_get)(struct intel_engine_cs *ring);
void (*irq_put)(struct intel_engine_cs *ring); void (*irq_put)(struct intel_engine_cs *ring);
...@@ -442,10 +442,4 @@ intel_ring_get_request(struct intel_engine_cs *ring) ...@@ -442,10 +442,4 @@ intel_ring_get_request(struct intel_engine_cs *ring)
return ring->outstanding_lazy_request; return ring->outstanding_lazy_request;
} }
static inline void i915_trace_irq_get(struct intel_engine_cs *ring, u32 seqno)
{
if (ring->trace_irq_seqno == 0 && ring->irq_get(ring))
ring->trace_irq_seqno = seqno;
}
#endif /* _INTEL_RINGBUFFER_H_ */ #endif /* _INTEL_RINGBUFFER_H_ */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment