[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