reservation: add reservation_object_get_excl_rcu()
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@gmail.com> Acked-by: Sumit Semwal <sumit.semwal@linaro.org>
This commit is contained in:
Родитель
feb46f02c3
Коммит
824815c4cd
|
@ -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);
|
||||
|
|
Загрузка…
Ссылка в новой задаче