From mboxrd@z Thu Jan 1 00:00:00 1970 From: Rob Clark Subject: [PATCH 01/11] reservation: add reservation_object_get_excl_unlocked() Date: Fri, 18 Mar 2016 19:14:54 -0400 Message-ID: <1458342904-23326-2-git-send-email-robdclark@gmail.com> References: <1458342904-23326-1-git-send-email-robdclark@gmail.com> Return-path: Received: from mail-qk0-f182.google.com ([209.85.220.182]:34493 "EHLO mail-qk0-f182.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752526AbcCRXPM (ORCPT ); Fri, 18 Mar 2016 19:15:12 -0400 Received: by mail-qk0-f182.google.com with SMTP id p130so1877972qke.1 for ; Fri, 18 Mar 2016 16:15:11 -0700 (PDT) In-Reply-To: <1458342904-23326-1-git-send-email-robdclark@gmail.com> Sender: linux-arm-msm-owner@vger.kernel.org List-Id: linux-arm-msm@vger.kernel.org To: dri-devel@lists.freedesktop.org Cc: Daniel Vetter , maarten.lankhorst@canonical.com, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, Rob Clark In the atomic modesetting path, each driver simply wants to grab a ref to the exlusive 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. Signed-off-by: Rob Clark --- include/linux/reservation.h | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/include/linux/reservation.h b/include/linux/reservation.h index 5a0b64c..7a018a9 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_unlocked(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.0