s390/mem_detect: fix lockdep irq tracing
authorHeiko Carstens <heiko.carstens@de.ibm.com>
Sat, 27 Apr 2013 10:42:18 +0000 (12:42 +0200)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Thu, 2 May 2013 13:50:22 +0000 (15:50 +0200)
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>
arch/s390/mm/mem_detect.c

index 22d502e885ed2b5f0b6c84c45c10e11bf47535da..fb216e11c25d22e7ba38e8f8599ca463db308e7b 100644 (file)
@@ -47,19 +47,21 @@ static void find_memory_chunks(struct mem_chunk chunk[])
 
 void detect_memory_layout(struct mem_chunk chunk[])
 {
-       unsigned long flags, cr0;
+       unsigned long flags, flags_dat, cr0;
 
        memset(chunk, 0, MEMORY_CHUNKS * sizeof(struct mem_chunk));
        /* Disable IRQs, DAT and low address protection so tprot does the
         * right thing and we don't get scheduled away with low address
         * protection disabled.
         */
-       flags = __arch_local_irq_stnsm(0xf8);
+       local_irq_save(flags);
+       flags_dat = __arch_local_irq_stnsm(0xfb);
        __ctl_store(cr0, 0, 0);
        __ctl_clear_bit(0, 28);
        find_memory_chunks(chunk);
        __ctl_load(cr0, 0, 0);
-       arch_local_irq_restore(flags);
+       __arch_local_irq_ssm(flags_dat);
+       local_irq_restore(flags);
 }
 EXPORT_SYMBOL(detect_memory_layout);