drm/i915/perf: better pipeline aged/aging tail updates
This updates the tail pointer race workaround handling to updating the 'aged' pointer before looking to start aging a new one. There's the possibility that there is already new data available and so we can immediately start aging a new pointer without having to first wait for a later hrtimer callback (and then another to age). Signed-off-by: Robert Bragg <robert@sixbynine.org> Reviewed-by: Matthew Auld <matthew.auld@intel.com> Link: http://patchwork.freedesktop.org/patch/msgid/20170511154345.962-8-lionel.g.landwerlin@intel.com Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
parent
52c57c263f
commit
4117ebc74c
|
@ -391,6 +391,29 @@ static bool gen7_oa_buffer_check_unlocked(struct drm_i915_private *dev_priv)
|
|||
|
||||
now = ktime_get_mono_fast_ns();
|
||||
|
||||
/* Update the aged tail
|
||||
*
|
||||
* Flip the tail pointer available for read()s once the aging tail is
|
||||
* old enough to trust that the corresponding data will be visible to
|
||||
* the CPU...
|
||||
*
|
||||
* Do this before updating the aging pointer in case we may be able to
|
||||
* immediately start aging a new pointer too (if new data has become
|
||||
* available) without needing to wait for a later hrtimer callback.
|
||||
*/
|
||||
if (aging_tail != INVALID_TAIL_PTR &&
|
||||
((now - dev_priv->perf.oa.oa_buffer.aging_timestamp) >
|
||||
OA_TAIL_MARGIN_NSEC)) {
|
||||
aged_idx ^= 1;
|
||||
dev_priv->perf.oa.oa_buffer.aged_tail_idx = aged_idx;
|
||||
|
||||
aged_tail = aging_tail;
|
||||
|
||||
/* Mark that we need a new pointer to start aging... */
|
||||
dev_priv->perf.oa.oa_buffer.tails[!aged_idx].offset = INVALID_TAIL_PTR;
|
||||
aging_tail = INVALID_TAIL_PTR;
|
||||
}
|
||||
|
||||
/* Update the aging tail
|
||||
*
|
||||
* We throttle aging tail updates until we have a new tail that
|
||||
|
@ -420,24 +443,6 @@ static bool gen7_oa_buffer_check_unlocked(struct drm_i915_private *dev_priv)
|
|||
}
|
||||
}
|
||||
|
||||
/* Update the aged tail
|
||||
*
|
||||
* Flip the tail pointer available for read()s once the aging tail is
|
||||
* old enough to trust that the corresponding data will be visible to
|
||||
* the CPU...
|
||||
*/
|
||||
if (aging_tail != INVALID_TAIL_PTR &&
|
||||
((now - dev_priv->perf.oa.oa_buffer.aging_timestamp) >
|
||||
OA_TAIL_MARGIN_NSEC)) {
|
||||
aged_idx ^= 1;
|
||||
dev_priv->perf.oa.oa_buffer.aged_tail_idx = aged_idx;
|
||||
|
||||
aged_tail = aging_tail;
|
||||
|
||||
/* Mark that we need a new pointer to start aging... */
|
||||
dev_priv->perf.oa.oa_buffer.tails[!aged_idx].offset = INVALID_TAIL_PTR;
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&dev_priv->perf.oa.oa_buffer.ptr_lock, flags);
|
||||
|
||||
return aged_tail == INVALID_TAIL_PTR ?
|
||||
|
|
Loading…
Reference in New Issue