[kernel] Add patches to fix MTRR issues (rhbz 973185)

Josh Boyer jwboyer at fedoraproject.org
Tue Jun 11 19:02:06 UTC 2013


commit d08f67e2b7e48a4065b37bc9b1e3bf7a5a056d55
Author: Josh Boyer <jwboyer at redhat.com>
Date:   Tue Jun 11 14:51:35 2013 -0400

    Add patches to fix MTRR issues (rhbz 973185)

 kernel.spec                                        |    8 ++
 ...-original-mtrr-range-get-for-mtrr_cleanup.patch |   63 +++++++++++++++
 x86-range-make-add_range-use-blank-slot.patch      |   80 ++++++++++++++++++++
 3 files changed, 151 insertions(+), 0 deletions(-)
---
diff --git a/kernel.spec b/kernel.spec
index f85ba9a..9e1d7da 100644
--- a/kernel.spec
+++ b/kernel.spec
@@ -761,6 +761,9 @@ Patch25038: cdrom-use-kzalloc-for-failing-hardware.patch
 Patch25039: vhost_net-clear-msg.control-for-non-zerocopy-case-during-tx.patch
 Patch25040: tuntap-set-SOCK_ZEROCOPY-flag-during-open.patch
 
+#rhbz 973185
+Patch25041: x86-mtrr-Fix-original-mtrr-range-get-for-mtrr_cleanup.patch
+Patch25042: x86-range-make-add_range-use-blank-slot.patch
 
 # END OF PATCH DEFINITIONS
 
@@ -1466,6 +1469,10 @@ ApplyPatch cdrom-use-kzalloc-for-failing-hardware.patch
 ApplyPatch vhost_net-clear-msg.control-for-non-zerocopy-case-during-tx.patch
 ApplyPatch tuntap-set-SOCK_ZEROCOPY-flag-during-open.patch
 
+#rhbz 973185
+ApplyPatch x86-mtrr-Fix-original-mtrr-range-get-for-mtrr_cleanup.patch
+ApplyPatch x86-range-make-add_range-use-blank-slot.patch
+
 # END OF PATCH APPLICATIONS
 
 %endif
@@ -2272,6 +2279,7 @@ fi
 #                 ||     ||
 %changelog
 * Tue Jun 11 2013 Josh Boyer <jwboyer at redhat.com>
+- Add patches to fix MTRR issues in 3.9.5 (rhbz 973185)
 - Add two patches to fix issues with vhost_net and macvlan (rhbz 954181)
 
 * Tue Jun 11 2013 Josh Boyer <jwboyer at redhat.com> - 3.10.0-0.rc5.git0.1
