Re: udelay() & preemption & drifty ITCs

From: Jesse Barnes <jbarnes_at_sgi.com>
Date: 2003-11-25 08:25:15
On Mon, Nov 24, 2003 at 01:00:43PM -0800, Jesse Barnes wrote:
> On Sun, Nov 23, 2003 at 02:39:29PM -0800, Jesse Barnes wrote:
> > Yep, it appears so.  I guess we need a 'preempt_disable/disable()' pair
> > around the itc access.  Of course, callers under a spinlock are already
> > protected, so maybe exposure to this problem isn't that large?
> 
> Here's the patch.  Compiles and boots, but I haven't made a test module
> that illustrates this bug, so I haven't tested it.

Here's one that actually patches the affected routine.  Same caveat
applies.

Jesse

diff -Nru a/include/asm-ia64/delay.h b/include/asm-ia64/delay.h
--- a/include/asm-ia64/delay.h	Mon Nov 24 14:19:19 2003
+++ b/include/asm-ia64/delay.h	Mon Nov 24 14:19:19 2003
@@ -15,6 +15,7 @@
 #include <linux/config.h>
 #include <linux/kernel.h>
 #include <linux/sched.h>
+#include <linux/preempt.h>
 #include <linux/compiler.h>
 
 #include <asm/intrinsics.h>
@@ -81,11 +82,14 @@
 static __inline__ void
 udelay (unsigned long usecs)
 {
-	unsigned long start = ia64_get_itc();
-	unsigned long cycles = usecs*local_cpu_data->cyc_per_usec;
+	unsigned long start, cycles;
 
+	preempt_disable();
+	start = ia64_get_itc();
+	cycles = usecs*local_cpu_data->cyc_per_usec;
 	while (ia64_get_itc() - start < cycles)
 		/* skip */;
+	preempt_enable();
 }
 
 #endif /* _ASM_IA64_DELAY_H */
-
To unsubscribe from this list: send the line "unsubscribe linux-ia64" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Received on Mon Nov 24 16:25:53 2003

This archive was generated by hypermail 2.1.8 : 2005-08-02 09:20:20 EST