diff options
| author | Linus Torvalds <torvalds@g5.osdl.org> | 2005-09-21 17:30:37 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-09-21 17:30:37 -0400 |
| commit | f62378fcfc9c13a57b0b69dbd43336a4df8155a5 (patch) | |
| tree | b2682850f0d15079e0618ee09a23ba7ee71df55b /arch/arm/mm/fault.c | |
| parent | a418500b42c5c54f3f9d68036950c701740a2765 (diff) | |
| parent | 6a1ced59b3ac5d1088f597fd0613a724cdf19e2c (diff) | |
Merge master.kernel.org:/home/rmk/linux-2.6-arm
Diffstat (limited to 'arch/arm/mm/fault.c')
| -rw-r--r-- | arch/arm/mm/fault.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/arch/arm/mm/fault.c b/arch/arm/mm/fault.c index 0b6c4db44e08..4a884baf3b9c 100644 --- a/arch/arm/mm/fault.c +++ b/arch/arm/mm/fault.c | |||
| @@ -233,7 +233,17 @@ do_page_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs) | |||
| 233 | if (in_interrupt() || !mm) | 233 | if (in_interrupt() || !mm) |
| 234 | goto no_context; | 234 | goto no_context; |
| 235 | 235 | ||
| 236 | down_read(&mm->mmap_sem); | 236 | /* |
| 237 | * As per x86, we may deadlock here. However, since the kernel only | ||
| 238 | * validly references user space from well defined areas of the code, | ||
| 239 | * we can bug out early if this is from code which shouldn't. | ||
| 240 | */ | ||
| 241 | if (!down_read_trylock(&mm->mmap_sem)) { | ||
| 242 | if (!user_mode(regs) && !search_exception_tables(regs->ARM_pc)) | ||
| 243 | goto no_context; | ||
| 244 | down_read(&mm->mmap_sem); | ||
| 245 | } | ||
| 246 | |||
| 237 | fault = __do_page_fault(mm, addr, fsr, tsk); | 247 | fault = __do_page_fault(mm, addr, fsr, tsk); |
| 238 | up_read(&mm->mmap_sem); | 248 | up_read(&mm->mmap_sem); |
| 239 | 249 | ||
