In the atomic modesetting path, each driver simply wants to grab a ref
to the exclusive fence from a reservation object to store in the incoming
drm_plane_state, without doing the whole RCU dance.  Since each driver
will need to do this, lets make a helper.

v2: rename to _rcu instead of _unlocked to be more consistent

Signed-off-by: Rob Clark <robdclark at gmail.com>
---
Note that danvet also suggested addition of headerdoc.  But it was a
trap!  In the process I discovered that some files were missing from
the DocBook tmpl, some fixup needed, and complete lack of reservation
related headerdoc.

So the patchset to fixup all that will follow in a few minutes.  But
danvet's punishment for tricking me into fixing that all up is that
the headerdoc he wants applies on top of the patch that I want ;-)

 include/linux/reservation.h | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/include/linux/reservation.h b/include/linux/reservation.h
index 5a0b64c..49d0576 100644
--- a/include/linux/reservation.h
+++ b/include/linux/reservation.h
@@ -120,6 +120,24 @@ reservation_object_get_excl(struct reservation_object *obj)
                                         reservation_object_held(obj));
 }

+static inline struct fence *
+reservation_object_get_excl_rcu(struct reservation_object *obj)
+{
+       struct fence *fence;
+       unsigned seq;
+retry:
+       seq = read_seqcount_begin(&obj->seq);
+       rcu_read_lock();
+       fence = rcu_dereference(obj->fence_excl);
+       if (read_seqcount_retry(&obj->seq, seq)) {
+               rcu_read_unlock();
+               goto retry;
+       }
+       fence = fence_get(fence);
+       rcu_read_unlock();
+       return fence;
+}
+
 int reservation_object_reserve_shared(struct reservation_object *obj);
 void reservation_object_add_shared_fence(struct reservation_object *obj,
                                         struct fence *fence);
-- 
2.5.5

Reply via email to