diff options
author | Ingo Molnar <mingo@elte.hu> | 2009-02-20 17:39:02 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-02-20 18:09:46 -0500 |
commit | cd1b68f08f6328737928e5b8ba8ef80394680ff0 (patch) | |
tree | 049aa8e9cd982cb7325cb70e9fdecdfce1a010f3 /arch/x86/mm/fault.c | |
parent | 7c178a26d3e753d2a4346d3e4b8aa549d387f698 (diff) |
x86, mm: fault.c, give another attempt at prefetch handing before SIGBUS
Impact: extend prefetch handling on 64-bit
Currently there's an extra is_prefetch() check done in do_sigbus(),
which we only do on 32 bits.
This is a last-ditch check before we terminate a task, so it's worth
giving prefetch instructions another chance - should none of our
existing quirks have caught a prefetch instruction related spurious
fault.
The only risk is if a prefetch causes a real sigbus, in that case
we'll not OOM but try another fault. But this code has been on
32-bit for a long time, so it should be fine in practice.
So do this on 64-bit too - and thus remove one more #ifdef.
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/x86/mm/fault.c')
-rw-r--r-- | arch/x86/mm/fault.c | 4 |
1 files changed, 1 insertions, 3 deletions
diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c index f195691ec26e..413e835e4a80 100644 --- a/arch/x86/mm/fault.c +++ b/arch/x86/mm/fault.c | |||
@@ -836,11 +836,9 @@ do_sigbus(struct pt_regs *regs, unsigned long error_code, unsigned long address) | |||
836 | if (!(error_code & PF_USER)) | 836 | if (!(error_code & PF_USER)) |
837 | no_context(regs, error_code, address); | 837 | no_context(regs, error_code, address); |
838 | 838 | ||
839 | #ifdef CONFIG_X86_32 | 839 | /* User-space => ok to do another page fault: */ |
840 | /* User space => ok to do another page fault: */ | ||
841 | if (is_prefetch(regs, error_code, address)) | 840 | if (is_prefetch(regs, error_code, address)) |
842 | return; | 841 | return; |
843 | #endif | ||
844 | 842 | ||
845 | tsk->thread.cr2 = address; | 843 | tsk->thread.cr2 = address; |
846 | tsk->thread.error_code = error_code; | 844 | tsk->thread.error_code = error_code; |