Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

percpu: fix DEBUG_PREEMPT per_cpu checking

2.6.25-rc1 percpu changes broke CONFIG_DEBUG_PREEMPT's per_cpu checking
on several architectures. On s390, sparc64 and x86 it's been weakened to
not checking at all; whereas on powerpc64 it's become too strict, issuing
warnings from __raw_get_cpu_var in io_schedule and init_timer for example.

Fix this by weakening powerpc's __my_cpu_offset to use the non-checking
local_paca instead of get_paca (which itself contains such a check);
and strengthening the generic my_cpu_offset to go the old slow way via
smp_processor_id when CONFIG_DEBUG_PREEMPT (debug_smp_processor_id is
where all the knowledge of what's correct when lives).

Signed-off-by: Hugh Dickins <hugh@veritas.com>
Reviewed-by: Mike Travis <travis@sgi.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

Hugh Dickins and committed by
Linus Torvalds
1e835278 3a2d5b70

+3 -1
+2
include/asm-generic/percpu.h
··· 32 32 */ 33 33 #ifndef __my_cpu_offset 34 34 #define __my_cpu_offset per_cpu_offset(raw_smp_processor_id()) 35 + #endif 36 + #ifdef CONFIG_DEBUG_PREEMPT 35 37 #define my_cpu_offset per_cpu_offset(smp_processor_id()) 36 38 #else 37 39 #define my_cpu_offset __my_cpu_offset
+1 -1
include/asm-powerpc/percpu.h
··· 13 13 #include <asm/paca.h> 14 14 15 15 #define __per_cpu_offset(cpu) (paca[cpu].data_offset) 16 - #define __my_cpu_offset get_paca()->data_offset 16 + #define __my_cpu_offset local_paca->data_offset 17 17 #define per_cpu_offset(x) (__per_cpu_offset(x)) 18 18 19 19 #endif /* CONFIG_SMP */