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>
This commit is contained in:
Heiko Carstens 2013-04-27 12:42:18 +02:00 committed by Martin Schwidefsky
parent 066b9fd660
commit d009f4d886

View file

@ -47,19 +47,21 @@ static void find_memory_chunks(struct mem_chunk chunk[])
void detect_memory_layout(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)); memset(chunk, 0, MEMORY_CHUNKS * sizeof(struct mem_chunk));
/* Disable IRQs, DAT and low address protection so tprot does the /* Disable IRQs, DAT and low address protection so tprot does the
* right thing and we don't get scheduled away with low address * right thing and we don't get scheduled away with low address
* protection disabled. * 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_store(cr0, 0, 0);
__ctl_clear_bit(0, 28); __ctl_clear_bit(0, 28);
find_memory_chunks(chunk); find_memory_chunks(chunk);
__ctl_load(cr0, 0, 0); __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); EXPORT_SYMBOL(detect_memory_layout);