[Intel-gfx] [PATCH v2 4/5] drm/i915/guc: Make adding GuC work items lockless
Chris Wilson
chris at chris-wilson.co.uk
Tue Sep 12 21:22:12 UTC 2017
Quoting MichaĆ Winiarski (2017-09-12 18:40:55)
> @@ -434,11 +430,16 @@ static void guc_wq_item_append(struct i915_guc_client *client,
> */
> BUILD_BUG_ON(wqi_size != 16);
>
> - /* postincrement WQ tail for next time */
> - wq_off = client->wq_tail;
> + /* Find our offset and postincrement WQ tail for next time, free space
> + * is guaranteed.
> + */
> + do {
> + wq_off = READ_ONCE(desc->tail);
> + wq_next = (wq_off + wqi_size) & (GUC_WQ_SIZE - 1);
> + GEM_BUG_ON(CIRC_SPACE(wq_off, READ_ONCE(desc->head),
> + GUC_WQ_SIZE) < wqi_size);
> + } while (cmpxchg(&desc->tail, wq_off, wq_next) != wq_off);
> GEM_BUG_ON(wq_off & (wqi_size - 1));
I forgot the trick in cmpxchg to avoid the READ_ONCE in every loop:
wq_next = READ_ONCE(desc->tail);
do {
wq_off = wq_next;
wq_next = (wq_off + wqi_size) & (GUC_WQ_SIZE - 1);
GEM_BUG_ON(...);
} while ((wq_next = cmpxchg(&desc->tail, wq_off, wq_next) != wq_off);
-Chris
More information about the Intel-gfx
mailing list