From e1584e0c33409a5de2842cefbff6800dfa74387f Mon Sep 17 00:00:00 2001 From: Anton Blanchard Date: Thu, 15 Jun 2006 14:11:22 +1000 Subject: [PATCH] --- yaml --- r: 28806 b: refs/heads/master c: 1e92a550e80fef01ebcc0bcd0896109cdb986c72 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/include/asm-powerpc/delay.h | 13 +++++++++++++ trunk/include/linux/delay.h | 5 +---- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/[refs] b/[refs] index 94720e56ca61..bb38ec4b71d6 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: ddf5f75a16b3e7460ffee881795aa168dffcd0cf +refs/heads/master: 1e92a550e80fef01ebcc0bcd0896109cdb986c72 diff --git a/trunk/include/asm-powerpc/delay.h b/trunk/include/asm-powerpc/delay.h index 057a60955474..f9200a65c632 100644 --- a/trunk/include/asm-powerpc/delay.h +++ b/trunk/include/asm-powerpc/delay.h @@ -17,5 +17,18 @@ extern void __delay(unsigned long loops); extern void udelay(unsigned long usecs); +/* + * On shared processor machines the generic implementation of mdelay can + * result in large errors. While each iteration of the loop inside mdelay + * is supposed to take 1ms, the hypervisor could sleep our partition for + * longer (eg 10ms). With the right timing these errors can add up. + * + * Since there is no 32bit overflow issue on 64bit kernels, just call + * udelay directly. + */ +#ifdef CONFIG_PPC64 +#define mdelay(n) udelay((n) * 1000) +#endif + #endif /* __KERNEL__ */ #endif /* _ASM_POWERPC_DELAY_H */ diff --git a/trunk/include/linux/delay.h b/trunk/include/linux/delay.h index acb74865b973..17ddb55430ae 100644 --- a/trunk/include/linux/delay.h +++ b/trunk/include/linux/delay.h @@ -25,10 +25,7 @@ extern unsigned long loops_per_jiffy; #define MAX_UDELAY_MS 5 #endif -#ifdef notdef -#define mdelay(n) (\ - {unsigned long __ms=(n); while (__ms--) udelay(1000);}) -#else +#ifndef mdelay #define mdelay(n) (\ (__builtin_constant_p(n) && (n)<=MAX_UDELAY_MS) ? udelay((n)*1000) : \ ({unsigned long __ms=(n); while (__ms--) udelay(1000);}))