x86: mm: move mmap_sem unlock from mm_fault_error() to caller
This replaces four copies in various stages of mm_fault_error() handling with just a single one. It will also allow for more natural placement of the unlocking after some further cleanup. Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Родитель
67e2c38838
Коммит
7fb08eca45
|
@ -844,11 +844,8 @@ do_sigbus(struct pt_regs *regs, unsigned long error_code, unsigned long address,
|
||||||
unsigned int fault)
|
unsigned int fault)
|
||||||
{
|
{
|
||||||
struct task_struct *tsk = current;
|
struct task_struct *tsk = current;
|
||||||
struct mm_struct *mm = tsk->mm;
|
|
||||||
int code = BUS_ADRERR;
|
int code = BUS_ADRERR;
|
||||||
|
|
||||||
up_read(&mm->mmap_sem);
|
|
||||||
|
|
||||||
/* Kernel mode? Handle exceptions or die: */
|
/* Kernel mode? Handle exceptions or die: */
|
||||||
if (!(error_code & PF_USER)) {
|
if (!(error_code & PF_USER)) {
|
||||||
no_context(regs, error_code, address, SIGBUS, BUS_ADRERR);
|
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)
|
unsigned long address, unsigned int fault)
|
||||||
{
|
{
|
||||||
if (fatal_signal_pending(current) && !(error_code & PF_USER)) {
|
if (fatal_signal_pending(current) && !(error_code & PF_USER)) {
|
||||||
up_read(¤t->mm->mmap_sem);
|
|
||||||
no_context(regs, error_code, address, 0, 0);
|
no_context(regs, error_code, address, 0, 0);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -887,14 +883,11 @@ mm_fault_error(struct pt_regs *regs, unsigned long error_code,
|
||||||
if (fault & VM_FAULT_OOM) {
|
if (fault & VM_FAULT_OOM) {
|
||||||
/* Kernel mode? Handle exceptions or die: */
|
/* Kernel mode? Handle exceptions or die: */
|
||||||
if (!(error_code & PF_USER)) {
|
if (!(error_code & PF_USER)) {
|
||||||
up_read(¤t->mm->mmap_sem);
|
|
||||||
no_context(regs, error_code, address,
|
no_context(regs, error_code, address,
|
||||||
SIGSEGV, SEGV_MAPERR);
|
SIGSEGV, SEGV_MAPERR);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
up_read(¤t->mm->mmap_sem);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We ran out of memory, call the OOM killer, and return the
|
* We ran out of memory, call the OOM killer, and return the
|
||||||
* userspace (which will retry the fault, or kill us if we got
|
* userspace (which will retry the fault, or kill us if we got
|
||||||
|
@ -1247,6 +1240,7 @@ good_area:
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (unlikely(fault & VM_FAULT_ERROR)) {
|
if (unlikely(fault & VM_FAULT_ERROR)) {
|
||||||
|
up_read(&mm->mmap_sem);
|
||||||
mm_fault_error(regs, error_code, address, fault);
|
mm_fault_error(regs, error_code, address, fault);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче