Am 06.08.19 um 21:24 schrieb Chris Wilson:
Quoting Christian König (2019-08-06 16:01:33)
Add a new helper to get a consistent set of pointers from the reservation
object. While at it group all access helpers together in the header file.
Ah, needs to be earlier :)

Ah, crap. That got incorrectly reordered while moving the fixes to the beginning of the set.

+/**
+ * reservation_object_fences - read consistent fence pointers
+ * @obj: reservation object where we get the fences from
+ * @excl: pointer for the exclusive fence
+ * @list: pointer for the shared fence list
+ *
+ * Make sure we have a consisten exclusive fence and shared fence list.
+ * Must be called with rcu read side lock held.
+ */
+static inline void
+reservation_object_fences(struct reservation_object *obj,
+                         struct dma_fence **excl,
+                         struct reservation_object_list **list)
+{
+       unsigned int seq;
+
+       do {
+               seq = read_seqcount_begin(&obj->seq);
+               *excl = rcu_dereference(obj->fence_excl);
+               *list = rcu_dereference(obj->fence);
+       } while (read_seqcount_retry(&obj->seq, seq));
+}
I would personally prefer return excl rather than have it as a second
outparam, but I'd leave that to gcc to decide.

Having stared at this, I agree this does the right thing. The important
point from all callers' perspective is that the combination of pointers
is consistent for this rcu_read_lock. And rcu_dereference enforces the
callers do hold rcu_read_lock.

I didn't check all the conversions, just stared at the heart of the
problem.

Reviewed-by: Chris Wilson <ch...@chris-wilson.co.uk>

Thanks.

Going to fix that up,
Christian.

-Chris

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to