mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-06 02:50:43 +00:00
![Anton Blanchard](/assets/img/avatar_default.png)
On partitioned PPC64 systems where a partition is given 1/10 of a processor, we have seen mdelay() delaying for 10 times longer than it should. The reason is that the generic mdelay(n) does n delays of 1 millisecond each. However, with 1/10 of a processor, we only get a one-millisecond timeslice every 10ms. Thus each 1 millisecond delay loop ends up taking 10ms elapsed time. The solution is just to use the PPC64 udelay function, which uses the timebase to ensure that the delay is based on elapsed time rather than how much processing time the partition has been given. (Yes, the generic mdelay uses the PPC64 udelay, but the problem is that the start time gets reset every millisecond, and each time it gets reset we lose another 9ms.) Signed-off-by: Anton Blanchard <anton@samba.org> Signed-off-by: Paul Mackerras <paulus@samba.org> Acked-by: Andrew Morton <akpm@osdl.org>
34 lines
1 KiB
C
34 lines
1 KiB
C
#ifndef _ASM_POWERPC_DELAY_H
|
|
#define _ASM_POWERPC_DELAY_H
|
|
#ifdef __KERNEL__
|
|
|
|
/*
|
|
* Copyright 1996, Paul Mackerras.
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version
|
|
* 2 of the License, or (at your option) any later version.
|
|
*
|
|
* PPC64 Support added by Dave Engebretsen, Todd Inglett, Mike Corrigan,
|
|
* Anton Blanchard.
|
|
*/
|
|
|
|
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 */
|