bibo mao wrote:This warning info is for two enclosed mtrr region, but it is adjacent here. Here is no overlapped mtrr region even.This patch is to combine two adjacent mtrr region with the same type.this path seems not right...
kernel/cpu/mtrr/main.c | 17 +++++++++++++++--
3 files changed, 15 insertions(+), 2 deletions(-)
Signed-off-by: bibo mao <bibo.mao@xxxxxxxxx>
-------------------------------------------------------------------------------
diff --git a/arch/x86/kernel/cpu/mtrr/main.c b/arch/x86/kernel/cpu/mtrr/main.c
index 6e212f3..c3adf83 100644
--- a/arch/x86/kernel/cpu/mtrr/main.c
+++ b/arch/x86/kernel/cpu/mtrr/main.c
@@ -305,7 +305,7 @@ int mtrr_add_page(unsigned long base, unsigned long size,
{
int i, j, replace, error;
mtrr_type ltype;
- unsigned long lbase, lsize;
+ unsigned long lbase, lsize, newbase;
if (!mtrr_if)
return -ENXIO;
@@ -344,7 +344,7 @@ int mtrr_add_page(unsigned long base, unsigned long size,
mutex_lock(&mtrr_mutex);
for (i = 0; i < num_var_ranges; ++i) {
mtrr_if->get(i, &lbase, &lsize, <ype);
- if (!lsize || base > lbase + lsize - 1 || base + size - 1 < lbase)
+ if (!lsize || base > lbase + lsize || base + size < lbase)
continue;
/* At this point we know there is some kind of overlap/enclosure */
if (base < lbase || base + size - 1 > lbase + lsize - 1) {
@@ -356,6 +356,19 @@ int mtrr_add_page(unsigned long base, unsigned long size,
}
else if (types_compatible(type, ltype))
continue;
+ } else if ((base == lbase + lsize) || (lbase ==base + size)) {
+ if (type != ltype)
+ continue;
do you need
if (ltype != type) {
if (types_compatible(type, ltype))
continue;
printk (KERN_WARNING "mtrr: type mismatch for %lx000,%lx000 old: %s new: %s\n",
base, size, mtrr_attrib_to_str(ltype),
mtrr_attrib_to_str(type));
goto out;
}
?
Here is test result:
+ /* New region adjacent with an existing region */
+ newbase = (base < lbase) ? base : lbase;
+ if (!mtrr_if->validate_add_page(newbase,lsize + size,type) &&
+ mtrr_if->get_free_region(newbase, lsize + size, replace)>=0) {
+ base = newbase;
+ size += lsize;
+ replace = i;
+ continue;
+ } else
+ continue;
}
printk(KERN_WARNING
"mtrr: 0x%lx000,0x%lx000 overlaps existing"
better to have some test case...
YH