diff --git a/x86-mtrr-Fix-original-mtrr-range-get-for-mtrr_cleanup.patch b/x86-mtrr-Fix-original-mtrr-range-get-for-mtrr_cleanup.patch
new file mode 100644
index 0000000..7c8b930
--- /dev/null
+++ b/x86-mtrr-Fix-original-mtrr-range-get-for-mtrr_cleanup.patch
@@ -0,0 +1,63 @@
+Joshua reported: Commit cd7b304dfaf1 (x86, range: fix missing merge
+during add range) broke mtrr cleanup on his setup in 3.9.5.
+corresponding commit in upstream is fbe06b7bae7c.
+
+  *BAD*gran_size: 64K chunk_size: 16M num_reg: 6 lose cover RAM: -0G
+
+https://bugzilla.kernel.org/show_bug.cgi?id=59491
+
+So it rejects new var mtrr layout.
+
+It turns out we have some problem with initial mtrr range retrievel.
+current sequence is:
+	x86_get_mtrr_mem_range
+		==> bunchs of add_range_with_merge
+		==> bunchs of subract_range
+		==> clean_sort_range
+	add_range_with_merge for [0,1M)
+	sort_range()
+
+add_range_with_merge could have blank slots, so we can not just
+sort only, that will have final result have extra blank slot in head.
+
+So move that calling add_range_with_merge for [0,1M), with that we
+could avoid extra clean_sort_range calling.
+
+Reported-by: Joshua Covington <joshuacov at googlemail.com>
+Tested-by: Joshua Covington <joshuacov at googlemail.com>
+Signed-off-by: Yinghai Lu <yinghai at kernel.org>
+Cc: <stable at vger.kernel.org> v3.9
+
+---
+ arch/x86/kernel/cpu/mtrr/cleanup.c |    8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+Index: linux-2.6/arch/x86/kernel/cpu/mtrr/cleanup.c
+===================================================================
+--- linux-2.6.orig/arch/x86/kernel/cpu/mtrr/cleanup.c
++++ linux-2.6/arch/x86/kernel/cpu/mtrr/cleanup.c
+@@ -714,15 +714,15 @@ int __init mtrr_cleanup(unsigned address
+ 	if (mtrr_tom2)
+ 		x_remove_size = (mtrr_tom2 >> PAGE_SHIFT) - x_remove_base;
+ 
+-	nr_range = x86_get_mtrr_mem_range(range, 0, x_remove_base, x_remove_size);
+ 	/*
+ 	 * [0, 1M) should always be covered by var mtrr with WB
+ 	 * and fixed mtrrs should take effect before var mtrr for it:
+ 	 */
+-	nr_range = add_range_with_merge(range, RANGE_NUM, nr_range, 0,
++	nr_range = add_range_with_merge(range, RANGE_NUM, 0, 0,
+ 					1ULL<<(20 - PAGE_SHIFT));
+-	/* Sort the ranges: */
+-	sort_range(range, nr_range);
++	/* add from var mtrr at last */
++	nr_range = x86_get_mtrr_mem_range(range, nr_range,
++					  x_remove_base, x_remove_size);
+ 
+ 	range_sums = sum_ranges(range, nr_range);
+ 	printk(KERN_INFO "total RAM covered: %ldM\n",
+--
+To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
+the body of a message to majordomo at vger.kernel.org
+More majordomo info at  http://vger.kernel.org/majordomo-info.html
+Please read the FAQ at  http://www.tux.org/lkml/
\ No newline at end of file
diff --git a/x86-range-make-add_range-use-blank-slot.patch b/x86-range-make-add_range-use-blank-slot.patch
new file mode 100644
index 0000000..50d3937
--- /dev/null
+++ b/x86-range-make-add_range-use-blank-slot.patch
@@ -0,0 +1,80 @@
+Now add_range_with_merge will generate blank slot as subtract_range.
+we could reach the array limit because of blank slots.
+
+We can let add_range to have second try to use blank slot.
+
+Also use WARN_ONCE to print trace.
+
+Reported-by: Joshua Covington <joshuacov at googlemail.com>
+Signed-off-by: Yinghai Lu <yinghai at kernel.org>
+Cc: <stable at vger.kernel.org> v3.9
+---
+ kernel/range.c |   34 ++++++++++++++++++++++------------
+ 1 file changed, 22 insertions(+), 12 deletions(-)
+
+Index: linux-2.6/kernel/range.c
+===================================================================
+--- linux-2.6.orig/kernel/range.c
++++ linux-2.6/kernel/range.c
+@@ -3,23 +3,34 @@
+  */
+ #include <linux/kernel.h>
+ #include <linux/init.h>
++#include <linux/bug.h>
+ #include <linux/sort.h>
+-
+ #include <linux/range.h>
+ 
+ int add_range(struct range *range, int az, int nr_range, u64 start, u64 end)
+ {
+-	if (start >= end)
+-		return nr_range;
++	int i;
+ 
+-	/* Out of slots: */
+-	if (nr_range >= az)
++	if (start >= end)
+ 		return nr_range;
+ 
+-	range[nr_range].start = start;
+-	range[nr_range].end = end;
++	/* Out of slots ? */
++	if (nr_range < az) {
++		i = nr_range;
++		nr_range++;
++	} else {
++		/* find blank slot */
++		for (i = 0; i < az; i++)
++			if (!range[i].end)
++				break;
++		if (i == az) {
++			WARN_ONCE(1, "run out of slot in ranges\n");
++			return az;
++		}
++	}
+ 
+-	nr_range++;
++	range[i].start = start;
++	range[i].end = end;
+ 
+ 	return nr_range;
+ }
+@@ -98,10 +109,9 @@ void subtract_range(struct range *range,
+ 			if (i < az) {
+ 				range[i].end = range[j].end;
+ 				range[i].start = end;
+-			} else {
+-				pr_err("%s: run out of slot in ranges\n",
+-					__func__);
+-			}
++			} else
++				WARN_ONCE(1, "run out of slot in ranges\n");
++
+ 			range[j].end = start;
+ 			continue;
+ 		}
+--
+To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
+the body of a message to majordomo at vger.kernel.org
+More majordomo info at  http://vger.kernel.org/majordomo-info.html
+Please read the FAQ at  http://www.tux.org/lkml/
\ No newline at end of file


More information about the scm-commits mailing list