So don't have silly big hole...
in hpa's case could auto detect instead of adding mtrr_chunk_size in command line
Ingo, please consider to squash this one to previous one
| commit 2313c2793d290a8cc37c428f8622c53f3fe1d6dc
| Author: Yinghai Lu <yhlu.kernel@gmail.com>
| Date: Sat Sep 27 00:30:08 2008 -0700
|
| x86: mtrr_cleanup optimization, v2
Signed-off-by: Yinghai Lu <yhlu.kernel@gmail.com>
---
arch/x86/kernel/cpu/mtrr/main.c | 74 +++++++++++++++++++++++-----------------
1 file changed, 43 insertions(+), 31 deletions(-)
Index: linux-2.6/arch/x86/kernel/cpu/mtrr/main.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/cpu/mtrr/main.c
+++ linux-2.6/arch/x86/kernel/cpu/mtrr/main.c
@@ -992,22 +992,17 @@ range_to_mtrr_with_hole(struct var_mtrr_
/* only cut back, when it is not the last */
if (sizek) {
while (range0_basek + range0_sizek > (basek + sizek)) {
- range0_sizek -= chunk_sizek;
+ if (range0_sizek >= chunk_sizek)
+ range0_sizek -= chunk_sizek;
+ else
+ range0_sizek = 0;
+
if (!range0_sizek)
break;
}
}
- if (range0_sizek) {
- if (debug_print)
- printk(KERN_DEBUG "range0: %016lx - %016lx\n",
- range0_basek<<10,
- (range0_basek + range0_sizek)<<10);
- state->reg = range_to_mtrr(state->reg, range0_basek,
- range0_sizek, MTRR_TYPE_WRBACK);
-
- }
-
+second_try:
range_basek = range0_basek + range0_sizek;
/* one hole in the middle */
@@ -1015,33 +1010,50 @@ range_to_mtrr_with_hole(struct var_mtrr_
second_sizek = range_basek - basek;
if (range0_sizek > state->range_sizek) {
- unsigned long hole_basek, hole_sizek;
/* one hole in middle or at end */
hole_sizek = range0_sizek - state->range_sizek - second_sizek;
- if (hole_sizek) {
- hole_basek = range_basek - hole_sizek - second_sizek;
- if (debug_print)
- printk(KERN_DEBUG "hole: %016lx - %016lx\n",
- hole_basek<<10,
- (hole_basek + ...