Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d009f4d8 authored by Heiko Carstens's avatar Heiko Carstens Committed by Martin Schwidefsky
Browse files

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: default avatarMichael Holzheu <holzheu@linux.vnet.ibm.com>
Signed-off-by: default avatarHeiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent 066b9fd6
Loading
Loading
Loading
Loading
+5 −3
Original line number Diff line number Diff line
@@ -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);