diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2012-07-31 01:28:31 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2012-07-31 01:28:31 -0400 |
commit | d87aae2f3c8e90bd0fe03f5309b4d066b712b8ec (patch) | |
tree | 2e5cd5f0ffaf5b725dd5bcc948a5f8cd06e13663 /lib/percpu_counter.c | |
parent | 4a55c1017b8dcfd0554734ce3f19374d5b522d59 (diff) |
switch the protection of percpu_counter list to spinlock
... making percpu_counter_destroy() non-blocking
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'lib/percpu_counter.c')
-rw-r--r-- | lib/percpu_counter.c | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/lib/percpu_counter.c b/lib/percpu_counter.c index f8a3f1a829b8..ba6085d9c741 100644 --- a/lib/percpu_counter.c +++ b/lib/percpu_counter.c | |||
@@ -12,7 +12,7 @@ | |||
12 | 12 | ||
13 | #ifdef CONFIG_HOTPLUG_CPU | 13 | #ifdef CONFIG_HOTPLUG_CPU |
14 | static LIST_HEAD(percpu_counters); | 14 | static LIST_HEAD(percpu_counters); |
15 | static DEFINE_MUTEX(percpu_counters_lock); | 15 | static DEFINE_SPINLOCK(percpu_counters_lock); |
16 | #endif | 16 | #endif |
17 | 17 | ||
18 | #ifdef CONFIG_DEBUG_OBJECTS_PERCPU_COUNTER | 18 | #ifdef CONFIG_DEBUG_OBJECTS_PERCPU_COUNTER |
@@ -123,9 +123,9 @@ int __percpu_counter_init(struct percpu_counter *fbc, s64 amount, | |||
123 | 123 | ||
124 | #ifdef CONFIG_HOTPLUG_CPU | 124 | #ifdef CONFIG_HOTPLUG_CPU |
125 | INIT_LIST_HEAD(&fbc->list); | 125 | INIT_LIST_HEAD(&fbc->list); |
126 | mutex_lock(&percpu_counters_lock); | 126 | spin_lock(&percpu_counters_lock); |
127 | list_add(&fbc->list, &percpu_counters); | 127 | list_add(&fbc->list, &percpu_counters); |
128 | mutex_unlock(&percpu_counters_lock); | 128 | spin_unlock(&percpu_counters_lock); |
129 | #endif | 129 | #endif |
130 | return 0; | 130 | return 0; |
131 | } | 131 | } |
@@ -139,9 +139,9 @@ void percpu_counter_destroy(struct percpu_counter *fbc) | |||
139 | debug_percpu_counter_deactivate(fbc); | 139 | debug_percpu_counter_deactivate(fbc); |
140 | 140 | ||
141 | #ifdef CONFIG_HOTPLUG_CPU | 141 | #ifdef CONFIG_HOTPLUG_CPU |
142 | mutex_lock(&percpu_counters_lock); | 142 | spin_lock(&percpu_counters_lock); |
143 | list_del(&fbc->list); | 143 | list_del(&fbc->list); |
144 | mutex_unlock(&percpu_counters_lock); | 144 | spin_unlock(&percpu_counters_lock); |
145 | #endif | 145 | #endif |
146 | free_percpu(fbc->counters); | 146 | free_percpu(fbc->counters); |
147 | fbc->counters = NULL; | 147 | fbc->counters = NULL; |
@@ -170,7 +170,7 @@ static int __cpuinit percpu_counter_hotcpu_callback(struct notifier_block *nb, | |||
170 | return NOTIFY_OK; | 170 | return NOTIFY_OK; |
171 | 171 | ||
172 | cpu = (unsigned long)hcpu; | 172 | cpu = (unsigned long)hcpu; |
173 | mutex_lock(&percpu_counters_lock); | 173 | spin_lock(&percpu_counters_lock); |
174 | list_for_each_entry(fbc, &percpu_counters, list) { | 174 | list_for_each_entry(fbc, &percpu_counters, list) { |
175 | s32 *pcount; | 175 | s32 *pcount; |
176 | unsigned long flags; | 176 | unsigned long flags; |
@@ -181,7 +181,7 @@ static int __cpuinit percpu_counter_hotcpu_callback(struct notifier_block *nb, | |||
181 | *pcount = 0; | 181 | *pcount = 0; |
182 | raw_spin_unlock_irqrestore(&fbc->lock, flags); | 182 | raw_spin_unlock_irqrestore(&fbc->lock, flags); |
183 | } | 183 | } |
184 | mutex_unlock(&percpu_counters_lock); | 184 | spin_unlock(&percpu_counters_lock); |
185 | #endif | 185 | #endif |
186 | return NOTIFY_OK; | 186 | return NOTIFY_OK; |
187 | } | 187 | } |