diff options
author | Nathan Lynch <ntl@pobox.com> | 2006-01-08 01:05:12 -0800 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-01-08 20:14:08 -0800 |
commit | f756d5e256059018d753f0ba79980ebeb87a1bc0 (patch) | |
tree | e96ae0117aaf6dea19dad88079c3229f679c1948 /init/do_mounts_md.c | |
parent | 945f390f02ce44a13aefc6d9449c99f33c9286a5 (diff) | |
download | op-kernel-dev-f756d5e256059018d753f0ba79980ebeb87a1bc0.zip op-kernel-dev-f756d5e256059018d753f0ba79980ebeb87a1bc0.tar.gz |
[PATCH] fix workqueue oops during cpu offline
Use first_cpu(cpu_possible_map) for the single-thread workqueue case. We
used to hardcode 0, but that broke on systems where !cpu_possible(0) when
workqueue_struct->cpu_workqueue_struct was changed from a static array to
alloc_percpu.
Commit id bce61dd49d6ba7799be2de17c772e4c701558f14 ("Fix hardcoded cpu=0 in
workqueue for per_cpu_ptr() calls") fixed that for Ben's funky sparc64
system, but it regressed my Power5. Offlining cpu 0 oopses upon the next
call to queue_work for a single-thread workqueue, because now we try to
manipulate per_cpu_ptr(wq->cpu_wq, 1), which is uninitialized.
So we need to establish an unchanging "slot" for single-thread workqueues
which will have a valid percpu allocation. Since alloc_percpu keys off of
cpu_possible_map, which must not change after initialization, make this
slot == first_cpu(cpu_possible_map).
Signed-off-by: Nathan Lynch <ntl@pobox.com>
Cc: <stable@kernel.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'init/do_mounts_md.c')
0 files changed, 0 insertions, 0 deletions