On 09/03/2015 05:16 PM, Bill Fischofer wrote:
> @@ -910,23 +897,28 @@ int release_order(queue_entry_t *origin_qe, uint64_t 
> order,
>               order_release(origin_qe, 1);
>  
>               /* Check if this release allows us to unblock waiters.
> -              * Note that we can only process complete waiters since
> -              * if the sustain bit is set for a buffer this means that
> -              * some other thread is working on it and will be
> -              * responsible for resolving order when it is complete.
> +              * At the point of this call, the reorder list may contain
> +              * zero or more placeholders that need to be freed, followed
> +              * by zero or one complete reorder buffer chain.
>                */

I'm struggling to see why this is true.
From my understanding, the reorder list is sorted solely on order.
Place holders are inserted when a thread releases a scheduler while it's not 
its turn yet (thread order > order_out).

So let's assume 5 threads pulling each 1 buffer ordered 0 to 4.
For some reason, T0 is busy and not releasing/Sending anything so order_out 
stays stuck at 0

T1 frees the buffer, releases the scheduler => a place holder is inserted 
(ReorderList = P1)
T2 sends the buffer => Reorder list = P1 B2
    Scheduler release clears the sustain bit here
T3 frees the buffer and releases
T4 sends the buffer

In the end the reorder list should look like P1 B2 P3 B4

Or I am missing something here.
_______________________________________________
lng-odp mailing list
[email protected]
https://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to