* [PATCH] disable preemption in udelay()
@ 2005-12-14 18:47 hawkes
0 siblings, 0 replies; only message in thread
From: hawkes @ 2005-12-14 18:47 UTC (permalink / raw)
To: linux-ia64
The udelay() inline for ia64 uses the ITC. If CONFIG_PREEMPT is enabled
and the platform has unsynchronized ITCs and the calling task migrates to
another CPU while doing the udelay loop, then the effective delay may be
too short or very, very long.
The most simple fix is to disable preemption around the udelay looping.
The downside is that inhibits realtime preemption for cases of long
udelays. I am reluctant to propose a much more complicated patch (that
disables preemption only for "short" delays, and uses the global RTC as
the time base for longer, preemptible delays) unless there are valid
objections to this more simple fix.
Signed-off-by: John Hawkes <hawkes@sgi.com>
Index: linux/include/asm-ia64/delay.h
=================================--- linux.orig/include/asm-ia64/delay.h 2005-10-27 17:02:08.000000000 -0700
+++ linux/include/asm-ia64/delay.h 2005-12-14 10:30:55.000000000 -0800
@@ -87,11 +87,17 @@
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;
+ unsigned long cycles;
+
+ preempt_disable();
+ cycles = usecs*local_cpu_data->cyc_per_usec;
+ start = ia64_get_itc();
while (ia64_get_itc() - start < cycles)
cpu_relax();
+
+ preempt_enable();
}
#endif /* _ASM_IA64_DELAY_H */
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2005-12-14 18:47 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-12-14 18:47 [PATCH] disable preemption in udelay() hawkes
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox