|
@@ -844,11 +844,8 @@ do_sigbus(struct pt_regs *regs, unsigned long error_code, unsigned long address,
|
|
|
unsigned int fault)
|
|
|
{
|
|
|
struct task_struct *tsk = current;
|
|
|
- struct mm_struct *mm = tsk->mm;
|
|
|
int code = BUS_ADRERR;
|
|
|
|
|
|
- up_read(&mm->mmap_sem);
|
|
|
-
|
|
|
/* Kernel mode? Handle exceptions or die: */
|
|
|
if (!(error_code & PF_USER)) {
|
|
|
no_context(regs, error_code, address, SIGBUS, BUS_ADRERR);
|
|
@@ -879,7 +876,6 @@ mm_fault_error(struct pt_regs *regs, unsigned long error_code,
|
|
|
unsigned long address, unsigned int fault)
|
|
|
{
|
|
|
if (fatal_signal_pending(current) && !(error_code & PF_USER)) {
|
|
|
- up_read(¤t->mm->mmap_sem);
|
|
|
no_context(regs, error_code, address, 0, 0);
|
|
|
return;
|
|
|
}
|
|
@@ -887,14 +883,11 @@ mm_fault_error(struct pt_regs *regs, unsigned long error_code,
|
|
|
if (fault & VM_FAULT_OOM) {
|
|
|
/* Kernel mode? Handle exceptions or die: */
|
|
|
if (!(error_code & PF_USER)) {
|
|
|
- up_read(¤t->mm->mmap_sem);
|
|
|
no_context(regs, error_code, address,
|
|
|
SIGSEGV, SEGV_MAPERR);
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- up_read(¤t->mm->mmap_sem);
|
|
|
-
|
|
|
/*
|
|
|
* We ran out of memory, call the OOM killer, and return the
|
|
|
* userspace (which will retry the fault, or kill us if we got
|
|
@@ -1247,6 +1240,7 @@ good_area:
|
|
|
return;
|
|
|
|
|
|
if (unlikely(fault & VM_FAULT_ERROR)) {
|
|
|
+ up_read(&mm->mmap_sem);
|
|
|
mm_fault_error(regs, error_code, address, fault);
|
|
|
return;
|
|
|
}
|