1/* 2 * Read-Copy Update mechanism for mutual exclusion 3 * 4 * This program is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License as published by 6 * the Free Software Foundation; either version 2 of the License, or 7 * (at your option) any later version. 8 * 9 * This program is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program; if not, write to the Free Software 16 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 17 * 18 * Copyright IBM Corporation, 2001 19 * 20 * Authors: Dipankar Sarma <dipankar@in.ibm.com> 21 * Manfred Spraul <manfred@colorfullife.com> 22 * 23 * Based on the original work by Paul McKenney <paulmck@us.ibm.com> 24 * and inputs from Rusty Russell, Andrea Arcangeli and Andi Kleen. 25 * Papers: 26 * http://www.rdrop.com/users/paulmck/paper/rclockpdcsproof.pdf 27 * http://lse.sourceforge.net/locking/rclock_OLS.2001.05.01c.sc.pdf (OLS2001) 28 * 29 * For detailed explanation of Read-Copy Update mechanism see - 30 * http://lse.sourceforge.net/locking/rcupdate.html 31 * 32 */ 33#include <linux/types.h> 34#include <linux/kernel.h> 35#include <linux/init.h> 36#include <linux/spinlock.h> 37#include <linux/smp.h> 38#include <linux/interrupt.h> 39#include <linux/sched.h> 40#include <asm/atomic.h> 41#include <linux/bitops.h> 42#include <linux/completion.h> 43#include <linux/percpu.h> 44#include <linux/notifier.h> 45#include <linux/cpu.h> 46#include <linux/mutex.h> 47#include <linux/module.h> 48 49struct rcu_synchronize { 50 struct rcu_head head; 51 struct completion completion; 52}; 53 54static DEFINE_PER_CPU(struct rcu_head, rcu_barrier_head) = {NULL}; 55static atomic_t rcu_barrier_cpu_count; 56static DEFINE_MUTEX(rcu_barrier_mutex); 57static struct completion rcu_barrier_completion; 58 59/* 60 * Awaken the corresponding synchronize_rcu() instance now that a 61 * grace period has elapsed. 62 */ 63static void wakeme_after_rcu(struct rcu_head *head) 64{ 65 struct rcu_synchronize *rcu; 66 67 rcu = container_of(head, struct rcu_synchronize, head); 68 complete(&rcu->completion); 69} 70 71/** 72 * synchronize_rcu - wait until a grace period has elapsed. 73 * 74 * Control will return to the caller some time after a full grace 75 * period has elapsed, in other words after all currently executing RCU 76 * read-side critical sections have completed. RCU read-side critical 77 * sections are delimited by rcu_read_lock() and rcu_read_unlock(), 78 * and may be nested. 79 */ 80void synchronize_rcu(void) 81{ 82 struct rcu_synchronize rcu; 83 84 init_completion(&rcu.completion); 85 /* Will wake me after RCU finished */ 86 call_rcu(&rcu.head, wakeme_after_rcu); 87 88 /* Wait for it */ 89 wait_for_completion(&rcu.completion); 90} 91EXPORT_SYMBOL_GPL(synchronize_rcu); 92 93static void rcu_barrier_callback(struct rcu_head *notused) 94{ 95 if (atomic_dec_and_test(&rcu_barrier_cpu_count)) 96 complete(&rcu_barrier_completion); 97} 98 99/* 100 * Called with preemption disabled, and from cross-cpu IRQ context. 101 */ 102static void rcu_barrier_func(void *notused) 103{ 104 int cpu = smp_processor_id(); 105 struct rcu_head *head = &per_cpu(rcu_barrier_head, cpu); 106 107 atomic_inc(&rcu_barrier_cpu_count); 108 call_rcu(head, rcu_barrier_callback); 109} 110 111/** 112 * rcu_barrier - Wait until all the in-flight RCUs are complete. 113 */ 114void rcu_barrier(void) 115{ 116 BUG_ON(in_interrupt()); 117 /* Take cpucontrol mutex to protect against CPU hotplug */ 118 mutex_lock(&rcu_barrier_mutex); 119 init_completion(&rcu_barrier_completion); 120 atomic_set(&rcu_barrier_cpu_count, 0); 121 /* 122 * The queueing of callbacks in all CPUs must be atomic with 123 * respect to RCU, otherwise one CPU may queue a callback, 124 * wait for a grace period, decrement barrier count and call 125 * complete(), while other CPUs have not yet queued anything. 126 * So, we need to make sure that grace periods cannot complete 127 * until all the callbacks are queued. 128 */ 129 rcu_read_lock(); 130 on_each_cpu(rcu_barrier_func, NULL, 0, 1); 131 rcu_read_unlock(); 132 wait_for_completion(&rcu_barrier_completion); 133 mutex_unlock(&rcu_barrier_mutex); 134} 135EXPORT_SYMBOL_GPL(rcu_barrier); 136 137void __init rcu_init(void) 138{ 139 __rcu_init(); 140} 141 142

