aboutsummaryrefslogtreecommitdiffstats
path: root/mm
diff options
context:
space:
mode:
authorTejun Heo <tj@kernel.org>2009-08-14 02:00:49 -0400
committerTejun Heo <tj@kernel.org>2009-08-14 02:00:49 -0400
commit971f3918a5a8febbbab355079972fb31ee7c0f33 (patch)
treedc7909e934473d6b63460c5aa8d0a37ba62a4f79 /mm
parent384be2b18a5f9475eab9ca2bdfa95cc1a04ef59c (diff)
percpu: fix pcpu_reclaim() locking
pcpu_reclaim() calls pcpu_depopulate_chunk() which makes use of pages array and bitmap returned by pcpu_get_pages_and_bitmap() and thus should be called under pcpu_alloc_mutex. pcpu_reclaim() released the mutex before calling depopulate leading to double free and other strange problems caused by the unexpected concurrent usages of pages array and bitmap. Fix it. Signed-off-by: Tejun Heo <tj@kernel.org> Reviewed-by: Christoph Lameter <cl@linux-foundation.org>
Diffstat (limited to 'mm')
-rw-r--r--mm/percpu.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/mm/percpu.c b/mm/percpu.c
index 3f9f182f9b44..42ab0024a6ed 100644
--- a/mm/percpu.c
+++ b/mm/percpu.c
@@ -1181,12 +1181,13 @@ static void pcpu_reclaim(struct work_struct *work)
1181 } 1181 }
1182 1182
1183 spin_unlock_irq(&pcpu_lock); 1183 spin_unlock_irq(&pcpu_lock);
1184 mutex_unlock(&pcpu_alloc_mutex);
1185 1184
1186 list_for_each_entry_safe(chunk, next, &todo, list) { 1185 list_for_each_entry_safe(chunk, next, &todo, list) {
1187 pcpu_depopulate_chunk(chunk, 0, pcpu_unit_size); 1186 pcpu_depopulate_chunk(chunk, 0, pcpu_unit_size);
1188 free_pcpu_chunk(chunk); 1187 free_pcpu_chunk(chunk);
1189 } 1188 }
1189
1190 mutex_unlock(&pcpu_alloc_mutex);
1190} 1191}
1191 1192
1192/** 1193/**