diff options
author | Hugh Dickins <hugh@veritas.com> | 2006-10-31 13:44:54 -0500 |
---|---|---|
committer | Paul Mackerras <paulus@samba.org> | 2007-10-02 21:48:44 -0400 |
commit | 048c8bc90e53bf1f5feec020a7d482da94894e93 (patch) | |
tree | 6ca0891ac3320706873006104cde3d4e1039bcfc | |
parent | 5669c3cf19fbadaa9120b59914beec8431277efe (diff) |
[POWERPC] ppc64: support CONFIG_DEBUG_PREEMPT
Add CONFIG_DEBUG_PREEMPT support to ppc64: it was useful for testing
get_paca() preemption. Cheat a little, just use debug_smp_processor_id()
in the debug version of get_paca(): it contains all the right checks and
reporting, though get_paca() doesn't really use smp_processor_id().
Use local_paca for what might have been called __raw_get_paca().
Silence harmless warnings from io.h and lparcfg.c with local_paca -
it is okay for iseries_lparcfg_data to be referencing shared_proc
with preemption enabled: all cpus should show the same value for
shared_proc.
Why do other architectures need TRACE_IRQFLAGS_SUPPORT for DEBUG_PREEMPT?
I don't know, ppc64 appears to get along fine without it.
Signed-off-by: Hugh Dickins <hugh@veritas.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
-rw-r--r-- | arch/powerpc/kernel/lparcfg.c | 2 | ||||
-rw-r--r-- | include/asm-powerpc/io.h | 2 | ||||
-rw-r--r-- | include/asm-powerpc/paca.h | 11 | ||||
-rw-r--r-- | include/asm-powerpc/percpu.h | 2 | ||||
-rw-r--r-- | include/asm-powerpc/smp.h | 2 | ||||
-rw-r--r-- | lib/Kconfig.debug | 2 |
6 files changed, 16 insertions, 5 deletions
diff --git a/arch/powerpc/kernel/lparcfg.c b/arch/powerpc/kernel/lparcfg.c index 6444eaa30a2f..ff781b2eddec 100644 --- a/arch/powerpc/kernel/lparcfg.c +++ b/arch/powerpc/kernel/lparcfg.c | |||
@@ -77,7 +77,7 @@ static int iseries_lparcfg_data(struct seq_file *m, void *v) | |||
77 | int processors, max_processors; | 77 | int processors, max_processors; |
78 | unsigned long purr = get_purr(); | 78 | unsigned long purr = get_purr(); |
79 | 79 | ||
80 | shared = (int)(get_lppaca()->shared_proc); | 80 | shared = (int)(local_paca->lppaca_ptr->shared_proc); |
81 | 81 | ||
82 | seq_printf(m, "system_active_processors=%d\n", | 82 | seq_printf(m, "system_active_processors=%d\n", |
83 | (int)HvLpConfig_getSystemPhysicalProcessors()); | 83 | (int)HvLpConfig_getSystemPhysicalProcessors()); |
diff --git a/include/asm-powerpc/io.h b/include/asm-powerpc/io.h index 6805efb2cb6d..affba7052fb6 100644 --- a/include/asm-powerpc/io.h +++ b/include/asm-powerpc/io.h | |||
@@ -86,7 +86,7 @@ extern unsigned long pci_dram_offset; | |||
86 | */ | 86 | */ |
87 | 87 | ||
88 | #ifdef CONFIG_PPC64 | 88 | #ifdef CONFIG_PPC64 |
89 | #define IO_SET_SYNC_FLAG() do { get_paca()->io_sync = 1; } while(0) | 89 | #define IO_SET_SYNC_FLAG() do { local_paca->io_sync = 1; } while(0) |
90 | #else | 90 | #else |
91 | #define IO_SET_SYNC_FLAG() | 91 | #define IO_SET_SYNC_FLAG() |
92 | #endif | 92 | #endif |
diff --git a/include/asm-powerpc/paca.h b/include/asm-powerpc/paca.h index c6a5b1735666..fcd7b428ed0b 100644 --- a/include/asm-powerpc/paca.h +++ b/include/asm-powerpc/paca.h | |||
@@ -21,7 +21,18 @@ | |||
21 | #include <asm/mmu.h> | 21 | #include <asm/mmu.h> |
22 | 22 | ||
23 | register struct paca_struct *local_paca asm("r13"); | 23 | register struct paca_struct *local_paca asm("r13"); |
24 | |||
25 | #if defined(CONFIG_DEBUG_PREEMPT) && defined(CONFIG_SMP) | ||
26 | extern unsigned int debug_smp_processor_id(void); /* from linux/smp.h */ | ||
27 | /* | ||
28 | * Add standard checks that preemption cannot occur when using get_paca(): | ||
29 | * otherwise the paca_struct it points to may be the wrong one just after. | ||
30 | */ | ||
31 | #define get_paca() ((void) debug_smp_processor_id(), local_paca) | ||
32 | #else | ||
24 | #define get_paca() local_paca | 33 | #define get_paca() local_paca |
34 | #endif | ||
35 | |||
25 | #define get_lppaca() (get_paca()->lppaca_ptr) | 36 | #define get_lppaca() (get_paca()->lppaca_ptr) |
26 | #define get_slb_shadow() (get_paca()->slb_shadow_ptr) | 37 | #define get_slb_shadow() (get_paca()->slb_shadow_ptr) |
27 | 38 | ||
diff --git a/include/asm-powerpc/percpu.h b/include/asm-powerpc/percpu.h index 73dc8ba4010d..6b229626d3ff 100644 --- a/include/asm-powerpc/percpu.h +++ b/include/asm-powerpc/percpu.h | |||
@@ -28,7 +28,7 @@ | |||
28 | /* var is in discarded region: offset to particular copy we want */ | 28 | /* var is in discarded region: offset to particular copy we want */ |
29 | #define per_cpu(var, cpu) (*RELOC_HIDE(&per_cpu__##var, __per_cpu_offset(cpu))) | 29 | #define per_cpu(var, cpu) (*RELOC_HIDE(&per_cpu__##var, __per_cpu_offset(cpu))) |
30 | #define __get_cpu_var(var) (*RELOC_HIDE(&per_cpu__##var, __my_cpu_offset())) | 30 | #define __get_cpu_var(var) (*RELOC_HIDE(&per_cpu__##var, __my_cpu_offset())) |
31 | #define __raw_get_cpu_var(var) (*RELOC_HIDE(&per_cpu__##var, __my_cpu_offset())) | 31 | #define __raw_get_cpu_var(var) (*RELOC_HIDE(&per_cpu__##var, local_paca->data_offset)) |
32 | 32 | ||
33 | /* A macro to avoid #include hell... */ | 33 | /* A macro to avoid #include hell... */ |
34 | #define percpu_modcopy(pcpudst, src, size) \ | 34 | #define percpu_modcopy(pcpudst, src, size) \ |
diff --git a/include/asm-powerpc/smp.h b/include/asm-powerpc/smp.h index d037f50580e2..19102bfc14ca 100644 --- a/include/asm-powerpc/smp.h +++ b/include/asm-powerpc/smp.h | |||
@@ -45,7 +45,7 @@ void generic_mach_cpu_die(void); | |||
45 | #endif | 45 | #endif |
46 | 46 | ||
47 | #ifdef CONFIG_PPC64 | 47 | #ifdef CONFIG_PPC64 |
48 | #define raw_smp_processor_id() (get_paca()->paca_index) | 48 | #define raw_smp_processor_id() (local_paca->paca_index) |
49 | #define hard_smp_processor_id() (get_paca()->hw_cpu_id) | 49 | #define hard_smp_processor_id() (get_paca()->hw_cpu_id) |
50 | #else | 50 | #else |
51 | /* 32-bit */ | 51 | /* 32-bit */ |
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug index 50a94eee4d92..51e2fd0d851c 100644 --- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug | |||
@@ -167,7 +167,7 @@ config SLUB_DEBUG_ON | |||
167 | 167 | ||
168 | config DEBUG_PREEMPT | 168 | config DEBUG_PREEMPT |
169 | bool "Debug preemptible kernel" | 169 | bool "Debug preemptible kernel" |
170 | depends on DEBUG_KERNEL && PREEMPT && TRACE_IRQFLAGS_SUPPORT | 170 | depends on DEBUG_KERNEL && PREEMPT && (TRACE_IRQFLAGS_SUPPORT || PPC64) |
171 | default y | 171 | default y |
172 | help | 172 | help |
173 | If you say Y here then the kernel will use a debug variant of the | 173 | If you say Y here then the kernel will use a debug variant of the |