| From 73eaac693eab409b6db9950b7d15e5020624258f Mon Sep 17 00:00:00 2001 |
| From: Thomas Gleixner <tglx@linutronix.de> |
| Date: Fri, 24 Jul 2009 15:26:05 +0200 |
| Subject: [PATCH] powerpc-decouple-page-fault-logic.patch |
| |
| commit ce0f1eef1522853a936e998da5de5d54fc201555 in tip. |
| |
| Signed-off-by: Thomas Gleixner <tglx@linutronix.de> |
| |
| diff --git a/arch/powerpc/mm/fault.c b/arch/powerpc/mm/fault.c |
| index 26fb6b9..d89a78a 100644 |
| --- a/arch/powerpc/mm/fault.c |
| +++ b/arch/powerpc/mm/fault.c |
| @@ -159,7 +159,7 @@ int __kprobes do_page_fault(struct pt_regs *regs, unsigned long address, |
| } |
| #endif /* !(CONFIG_4xx || CONFIG_BOOKE)*/ |
| |
| - if (in_atomic() || mm == NULL) { |
| + if (in_atomic() || mm == NULL || current->pagefault_disabled) { |
| if (!user_mode(regs)) |
| return SIGSEGV; |
| /* in_atomic() in user mode is really bad, |
| diff --git a/arch/powerpc/mm/highmem.c b/arch/powerpc/mm/highmem.c |
| index c2186c7..81310e2 100644 |
| --- a/arch/powerpc/mm/highmem.c |
| +++ b/arch/powerpc/mm/highmem.c |
| @@ -35,6 +35,7 @@ void *kmap_atomic_prot(struct page *page, enum km_type type, pgprot_t prot) |
| unsigned long vaddr; |
| |
| /* even !CONFIG_PREEMPT needs this, for in_atomic in do_page_fault */ |
| + preempt_disable(); |
| pagefault_disable(); |
| if (!PageHighMem(page)) |
| return page_address(page); |
| @@ -73,5 +74,6 @@ void kunmap_atomic(void *kvaddr, enum km_type type) |
| local_flush_tlb_page(NULL, vaddr); |
| #endif |
| pagefault_enable(); |
| + preempt_enable(); |
| } |
| EXPORT_SYMBOL(kunmap_atomic); |
| -- |
| 1.7.1.1 |
| |