aboutsummaryrefslogtreecommitdiffstats
path: root/arch/s390
diff options
context:
space:
mode:
authorHeiko Carstens <heiko.carstens@de.ibm.com>2013-04-27 06:42:18 -0400
committerMartin Schwidefsky <schwidefsky@de.ibm.com>2013-05-02 09:50:22 -0400
commitd009f4d8860defaea65ea7573818b96f3c4b171e (patch)
treeb4ddaf9bc9ac7a88a5b051a8b5e8e536391e506a /arch/s390
parent066b9fd660befd59dff77e24963338bfeabb8c3b (diff)
s390/mem_detect: fix lockdep irq tracing
When disabling and enabling interrupts we must tell lockdep. So use local_irq_save()/restore() to disable and enable interrupts. The DAT disabling/enabling get handled separately now. Note: we may not call trace_hardirqs_on() with DAT disabled, since the generic code may access vmalloc'ed data structures. Reported-by: Michael Holzheu <holzheu@linux.vnet.ibm.com> Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'arch/s390')
-rw-r--r--arch/s390/mm/mem_detect.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/arch/s390/mm/mem_detect.c b/arch/s390/mm/mem_detect.c
index 22d502e885ed..fb216e11c25d 100644
--- a/arch/s390/mm/mem_detect.c
+++ b/arch/s390/mm/mem_detect.c
@@ -47,19 +47,21 @@ static void find_memory_chunks(struct mem_chunk chunk[])
47 47
48void detect_memory_layout(struct mem_chunk chunk[]) 48void detect_memory_layout(struct mem_chunk chunk[])
49{ 49{
50 unsigned long flags, cr0; 50 unsigned long flags, flags_dat, cr0;
51 51
52 memset(chunk, 0, MEMORY_CHUNKS * sizeof(struct mem_chunk)); 52 memset(chunk, 0, MEMORY_CHUNKS * sizeof(struct mem_chunk));
53 /* Disable IRQs, DAT and low address protection so tprot does the 53 /* Disable IRQs, DAT and low address protection so tprot does the
54 * right thing and we don't get scheduled away with low address 54 * right thing and we don't get scheduled away with low address
55 * protection disabled. 55 * protection disabled.
56 */ 56 */
57 flags = __arch_local_irq_stnsm(0xf8); 57 local_irq_save(flags);
58 flags_dat = __arch_local_irq_stnsm(0xfb);
58 __ctl_store(cr0, 0, 0); 59 __ctl_store(cr0, 0, 0);
59 __ctl_clear_bit(0, 28); 60 __ctl_clear_bit(0, 28);
60 find_memory_chunks(chunk); 61 find_memory_chunks(chunk);
61 __ctl_load(cr0, 0, 0); 62 __ctl_load(cr0, 0, 0);
62 arch_local_irq_restore(flags); 63 __arch_local_irq_ssm(flags_dat);
64 local_irq_restore(flags);
63} 65}
64EXPORT_SYMBOL(detect_memory_layout); 66EXPORT_SYMBOL(detect_memory_layout);
65 67