powerpc: Call do_page_fault() with interrupts off
We currently turn interrupts back to their previous state before calling do_page_fault(). This can be annoying when debugging as a bad fault will potentially have lost some processor state before getting into the debugger. We also end up calling some generic code with interrupts enabled such as notify_page_fault() with interrupts enabled, which could be unexpected. This changes our code to behave more like other architectures, and make the assembly entry code call into do_page_faults() with interrupts disabled. They are conditionally re-enabled from within do_page_fault() in the same spot x86 does it. While there, add the might_sleep() test in the case of a successful trylock of the mmap semaphore, again like x86. Also fix a bug in the existing assembly where r12 (_MSR) could get clobbered by C calls (the DTL accounting in the exception common macro and DISABLE_INTS) in some cases. Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> --- v2. Add the r12 clobber fix
This commit is contained in:
@@ -79,6 +79,11 @@ static inline bool arch_irqs_disabled(void)
|
||||
get_paca()->hard_enabled = 0; \
|
||||
} while(0)
|
||||
|
||||
static inline bool arch_irq_disabled_regs(struct pt_regs *regs)
|
||||
{
|
||||
return !regs->softe;
|
||||
}
|
||||
|
||||
#else /* CONFIG_PPC64 */
|
||||
|
||||
#define SET_MSR_EE(x) mtmsr(x)
|
||||
@@ -139,6 +144,11 @@ static inline bool arch_irqs_disabled(void)
|
||||
|
||||
#define hard_irq_disable() arch_local_irq_disable()
|
||||
|
||||
static inline bool arch_irq_disabled_regs(struct pt_regs *regs)
|
||||
{
|
||||
return !(regs->msr & MSR_EE);
|
||||
}
|
||||
|
||||
#endif /* CONFIG_PPC64 */
|
||||
|
||||
#define ARCH_IRQ_INIT_FLAGS IRQ_NOREQUEST
|
||||
|
Reference in New Issue
Block a user