lkml.org 
[lkml]   [2008]   [Oct]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [patch 1/1] combine two adjacent mtrr region with the same type
    bibo mao wrote:
    > This patch is to combine two adjacent mtrr region with the same type.
    >
    > kernel/cpu/mtrr/main.c | 17 +++++++++++++++--
    > 3 files changed, 15 insertions(+), 2 deletions(-)
    >
    > Signed-off-by: bibo mao <bibo.mao@gmail.com>
    >
    > -------------------------------------------------------------------------------
    > 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, &ltype);
    > - 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;
    this path seems not right...

    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;
    }
    ?




    > + /* 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


    \
     
     \ /
      Last update: 2008-10-09 17:57    [W:0.049 / U:63.580 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site