[Intel-gfx] About dealing with CSB.context element switch in execlist mode.

Dave Gordon david.s.gordon at intel.com
Thu Nov 26 08:47:43 PST 2015


On 25/11/15 13:17, Wang, Zhi A wrote:
> OK. I see. Thanks Michel! :) Have a nice day. :)
>
> Thanks,
> Zhi.
>
>> -----Original Message-----
>> From: Thierry, Michel
>> Sent: Wednesday, November 25, 2015 9:15 PM
>> To: Wang, Zhi A; intel-gfx at lists.freedesktop.org
>> Cc: Han, Xu; Li, Weinan Z; He, Min; Lv, Zhiyuan; Tian, Kevin
>> Subject: Re: [Intel-gfx] About dealing with CSB.context element switch in
>> execlist mode.
>>
>> On 11/25/2015 1:00 PM, Wang, Zhi A wrote:
>>> Another question about EXECLIST is: Can a preemption happen between
>> element switch?
>>>
>>> I know this is beyond the scope of i915 a little. I'm just curious if it's possible.
>>>
>>> Let's say we have context A B C
>>>
>>> At first, we submit context A B in one ELSP write.
>>> Then, we submit context C in another ELSP write at some time.
>>>
>>> If context A or B is running and gets preempted, then there will be
>> CSB.preempted in CSB buffer. This is the normal behavior.
>>>
>>> I'm wondering that if there is any possibility that a preemption can happen
>> between the two elements.
>>>
>>> Then the CSB should look like:
>>>
>>> [CSB 0 idle-to-active]
>>> [CSB 1 CTX A element_switch/context_complete] [CSB 2 CTX C
>>> active-to-idle/context_complete]
>>>
>>> Is it possible?
>>
>> I would expect to always have a preempted event in the CSB, even in the
>> remote case that A already completed and B hasn't started; there was an
>> active execlist and it has been replaced by a new one:
>>
>>    [CSB 0 idle-to-active]
>>    [CSB 1 CTX A element_switch/context_complete]
>>    [CSB 2 preempted ]
>>    [CSB 3 CTX C active-to-idle/context_complete]
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx

A few examples of CSB sequences you may see:

CSB[1]: 0x000.00000 / 0x00000001  I->A
CSB[2]: 0x201.018df / 0x00000018                 A->I DONE
CSB[3]: 0x000.00000 / 0x00000001  I->A
CSB[4]: 0x201.018df / 0x00000018                 A->I DONE
CSB[5]: 0x000.00000 / 0x00000001  I->A
CSB[0]: 0x201.018df / 0x00000018                 A->I DONE

This is as simple as it gets. A single context is repeatedly submitted, 
and each time it completes before being resubmitted.

CSB[3]: 0x000.00000 / 0x00000001  I->A
CSB[4]: 0x601.018e6 / 0x00008002       PRMT                LITE
CSB[5]: 0x601.018e6 / 0x00000018                 A->I DONE
CSB[0]: 0x000.00000 / 0x00000001  I->A
CSB[1]: 0x601.018e6 / 0x00008002       PRMT                LITE
CSB[2]: 0x601.018e6 / 0x00000018                 A->I DONE

Here again a single context is in use, but this time it was submitted, 
then updated and resubmitted while still executing (lite restore), then 
completed. This whole sequence repeats twice.

CSB[4]: 0x001.02935 / 0x00000018                 A->I DONE
CSB[5]: 0x000.00000 / 0x00000001  I->A
CSB[0]: 0x001.02935 / 0x00000018                 A->I DONE
CSB[1]: 0x000.00000 / 0x00000001  I->A
CSB[2]: 0x001.02935 / 0x00000002       PRMT
CSB[3]: 0x001.02950 / 0x00000018                 A->I DONE

This is a genuine preemption. We see context A (02935) being submitted 
and completed twice, but during the third execution is gets preempted. 
The last line shows the completion of context B (02950) that preempted 
context A.

CSB[3]: 0x000.00000 / 0x00000001  I->A
CSB[4]: 0x001.018ed / 0x00000002       PRMT
CSB[5]: 0x001.01908 / 0x00000018                 A->I DONE
CSB[0]: 0x000.00000 / 0x00000001  I->A
CSB[1]: 0x001.01908 / 0x00000018                 A->I DONE
CSB[2]: 0x000.00000 / 0x00000001  I->A

Here, context A (018ed) was started, then preempted by a higher-priority 
context B (01908), which got to run to completion twice before another 
context (presumably A) was (re)started. We infer that A (or whatever 
other context was most recently submitted) was still running at the 
instant when this trace was captured.

The PRMT (without LITE) event always indicates the identity of the 
context that was preempted. In the case of preemption after a dual 
submission, it may be either the first or the second workload that gets 
preempted, but it must be one or the other (there's no "idle" window 
between finishing the first and starting the second in which preemption 
could occur). In addition, preemption is actually disabled while context 
restore is in progress, so if the ELSP is written after the GPU has 
committed to loading a context, the preemption won't happen until the 
load is completed. [This is subject to change, but this how it's set up 
on Skylake today].

HTH,
.Dave.



More information about the Intel-gfx mailing list