drm/i915: Use exponential backoff for wait_for()
authorChris Wilson <chris@chris-wilson.co.uk>
Fri, 24 Nov 2017 13:00:30 +0000 (13:00 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Fri, 24 Nov 2017 16:09:51 +0000 (16:09 +0000)
commita54b1873c0e3ffec3041cf72cb10d986d6bc4fe5
tree2d9f9d176c3d3b6eb2da1253678d66f545ad1f85
parent8c5da3bbcfd9cf763623f2d9515ace8eb3f01307
drm/i915: Use exponential backoff for wait_for()

Instead of sleeping for a fixed 1ms (roughly, depending on timer slack),
start with a small sleep and exponentially increase the sleep on each
cycle.

A good example of a beneficiary is the guc mmio communication channel.
Typically we expect (and so spin) for 10us for a quick response, but this
doesn't cover everything and so sometimes we fallback to the millisecond+
sleep. This incurs a significant delay in time-critical operations like
preemption (igt/gem_exec_latency), which can be improved significantly by
using a small sleep after the spin fails.

We've made this suggestion many times, but had little experimental data
to support adding the complexity.

v2: Bump the minimum usleep to 10us on advice of
Documentation/timers/timers-howto.txt (Tvrko)
v3: Specify min, max range for usleep intervals -- some code may
crucially depend upon and so want to specify the sleep pattern.

References: 1758b90e38f5 ("drm/i915: Use a hybrid scheme for fast register waits")
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Cc: John Harrison <John.C.Harrison@intel.com>
Cc: Michał Winiarski <michal.winiarski@intel.com>
Cc: Ville Syrjala <ville.syrjala@linux.intel.com>
Reviewed-by: Michał Winiarski <michal.winiarski@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20171124130031.20761-2-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/intel_drv.h
drivers/gpu/drm/i915/intel_pm.c