|
@@ -965,7 +965,7 @@ do_page_fault(struct pt_regs *regs, unsigned long error_code)
|
|
|
struct mm_struct *mm;
|
|
struct mm_struct *mm;
|
|
|
int fault;
|
|
int fault;
|
|
|
int write = error_code & PF_WRITE;
|
|
int write = error_code & PF_WRITE;
|
|
|
- unsigned int flags = FAULT_FLAG_ALLOW_RETRY |
|
|
|
|
|
|
|
+ unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE |
|
|
|
(write ? FAULT_FLAG_WRITE : 0);
|
|
(write ? FAULT_FLAG_WRITE : 0);
|
|
|
|
|
|
|
|
tsk = current;
|
|
tsk = current;
|
|
@@ -1138,6 +1138,16 @@ do_page_fault(struct pt_regs *regs, unsigned long error_code)
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /*
|
|
|
|
|
+ * Pagefault was interrupted by SIGKILL. We have no reason to
|
|
|
|
|
+ * continue pagefault.
|
|
|
|
|
+ */
|
|
|
|
|
+ if ((fault & VM_FAULT_RETRY) && fatal_signal_pending(current)) {
|
|
|
|
|
+ if (!(error_code & PF_USER))
|
|
|
|
|
+ no_context(regs, error_code, address);
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
/*
|
|
/*
|
|
|
* Major/minor page fault accounting is only done on the
|
|
* Major/minor page fault accounting is only done on the
|
|
|
* initial attempt. If we go through a retry, it is extremely
|
|
* initial attempt. If we go through a retry, it is extremely
|