• Chris Wilson's avatar
    drm/i915: Prevent bonded requests from overtaking each other on preemption · e2144503
    Chris Wilson authored
    Force bonded requests to run on distinct engines so that they cannot be
    shuffled onto the same engine where timeslicing will reverse the order.
    A bonded request will often wait on a semaphore signaled by its master,
    creating an implicit dependency -- if we ignore that implicit dependency
    and allow the bonded request to run on the same engine and before its
    master, we will cause a GPU hang. [Whether it will hang the GPU is
    debatable, we should keep on timeslicing and each timeslice should be
    "accidentally" counted as forward progress, in which case it should run
    but at one-half to one-third speed.]
    We can prevent this inversion by restricting which engines we allow
    ourselves to jump to upon preemption, i.e. baking in the arrangement
    established at first execution. (We should also consider capturing the
    implicit dependency using i915_sched_add_dependency(), but first we need
    to think about the constraints that requires on the execution/retirement
    Fixes: 8ee36e04 ("drm/i915/execlists: Minimalistic timeslicing")
    References: ee113690
     ("drm/i915/execlists: Virtual engine bonding")
    Testcase: igt/gem_exec_balancer/bonded-slice
    Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
    Cc: Mika Kuoppala <mika.kuoppala@linux.intel.com>
    Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
    Reviewed-by: default avatarTvrtko Ursulin <tvrtko.ursulin@intel.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20190923152844.8914-3-chris@chris-wilson.co.uk