• O
    drm/i915/bdw: Avoid non-lite-restore preemptions · e1fee72c
    Oscar Mateo 提交于
    In the current Execlists feeding mechanism, full preemption is not
    supported yet: only lite-restores are allowed (this is: the GPU
    simply samples a new tail pointer for the context currently in
    execution).
    
    But we have identified an scenario in which a full preemption occurs:
    1) We submit two contexts for execution (A & B).
    2) The GPU finishes with the first one (A), switches to the second one
    (B) and informs us.
    3) We submit B again (hoping to cause a lite restore) together with C,
    but in the time we spend writing to the ELSP, the GPU finishes B.
    4) The GPU start executing B again (since we told it so).
    5) We receive a B finished interrupt and, mistakenly, we submit C (again)
    and D, causing a full preemption of B.
    
    The race is avoided by keeping track of how many times a context has been
    submitted to the hardware and by better discriminating the received context
    switch interrupts: in the example, when we have submitted B twice, we won´t
    submit C and D as soon as we receive the notification that B is completed
    because we were expecting to get a LITE_RESTORE and we didn´t, so we know a
    second completion will be received shortly.
    
    Without this explicit checking, somehow, the batch buffer execution order
    gets messed with. This can be verified with the IGT test I sent together with
    the series. I don´t know the exact mechanism by which the pre-emption messes
    with the execution order but, since other people is working on the Scheduler
    + Preemption on Execlists, I didn´t try to fix it. In these series, only Lite
    Restores are supported (other kind of preemptions WARN).
    
    v2: elsp_submitted belongs in the new intel_ctx_submit_request. Several
    rebase changes.
    
    v3: Clarify how the race is avoided, as requested by Daniel.
    Signed-off-by: NOscar Mateo <oscar.mateo@intel.com>
    Reviewed-by: NDamien Lespiau <damien.lespiau@intel.com>
    [danvet: Align function parameters ...]
    Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
    e1fee72c
intel_lrc.c 40.7 KB