139cfddd2SFrançois Tigeot /* 2411c4fe9SFrançois Tigeot * Copyright (c) 2017-2019 François Tigeot <ftigeot@wolfpond.org> 339cfddd2SFrançois Tigeot * All rights reserved. 439cfddd2SFrançois Tigeot * 539cfddd2SFrançois Tigeot * Redistribution and use in source and binary forms, with or without 639cfddd2SFrançois Tigeot * modification, are permitted provided that the following conditions 739cfddd2SFrançois Tigeot * are met: 839cfddd2SFrançois Tigeot * 1. Redistributions of source code must retain the above copyright 939cfddd2SFrançois Tigeot * notice unmodified, this list of conditions, and the following 1039cfddd2SFrançois Tigeot * disclaimer. 1139cfddd2SFrançois Tigeot * 2. Redistributions in binary form must reproduce the above copyright 1239cfddd2SFrançois Tigeot * notice, this list of conditions and the following disclaimer in the 1339cfddd2SFrançois Tigeot * documentation and/or other materials provided with the distribution. 1439cfddd2SFrançois Tigeot * 1539cfddd2SFrançois Tigeot * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 1639cfddd2SFrançois Tigeot * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 1739cfddd2SFrançois Tigeot * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 1839cfddd2SFrançois Tigeot * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 1939cfddd2SFrançois Tigeot * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 2039cfddd2SFrançois Tigeot * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2139cfddd2SFrançois Tigeot * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2239cfddd2SFrançois Tigeot * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2339cfddd2SFrançois Tigeot * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 2439cfddd2SFrançois Tigeot * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2539cfddd2SFrançois Tigeot */ 2639cfddd2SFrançois Tigeot 27*41e2def0SFrançois Tigeot #ifndef _LINUX_RCUPDATE_H_ 28*41e2def0SFrançois Tigeot #define _LINUX_RCUPDATE_H_ 2939cfddd2SFrançois Tigeot 30d6aa1cc5SFrançois Tigeot #include <linux/types.h> 31d6aa1cc5SFrançois Tigeot #include <linux/cache.h> 32d6aa1cc5SFrançois Tigeot #include <linux/spinlock.h> 33d6aa1cc5SFrançois Tigeot #include <linux/threads.h> 34d6aa1cc5SFrançois Tigeot #include <linux/cpumask.h> 35d6aa1cc5SFrançois Tigeot #include <linux/seqlock.h> 36d6aa1cc5SFrançois Tigeot #include <linux/lockdep.h> 37d6aa1cc5SFrançois Tigeot #include <linux/completion.h> 38d6aa1cc5SFrançois Tigeot #include <linux/bug.h> 39d6aa1cc5SFrançois Tigeot #include <linux/compiler.h> 40d6aa1cc5SFrançois Tigeot #include <linux/ktime.h> 41d6aa1cc5SFrançois Tigeot 42d6aa1cc5SFrançois Tigeot #include <asm/barrier.h> 43d6aa1cc5SFrançois Tigeot 4439cfddd2SFrançois Tigeot static inline void 45*41e2def0SFrançois Tigeot call_rcu(struct rcu_head *head, void (*func)(struct rcu_head *)) 46*41e2def0SFrançois Tigeot { 47*41e2def0SFrançois Tigeot func(head); 48*41e2def0SFrançois Tigeot } 49*41e2def0SFrançois Tigeot 50*41e2def0SFrançois Tigeot static inline void 5139cfddd2SFrançois Tigeot rcu_read_lock(void) 5239cfddd2SFrançois Tigeot { 53*41e2def0SFrançois Tigeot preempt_disable(); 5439cfddd2SFrançois Tigeot } 5539cfddd2SFrançois Tigeot 5639cfddd2SFrançois Tigeot static inline void 5739cfddd2SFrançois Tigeot rcu_read_unlock(void) 5839cfddd2SFrançois Tigeot { 59*41e2def0SFrançois Tigeot preempt_enable(); 6039cfddd2SFrançois Tigeot } 6139cfddd2SFrançois Tigeot 6221c41faeSFrançois Tigeot #define rcu_dereference_protected(p, condition) \ 6321c41faeSFrançois Tigeot ((typeof(*p) *)(p)) 6421c41faeSFrançois Tigeot 65*41e2def0SFrançois Tigeot #define rcu_dereference(p) \ 66*41e2def0SFrançois Tigeot ({ \ 67*41e2def0SFrançois Tigeot typeof(*(p)) *__rcu_dereference_tmp = READ_ONCE(p); \ 68*41e2def0SFrançois Tigeot __rcu_dereference_tmp; \ 69*41e2def0SFrançois Tigeot }) 7039cfddd2SFrançois Tigeot 71411c4fe9SFrançois Tigeot #define rcu_assign_pointer(p, v) \ 72411c4fe9SFrançois Tigeot do { \ 73411c4fe9SFrançois Tigeot cpu_mfence(); \ 74411c4fe9SFrançois Tigeot WRITE_ONCE((p), (v)); \ 75411c4fe9SFrançois Tigeot } while (0) 76411c4fe9SFrançois Tigeot 77*41e2def0SFrançois Tigeot #define RCU_INIT_POINTER(p, v) \ 78*41e2def0SFrançois Tigeot do { \ 79*41e2def0SFrançois Tigeot p = v; \ 80*41e2def0SFrançois Tigeot } while (0) 81*41e2def0SFrançois Tigeot 82*41e2def0SFrançois Tigeot #define kfree_rcu(ptr, rcu_head) \ 83*41e2def0SFrançois Tigeot do { \ 84*41e2def0SFrançois Tigeot kfree(ptr); \ 85*41e2def0SFrançois Tigeot } while (0) 86*41e2def0SFrançois Tigeot 87*41e2def0SFrançois Tigeot #endif /* _LINUX_RCUPDATE_H_ */ 88