]> git.hungrycats.org Git - linux/commitdiff
Handle page fault atomicity correctly when preempt is enabled.
authorLinus Torvalds <torvalds@home.transmeta.com>
Sun, 25 Aug 2002 04:30:46 +0000 (21:30 -0700)
committerLinus Torvalds <torvalds@home.transmeta.com>
Sun, 25 Aug 2002 04:30:46 +0000 (21:30 -0700)
arch/i386/mm/fault.c
include/asm-i386/hardirq.h

index dcfb3912e674dca9724f06603a6253ba40b8f416..0c30e3e76928150fba4932f2833532b32afaf7d9 100644 (file)
@@ -184,7 +184,7 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long error_code)
         * If we're in an interrupt, have no user context or are running in an
         * atomic region then we must not take the fault..
         */
-       if (preempt_count() || !mm)
+       if (in_atomic() || !mm)
                goto no_context;
 
        down_read(&mm->mmap_sem);
index 54a07d52e593d72113093d15d4e2643322746acd..707d295eed884e445e46fe41a1485c3a2dde04d8 100644 (file)
@@ -77,8 +77,10 @@ typedef struct {
 #define irq_enter()            (preempt_count() += HARDIRQ_OFFSET)
 
 #if CONFIG_PREEMPT
+# define in_atomic()   (preempt_count() != kernel_locked())
 # define IRQ_EXIT_OFFSET (HARDIRQ_OFFSET-1)
 #else
+# define in_atomic()   (preempt_count() != 0)
 # define IRQ_EXIT_OFFSET HARDIRQ_OFFSET
 #endif
 #define irq_exit()                                                     \