aboutsummaryrefslogtreecommitdiffstats
path: root/arch/um/kernel/trap_kern.c
diff options
context:
space:
mode:
authorPaolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it>2005-09-23 00:44:20 -0400
committerLinus Torvalds <torvalds@g5.osdl.org>2005-09-23 01:17:36 -0400
commitfea03cb40a15e3c6647c0927300202e062e6792a (patch)
tree2e7933807e29b7d62dd9104c4bc3e640c703ab83 /arch/um/kernel/trap_kern.c
parent12ebcd73e40e09f0dfddf89e465cc0541e0ff8b1 (diff)
[PATCH] uml: avoid fixing faults while atomic
Following i386, we should maybe refuse trying to fault in pages when we're doing atomic operations, because to handle the fault we could need to take already taken spinlocks. Also, if we're doing an atomic operation (in the sense of in_atomic()) we're surely in kernel mode and we're surely going to handle adequately the failed fault, so it's safe to behave this way. Currently, on UML SMP is rarely used, and we don't support PREEMPT, so this is unlikely to create problems right now, but it might in the future. Signed-off-by: Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it> Cc: Jeff Dike <jdike@addtoit.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'arch/um/kernel/trap_kern.c')
-rw-r--r--arch/um/kernel/trap_kern.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/arch/um/kernel/trap_kern.c b/arch/um/kernel/trap_kern.c
index 90690b9b1f30..d297429ac360 100644
--- a/arch/um/kernel/trap_kern.c
+++ b/arch/um/kernel/trap_kern.c
@@ -40,6 +40,12 @@ int handle_page_fault(unsigned long address, unsigned long ip,
40 int err = -EFAULT; 40 int err = -EFAULT;
41 41
42 *code_out = SEGV_MAPERR; 42 *code_out = SEGV_MAPERR;
43
44 /* If the fault was during atomic operation, don't take the fault, just
45 * fail. */
46 if (in_atomic())
47 goto out_nosemaphore;
48
43 down_read(&mm->mmap_sem); 49 down_read(&mm->mmap_sem);
44 vma = find_vma(mm, address); 50 vma = find_vma(mm, address);
45 if(!vma) 51 if(!vma)
@@ -90,6 +96,7 @@ survive:
90 flush_tlb_page(vma, address); 96 flush_tlb_page(vma, address);
91out: 97out:
92 up_read(&mm->mmap_sem); 98 up_read(&mm->mmap_sem);
99out_nosemaphore:
93 return(err); 100 return(err);
94 101
95/* 102/*