• Nathan Lynch's avatar
    [PATCH] fix workqueue oops during cpu offline · f756d5e2
    Nathan Lynch authored
    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 bce61dd4 ("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: default avatarNathan Lynch <ntl@pobox.com>
    Cc: <stable@kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
    f756d5e2
workqueue.c 14.4 KB