diff options
| author | Trond Myklebust <Trond.Myklebust@netapp.com> | 2010-03-05 15:46:18 -0500 |
|---|---|---|
| committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2010-03-05 15:46:18 -0500 |
| commit | 3fa04ecd72780da31ba8b329e148179bc24a9c7d (patch) | |
| tree | f5d462fd4aee086952d18f159f737c450ab46b3b /kernel/srcu.c | |
| parent | 180b62a3d837613fcac3ce89576526423926c3c3 (diff) | |
| parent | 1cda707d52e51a6cafac0aef12d2bd7052d572e6 (diff) | |
Merge branch 'writeback-for-2.6.34' into nfs-for-2.6.34
Diffstat (limited to 'kernel/srcu.c')
| -rw-r--r-- | kernel/srcu.c | 52 |
1 files changed, 34 insertions, 18 deletions
diff --git a/kernel/srcu.c b/kernel/srcu.c index 818d7d9aa03c..bde4295774c8 100644 --- a/kernel/srcu.c +++ b/kernel/srcu.c | |||
| @@ -34,6 +34,30 @@ | |||
| 34 | #include <linux/smp.h> | 34 | #include <linux/smp.h> |
| 35 | #include <linux/srcu.h> | 35 | #include <linux/srcu.h> |
| 36 | 36 | ||
| 37 | static int init_srcu_struct_fields(struct srcu_struct *sp) | ||
| 38 | { | ||
| 39 | sp->completed = 0; | ||
| 40 | mutex_init(&sp->mutex); | ||
| 41 | sp->per_cpu_ref = alloc_percpu(struct srcu_struct_array); | ||
| 42 | return sp->per_cpu_ref ? 0 : -ENOMEM; | ||
| 43 | } | ||
| 44 | |||
| 45 | #ifdef CONFIG_DEBUG_LOCK_ALLOC | ||
| 46 | |||
| 47 | int __init_srcu_struct(struct srcu_struct *sp, const char *name, | ||
| 48 | struct lock_class_key *key) | ||
| 49 | { | ||
| 50 | #ifdef CONFIG_DEBUG_LOCK_ALLOC | ||
| 51 | /* Don't re-initialize a lock while it is held. */ | ||
| 52 | debug_check_no_locks_freed((void *)sp, sizeof(*sp)); | ||
| 53 | lockdep_init_map(&sp->dep_map, name, key, 0); | ||
| 54 | #endif /* #ifdef CONFIG_DEBUG_LOCK_ALLOC */ | ||
| 55 | return init_srcu_struct_fields(sp); | ||
| 56 | } | ||
| 57 | EXPORT_SYMBOL_GPL(__init_srcu_struct); | ||
| 58 | |||
| 59 | #else /* #ifdef CONFIG_DEBUG_LOCK_ALLOC */ | ||
| 60 | |||
| 37 | /** | 61 | /** |
| 38 | * init_srcu_struct - initialize a sleep-RCU structure | 62 | * init_srcu_struct - initialize a sleep-RCU structure |
| 39 | * @sp: structure to initialize. | 63 | * @sp: structure to initialize. |
| @@ -44,13 +68,12 @@ | |||
| 44 | */ | 68 | */ |
| 45 | int init_srcu_struct(struct srcu_struct *sp) | 69 | int init_srcu_struct(struct srcu_struct *sp) |
| 46 | { | 70 | { |
| 47 | sp->completed = 0; | 71 | return init_srcu_struct_fields(sp); |
| 48 | mutex_init(&sp->mutex); | ||
| 49 | sp->per_cpu_ref = alloc_percpu(struct srcu_struct_array); | ||
| 50 | return (sp->per_cpu_ref ? 0 : -ENOMEM); | ||
| 51 | } | 72 | } |
| 52 | EXPORT_SYMBOL_GPL(init_srcu_struct); | 73 | EXPORT_SYMBOL_GPL(init_srcu_struct); |
| 53 | 74 | ||
| 75 | #endif /* #else #ifdef CONFIG_DEBUG_LOCK_ALLOC */ | ||
| 76 | |||
| 54 | /* | 77 | /* |
| 55 | * srcu_readers_active_idx -- returns approximate number of readers | 78 | * srcu_readers_active_idx -- returns approximate number of readers |
| 56 | * active on the specified rank of per-CPU counters. | 79 | * active on the specified rank of per-CPU counters. |
| @@ -100,15 +123,12 @@ void cleanup_srcu_struct(struct srcu_struct *sp) | |||
| 100 | } | 123 | } |
| 101 | EXPORT_SYMBOL_GPL(cleanup_srcu_struct); | 124 | EXPORT_SYMBOL_GPL(cleanup_srcu_struct); |
| 102 | 125 | ||
| 103 | /** | 126 | /* |
| 104 | * srcu_read_lock - register a new reader for an SRCU-protected structure. | ||
| 105 | * @sp: srcu_struct in which to register the new reader. | ||
| 106 | * | ||
| 107 | * Counts the new reader in the appropriate per-CPU element of the | 127 | * Counts the new reader in the appropriate per-CPU element of the |
| 108 | * srcu_struct. Must be called from process context. | 128 | * srcu_struct. Must be called from process context. |
| 109 | * Returns an index that must be passed to the matching srcu_read_unlock(). | 129 | * Returns an index that must be passed to the matching srcu_read_unlock(). |
| 110 | */ | 130 | */ |
| 111 | int srcu_read_lock(struct srcu_struct *sp) | 131 | int __srcu_read_lock(struct srcu_struct *sp) |
| 112 | { | 132 | { |
| 113 | int idx; | 133 | int idx; |
| 114 | 134 | ||
| @@ -120,31 +140,27 @@ int srcu_read_lock(struct srcu_struct *sp) | |||
| 120 | preempt_enable(); | 140 | preempt_enable(); |
| 121 | return idx; | 141 | return idx; |
| 122 | } | 142 | } |
| 123 | EXPORT_SYMBOL_GPL(srcu_read_lock); | 143 | EXPORT_SYMBOL_GPL(__srcu_read_lock); |
| 124 | 144 | ||
| 125 | /** | 145 | /* |
| 126 | * srcu_read_unlock - unregister a old reader from an SRCU-protected structure. | ||
| 127 | * @sp: srcu_struct in which to unregister the old reader. | ||
| 128 | * @idx: return value from corresponding srcu_read_lock(). | ||
| 129 | * | ||
| 130 | * Removes the count for the old reader from the appropriate per-CPU | 146 | * Removes the count for the old reader from the appropriate per-CPU |
| 131 | * element of the srcu_struct. Note that this may well be a different | 147 | * element of the srcu_struct. Note that this may well be a different |
| 132 | * CPU than that which was incremented by the corresponding srcu_read_lock(). | 148 | * CPU than that which was incremented by the corresponding srcu_read_lock(). |
| 133 | * Must be called from process context. | 149 | * Must be called from process context. |
| 134 | */ | 150 | */ |
| 135 | void srcu_read_unlock(struct srcu_struct *sp, int idx) | 151 | void __srcu_read_unlock(struct srcu_struct *sp, int idx) |
| 136 | { | 152 | { |
| 137 | preempt_disable(); | 153 | preempt_disable(); |
| 138 | srcu_barrier(); /* ensure compiler won't misorder critical section. */ | 154 | srcu_barrier(); /* ensure compiler won't misorder critical section. */ |
| 139 | per_cpu_ptr(sp->per_cpu_ref, smp_processor_id())->c[idx]--; | 155 | per_cpu_ptr(sp->per_cpu_ref, smp_processor_id())->c[idx]--; |
| 140 | preempt_enable(); | 156 | preempt_enable(); |
| 141 | } | 157 | } |
| 142 | EXPORT_SYMBOL_GPL(srcu_read_unlock); | 158 | EXPORT_SYMBOL_GPL(__srcu_read_unlock); |
| 143 | 159 | ||
| 144 | /* | 160 | /* |
| 145 | * Helper function for synchronize_srcu() and synchronize_srcu_expedited(). | 161 | * Helper function for synchronize_srcu() and synchronize_srcu_expedited(). |
| 146 | */ | 162 | */ |
| 147 | void __synchronize_srcu(struct srcu_struct *sp, void (*sync_func)(void)) | 163 | static void __synchronize_srcu(struct srcu_struct *sp, void (*sync_func)(void)) |
| 148 | { | 164 | { |
| 149 | int idx; | 165 | int idx; |
| 150 | 166 | ||
