From d08f67e2b7e48a4065b37bc9b1e3bf7a5a056d55 Mon Sep 17 00:00:00 2001 From: Josh Boyer Date: Tue, 11 Jun 2013 14:51:35 -0400 Subject: [PATCH] Add patches to fix MTRR issues (rhbz 973185) --- kernel.spec | 8 ++ ...inal-mtrr-range-get-for-mtrr_cleanup.patch | 63 +++++++++++++++ x86-range-make-add_range-use-blank-slot.patch | 80 +++++++++++++++++++ 3 files changed, 151 insertions(+) create mode 100644 x86-mtrr-Fix-original-mtrr-range-get-for-mtrr_cleanup.patch create mode 100644 x86-range-make-add_range-use-blank-slot.patch diff --git a/kernel.spec b/kernel.spec index f85ba9a6d..9e1d7daa6 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 +- 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 - 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 000000000..7c8b930f7 --- /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 +Tested-by: Joshua Covington +Signed-off-by: Yinghai Lu +Cc: 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@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 000000000..50d393794 --- /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 +Signed-off-by: Yinghai Lu +Cc: 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 + #include ++#include + #include +- + #include + + 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@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