Thread (25 messages) 25 messages, 9 authors, 2003-01-30

Re: Linus rollup

From: Andrea Arcangeli <hidden>
Date: 2003-01-30 00:43:45

On Wed, Jan 29, 2003 at 02:26:17AM -0800, Andrew Morton wrote:
"David S. Miller" [off-list ref] wrote:
quoted
   From: Russell King [off-list ref]
   Date: Wed, 29 Jan 2003 09:59:49 +0000
   
   	/* This function must be called with interrupts disabled
   
   which hasn't been true for some time, and is even less true now that
   local IRQs don't get disabled.  Does this matter... for UP?

I disable local IRQs during gettimeofday() on sparc.

These locks definitely need to be taken with IRQs disabled.
Why isn't x86 doing that?
Darned if I know.  Looks like Andrea's kernel will deadlock if
arch/i386/kernel/time.c:timer_interrupt() takes i8253_lock
while that cpu is holding the same lock in do_slow_gettimeoffset().
yes thanks! mostly theorical though, 486 SMP boxes aren't that common ;)

This should fix it.
--- 2.4.21pre3aa1/arch/i386/kernel/time.c.~1~	2003-01-21 03:43:59.000000000 +0100
+++ 2.4.21pre3aa1/arch/i386/kernel/time.c	2003-01-30 01:40:37.000000000 +0100
@@ -159,6 +159,7 @@ extern spinlock_t i8259A_lock;
 static unsigned long do_slow_gettimeoffset(void)
 {
 	int count;
+	unsigned long flags;
 
 	static int count_p = LATCH;    /* for the first call after boot */
 	static unsigned long jiffies_p = 0;
@@ -169,7 +170,7 @@ static unsigned long do_slow_gettimeoffs
 	unsigned long jiffies_t;
 
 	/* gets recalled with irq locally disabled */
-	spin_lock(&i8253_lock);
+	spin_lock_irqsave(&i8253_lock, flags);
 	/* timer count may underflow right here */
 	outb_p(0x00, 0x43);	/* latch the count ASAP */
 
@@ -191,7 +192,7 @@ static unsigned long do_slow_gettimeoffs
                 count = LATCH - 1;
         }
 	
-	spin_unlock(&i8253_lock);
+	spin_unlock_irqrestore(&i8253_lock, flags);
 
 	/*
 	 * avoiding timer inconsistencies (they are rare, but they happen)...
@@ -212,13 +213,13 @@ static unsigned long do_slow_gettimeoffs
 
 			int i;
 
-			spin_lock(&i8259A_lock);
+			spin_lock_irqsave(&i8259A_lock, flags);
 			/*
 			 * This is tricky when I/O APICs are used;
 			 * see do_timer_interrupt().
 			 */
 			i = inb(0x20);
-			spin_unlock(&i8259A_lock);
+			spin_unlock_irqrestore(&i8259A_lock, flags);
 
 			/* assumption about timer being IRQ0 */
 			if (i & 0x01) {
Andrea
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help