summaryrefslogtreecommitdiff
path: root/Documentation
diff options
context:
space:
mode:
authorJohn Harrison <John.C.Harrison@Intel.com>2015-04-28 11:39:41 +0100
committerJohn Harrison <John.C.Harrison@Intel.com>2016-05-06 14:13:06 +0100
commitd24b6c144b0e3e1f0af83400d1995f6cbe97c802 (patch)
tree8b555c988765bd8e01c6e627afb6148cf8c2c322 /Documentation
parent1547967b7af347222e33c4e95f2301e9b0582138 (diff)
drm/i915: Allow scheduler to manage inter-ring object synchronisation
The scheduler has always tracked batch buffer dependencies based on DRM object usage. This means that it will not submit a batch on one ring that has outstanding dependencies still executing on other rings. This is exactly the same synchronisation performed by i915_gem_object_sync() using hardware semaphores where available and CPU stalls where not (e.g. in execlist mode and/or on Gen8 hardware). Unfortunately, when a batch buffer is submitted to the driver the _object_sync() call happens first. Thus in case where hardware semaphores are disabled, the driver has already stalled until the dependency has been resolved. This patch adds an optimisation to _object_sync() to ignore the synchronisation in the case where it will subsequently be handled by the scheduler. This removes the driver stall and (in the single application case) provides near hardware semaphore performance even when hardware semaphores are disabled. In a busy system where there is other work that can be executed on the stalling ring, it provides better than hardware semaphore performance as it removes the stall from both the driver and from the hardware. There is also a theory that this method should improve power usage as hardware semaphores are apparently not very power efficient - the stalled ring does not go into as low a power a state as when it is genuinely idle. The optimisation is to check whether both ends of the synchronisation are batch buffer requests. If they are, then the scheduler will have the inter-dependency tracked and managed. If one or other end is not a batch buffer request (e.g. a page flip) then the code falls back to the CPU stall or hardware semaphore as appropriate. To check whether the existing usage is a batch buffer, the code simply calls the 'are you tracking this request' function of the scheduler on the object's last_read_req member. To check whether the new usage is a batch buffer, a flag is passed in from the caller. v6: Updated to newer nightly (lots of ring -> engine renaming). Replaced the i915_scheduler_is_request_tracked() function with i915_scheduler_is_request_batch_buffer() as the need for the former has gone away and it was really being used to ask the latter question in a convoluted manner. [review feedback from Joonas Lahtinen] Issue: VIZ-5566 Signed-off-by: John Harrison <John.C.Harrison@Intel.com>
Diffstat (limited to 'Documentation')
0 files changed, 0 insertions, 0 deletions