summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Metcalf <cmetcalf@tilera.com>2012-03-29 15:40:50 -0400
committerChris Metcalf <cmetcalf@tilera.com>2012-04-02 12:13:09 -0400
commitb230ff2d5c53bb79e1121554cd3c827e5c1b70fd (patch)
tree8242201e0e5c28c65ef7f5330f72510e90126122
parent12400f1f22ad7651efa1d3d06dd8b6b178d19ea3 (diff)
downloadlwn-b230ff2d5c53bb79e1121554cd3c827e5c1b70fd.tar.gz
lwn-b230ff2d5c53bb79e1121554cd3c827e5c1b70fd.zip
arch/tile: don't enable irqs unconditionally in page fault handler
If we took a page fault while we had interrupts disabled, we shouldn't enable them in the page fault handler. Signed-off-by: Chris Metcalf <cmetcalf@tilera.com>
-rw-r--r--arch/tile/mm/fault.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/arch/tile/mm/fault.c b/arch/tile/mm/fault.c
index a1da473c8555..22e58f51ed23 100644
--- a/arch/tile/mm/fault.c
+++ b/arch/tile/mm/fault.c
@@ -342,9 +342,12 @@ static int handle_page_fault(struct pt_regs *regs,
/*
* If we're trying to touch user-space addresses, we must
* be either at PL0, or else with interrupts enabled in the
- * kernel, so either way we can re-enable interrupts here.
+ * kernel, so either way we can re-enable interrupts here
+ * unless we are doing atomic access to user space with
+ * interrupts disabled.
*/
- local_irq_enable();
+ if (!(regs->flags & PT_FLAGS_DISABLE_IRQ))
+ local_irq_enable();
mm = tsk->mm;