From mboxrd@z Thu Jan 1 00:00:00 1970 From: Bart Van Assche Subject: [PATCH v3 1/3] rcu: Introduce rcu_swap_protected() Date: Mon, 28 Aug 2017 13:46:13 -0700 Message-ID: <20170828204615.29455-2-bart.vanassche@wdc.com> References: <20170828204615.29455-1-bart.vanassche@wdc.com> Return-path: Received: from esa5.hgst.iphmx.com ([216.71.153.144]:48672 "EHLO esa5.hgst.iphmx.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751257AbdH1UrW (ORCPT ); Mon, 28 Aug 2017 16:47:22 -0400 In-Reply-To: <20170828204615.29455-1-bart.vanassche@wdc.com> Sender: linux-scsi-owner@vger.kernel.org List-Id: linux-scsi@vger.kernel.org To: "Martin K . Petersen" , "James E . J . Bottomley" Cc: linux-scsi@vger.kernel.org, "Paul E . McKenney" , Ingo Molnar , Christoph Hellwig , Bart Van Assche , Hannes Reinecke , Johannes Thumshirn , Shane M Seymour A common pattern in RCU code is to assign a new value to an RCU pointer after having read and stored the old value. Introduce a macro for this pattern. Signed-off-by: Bart Van Assche Cc: Paul E. McKenney Cc: Ingo Molnar Cc: Christoph Hellwig Cc: Hannes Reinecke Cc: Johannes Thumshirn Cc: Shane M Seymour --- include/linux/rcupdate.h | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h index f816fc72b51e..555815ce2e57 100644 --- a/include/linux/rcupdate.h +++ b/include/linux/rcupdate.h @@ -561,6 +561,26 @@ static inline void rcu_preempt_sleep_check(void) { } */ #define rcu_pointer_handoff(p) (p) +/** + * rcu_swap_protected() - swap an RCU and a regular pointer + * @rcu_ptr: RCU pointer + * @ptr: regular pointer + * @c: the conditions under which the dereference will take place + * + * Perform swap(@rcu_ptr, @ptr) where @rcu_ptr is an RCU-annotated pointer and + * @c is the argument that is passed to the rcu_dereference_protected() call + * used to read that pointer. + */ +#define rcu_swap_protected(rcu_ptr, ptr, c) do { \ + typeof(ptr) __tmp; \ + \ + BUILD_BUG_ON(!__same_type(typeof(rcu_ptr), typeof(*(ptr)) __rcu *)); \ + BUILD_BUG_ON(!__same_type(typeof(ptr), typeof(*(rcu_ptr)) *)); \ + __tmp = rcu_dereference_protected((rcu_ptr), (c)); \ + rcu_assign_pointer((rcu_ptr), (ptr)); \ + (ptr) = __tmp; \ +} while (0) + /** * rcu_read_lock() - mark the beginning of an RCU read-side critical section * -- 2.14.1