aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2013-05-02 17:56:31 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2013-05-02 17:56:31 -0400
commit0279b3c0ada1d78882f24acf94ac4595bd657a89 (patch)
treeba31505ea6581b840604493d0233857bb7ce58d1 /lib
parent797994f81a8b2bdca2eecffa415c1e7a89a4f961 (diff)
parentf3002134158092178be81339ec5a22ff80e6c308 (diff)
Merge branch 'sched-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull scheduler fixes from Ingo Molnar: "This fixes the cputime scaling overflow problems for good without having bad 32-bit overhead, and gets rid of the div64_u64_rem() helper as well." * 'sched-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: Revert "math64: New div64_u64_rem helper" sched: Avoid prev->stime underflow sched: Do not account bogus utime sched: Avoid cputime scaling overflow
Diffstat (limited to 'lib')
-rw-r--r--lib/div64.c19
1 files changed, 6 insertions, 13 deletions
diff --git a/lib/div64.c b/lib/div64.c
index 3af5728d95fd..a163b6caef73 100644
--- a/lib/div64.c
+++ b/lib/div64.c
@@ -79,10 +79,9 @@ EXPORT_SYMBOL(div_s64_rem);
79#endif 79#endif
80 80
81/** 81/**
82 * div64_u64_rem - unsigned 64bit divide with 64bit divisor and 64bit remainder 82 * div64_u64 - unsigned 64bit divide with 64bit divisor
83 * @dividend: 64bit dividend 83 * @dividend: 64bit dividend
84 * @divisor: 64bit divisor 84 * @divisor: 64bit divisor
85 * @remainder: 64bit remainder
86 * 85 *
87 * This implementation is a modified version of the algorithm proposed 86 * This implementation is a modified version of the algorithm proposed
88 * by the book 'Hacker's Delight'. The original source and full proof 87 * by the book 'Hacker's Delight'. The original source and full proof
@@ -90,33 +89,27 @@ EXPORT_SYMBOL(div_s64_rem);
90 * 89 *
91 * 'http://www.hackersdelight.org/HDcode/newCode/divDouble.c.txt' 90 * 'http://www.hackersdelight.org/HDcode/newCode/divDouble.c.txt'
92 */ 91 */
93#ifndef div64_u64_rem 92#ifndef div64_u64
94u64 div64_u64_rem(u64 dividend, u64 divisor, u64 *remainder) 93u64 div64_u64(u64 dividend, u64 divisor)
95{ 94{
96 u32 high = divisor >> 32; 95 u32 high = divisor >> 32;
97 u64 quot; 96 u64 quot;
98 97
99 if (high == 0) { 98 if (high == 0) {
100 u32 rem32; 99 quot = div_u64(dividend, divisor);
101 quot = div_u64_rem(dividend, divisor, &rem32);
102 *remainder = rem32;
103 } else { 100 } else {
104 int n = 1 + fls(high); 101 int n = 1 + fls(high);
105 quot = div_u64(dividend >> n, divisor >> n); 102 quot = div_u64(dividend >> n, divisor >> n);
106 103
107 if (quot != 0) 104 if (quot != 0)
108 quot--; 105 quot--;
109 106 if ((dividend - quot * divisor) >= divisor)
110 *remainder = dividend - quot * divisor;
111 if (*remainder >= divisor) {
112 quot++; 107 quot++;
113 *remainder -= divisor;
114 }
115 } 108 }
116 109
117 return quot; 110 return quot;
118} 111}
119EXPORT_SYMBOL(div64_u64_rem); 112EXPORT_SYMBOL(div64_u64);
120#endif 113#endif
121 114
122/** 115/**