summaryrefslogtreecommitdiffstats
path: root/releases/2.6.32.58/lib-proportion-lower-prop_max_shift-to-32-on-64-bit-kernel.patch
diff options
context:
space:
mode:
Diffstat (limited to 'releases/2.6.32.58/lib-proportion-lower-prop_max_shift-to-32-on-64-bit-kernel.patch')
-rw-r--r--releases/2.6.32.58/lib-proportion-lower-prop_max_shift-to-32-on-64-bit-kernel.patch45
1 files changed, 45 insertions, 0 deletions
diff --git a/releases/2.6.32.58/lib-proportion-lower-prop_max_shift-to-32-on-64-bit-kernel.patch b/releases/2.6.32.58/lib-proportion-lower-prop_max_shift-to-32-on-64-bit-kernel.patch
new file mode 100644
index 0000000..1d31ace
--- /dev/null
+++ b/releases/2.6.32.58/lib-proportion-lower-prop_max_shift-to-32-on-64-bit-kernel.patch
@@ -0,0 +1,45 @@
+From 3310225dfc71a35a2cc9340c15c0e08b14b3c754 Mon Sep 17 00:00:00 2001
+From: Wu Fengguang <fengguang.wu@intel.com>
+Date: Mon, 9 Jan 2012 11:53:50 -0600
+Subject: lib: proportion: lower PROP_MAX_SHIFT to 32 on 64-bit kernel
+
+From: Wu Fengguang <fengguang.wu@intel.com>
+
+commit 3310225dfc71a35a2cc9340c15c0e08b14b3c754 upstream.
+
+PROP_MAX_SHIFT should be set to <=32 on 64-bit box. This fixes two bugs
+in the below lines of bdi_dirty_limit():
+
+ bdi_dirty *= numerator;
+ do_div(bdi_dirty, denominator);
+
+1) divide error: do_div() only uses the lower 32 bit of the denominator,
+ which may trimmed to be 0 when PROP_MAX_SHIFT > 32.
+
+2) overflow: (bdi_dirty * numerator) could easily overflow if numerator
+ used up to 48 bits, leaving only 16 bits to bdi_dirty
+
+Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
+Reported-by: Ilya Tumaykin <librarian_rus@yahoo.com>
+Tested-by: Ilya Tumaykin <librarian_rus@yahoo.com>
+Signed-off-by: Wu Fengguang <fengguang.wu@intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ include/linux/proportions.h | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+--- a/include/linux/proportions.h
++++ b/include/linux/proportions.h
+@@ -81,7 +81,11 @@ void prop_inc_percpu(struct prop_descrip
+ * Limit the time part in order to ensure there are some bits left for the
+ * cycle counter and fraction multiply.
+ */
++#if BITS_PER_LONG == 32
+ #define PROP_MAX_SHIFT (3*BITS_PER_LONG/4)
++#else
++#define PROP_MAX_SHIFT (BITS_PER_LONG/2)
++#endif
+
+ #define PROP_FRAC_SHIFT (BITS_PER_LONG - PROP_MAX_SHIFT - 1)
+ #define PROP_FRAC_BASE (1UL << PROP_FRAC_SHIFT)