diff options
author | Hauke Mehrtens <hauke@hauke-m.de> | 2020-04-18 15:17:22 +0200 |
---|---|---|
committer | Hauke Mehrtens <hauke@hauke-m.de> | 2020-04-19 18:48:30 +0200 |
commit | 5974f1e96884e7706dd30795195664416f06ca92 (patch) | |
tree | bf2cb6d7513a26988ea8e7de9f5c214f109a69cd | |
parent | 36f913ed11340ae517af3883f70a43f41b5011d4 (diff) | |
download | backports-5974f1e96884e7706dd30795195664416f06ca92.tar.gz |
backports: rcupdate: Add rcu_replace_pointer
rcu_replace_pointer() was added in upstream commit a63fc6b75cca ("rcu:
Upgrade rcu_swap_protected() to rcu_replace_pointer()") and is now used
by the mt76 driver.
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
-rw-r--r-- | backport/backport-include/linux/rcupdate.h | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/backport/backport-include/linux/rcupdate.h b/backport/backport-include/linux/rcupdate.h index db501007..0bbfd615 100644 --- a/backport/backport-include/linux/rcupdate.h +++ b/backport/backport-include/linux/rcupdate.h @@ -77,4 +77,24 @@ rcu_head_after_call_rcu(struct rcu_head *rhp, rcu_callback_t f) } while (0) #endif +#ifndef rcu_replace_pointer +/** + * rcu_replace_pointer() - replace an RCU pointer, returning its old value + * @rcu_ptr: RCU pointer, whose old value is returned + * @ptr: regular pointer + * @c: the lockdep conditions under which the dereference will take place + * + * Perform a replacement, where @rcu_ptr is an RCU-annotated + * pointer and @c is the lockdep argument that is passed to the + * rcu_dereference_protected() call used to read that pointer. The old + * value of @rcu_ptr is returned, and @rcu_ptr is set to @ptr. + */ +#define rcu_replace_pointer(rcu_ptr, ptr, c) \ +({ \ + typeof(ptr) __tmp = rcu_dereference_protected((rcu_ptr), (c)); \ + rcu_assign_pointer((rcu_ptr), (ptr)); \ + __tmp; \ +}) +#endif + #endif /* __BACKPORT_LINUX_RCUPDATE_H */ |