diff options
Diffstat (limited to 'arch/x86/mm/fault.c')
-rw-r--r-- | arch/x86/mm/fault.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c index 20e3f8702d1e..f7a2a054a3c0 100644 --- a/arch/x86/mm/fault.c +++ b/arch/x86/mm/fault.c | |||
@@ -12,6 +12,7 @@ | |||
12 | #include <linux/mmiotrace.h> /* kmmio_handler, ... */ | 12 | #include <linux/mmiotrace.h> /* kmmio_handler, ... */ |
13 | #include <linux/perf_event.h> /* perf_sw_event */ | 13 | #include <linux/perf_event.h> /* perf_sw_event */ |
14 | #include <linux/hugetlb.h> /* hstate_index_to_shift */ | 14 | #include <linux/hugetlb.h> /* hstate_index_to_shift */ |
15 | #include <linux/prefetch.h> /* prefetchw */ | ||
15 | 16 | ||
16 | #include <asm/traps.h> /* dotraplinkage, ... */ | 17 | #include <asm/traps.h> /* dotraplinkage, ... */ |
17 | #include <asm/pgalloc.h> /* pgd_*(), ... */ | 18 | #include <asm/pgalloc.h> /* pgd_*(), ... */ |
@@ -964,7 +965,7 @@ do_page_fault(struct pt_regs *regs, unsigned long error_code) | |||
964 | struct mm_struct *mm; | 965 | struct mm_struct *mm; |
965 | int fault; | 966 | int fault; |
966 | int write = error_code & PF_WRITE; | 967 | int write = error_code & PF_WRITE; |
967 | unsigned int flags = FAULT_FLAG_ALLOW_RETRY | | 968 | unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE | |
968 | (write ? FAULT_FLAG_WRITE : 0); | 969 | (write ? FAULT_FLAG_WRITE : 0); |
969 | 970 | ||
970 | tsk = current; | 971 | tsk = current; |
@@ -1138,6 +1139,16 @@ good_area: | |||
1138 | } | 1139 | } |
1139 | 1140 | ||
1140 | /* | 1141 | /* |
1142 | * Pagefault was interrupted by SIGKILL. We have no reason to | ||
1143 | * continue pagefault. | ||
1144 | */ | ||
1145 | if ((fault & VM_FAULT_RETRY) && fatal_signal_pending(current)) { | ||
1146 | if (!(error_code & PF_USER)) | ||
1147 | no_context(regs, error_code, address); | ||
1148 | return; | ||
1149 | } | ||
1150 | |||
1151 | /* | ||
1141 | * Major/minor page fault accounting is only done on the | 1152 | * Major/minor page fault accounting is only done on the |
1142 | * initial attempt. If we go through a retry, it is extremely | 1153 | * initial attempt. If we go through a retry, it is extremely |
1143 | * likely that the page will be found in page cache at that point. | 1154 | * likely that the page will be found in page cache at that point. |