Hi, On 10 June 2013 09:29, Yinghai Lu <yinghai@xxxxxxxxxx> wrote: > 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. > > The reason is add_range_with_merge could generate blank spot. > > We could avoid that by searching new expanded start/end, that > new range should include all connected ranges in range array. > At last add the new expanded start/end to the range array. > Also move up left array so do not add new blank slot in the > range array. > > -v2: move left array to avoid enhance add_range() > > Reported-by: Joshua Covington <joshuacov@xxxxxxxxxxxxxx> > Signed-off-by: Yinghai Lu <yinghai@xxxxxxxxxx> > Cc: <stable@xxxxxxxxxxxxxxx> v3.9 > > --- > arch/x86/kernel/cpu/mtrr/cleanup.c | 2 +- > kernel/range.c | 21 +++++++++++---------- > 2 files changed, 12 insertions(+), 11 deletions(-) > > Index: linux-2.6/kernel/range.c > =================================================================== > --- linux-2.6.orig/kernel/range.c > +++ linux-2.6/kernel/range.c > @@ -32,9 +32,8 @@ int add_range_with_merge(struct range *r > if (start >= end) > return nr_range; > > - /* Try to merge it with old one: */ > + /* get new start/end: */ > for (i = 0; i < nr_range; i++) { > - u64 final_start, final_end; > u64 common_start, common_end; > > if (!range[i].end) > @@ -45,14 +44,16 @@ int add_range_with_merge(struct range *r > if (common_start > common_end) > continue; > > - final_start = min(range[i].start, start); > - final_end = max(range[i].end, end); > - > - /* clear it and add it back for further merge */ > - range[i].start = 0; > - range[i].end = 0; > - return add_range_with_merge(range, az, nr_range, > - final_start, final_end); > + /* new start/end, will add it back at last */ > + start = min(range[i].start, start); > + end = max(range[i].end, end); > + > + memmove(&range[i], &range[i + 1], > + (nr_range - (i + 1)) * sizeof(range[i])); > + range[nr_range - 1].start = 0; > + range[nr_range - 1].end = 0; > + nr_range--; > + i--; > } > > /* Need to add it: */ > -- > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/ patches 1,2(latest one) have not helped me on 3.9.5: rathamahata@piledriver /usr/local/src/linux-3.9.5 $ cat /proc/cmdline BOOT_IMAGE=/boot/linux-3.9.5 root=/dev/sda1 rootflags=commit=9 elevator=cfq enable_mtrr_cleanup mtrr_spare_reg_nr=1 rathamahata@piledriver /usr/local/src/linux-3.9.5 $ cat /proc/mtrr reg00: base=0x000000000 ( 0MB), size= 2048MB, count=1: write-back reg01: base=0x080000000 ( 2048MB), size= 256MB, count=1: write-back reg02: base=0x08f800000 ( 2296MB), size= 8MB, count=1: uncachable reg03: base=0x0b0000000 ( 2816MB), size= 256MB, count=1: write-combining reg04: base=0x0c0000000 ( 3072MB), size= 256MB, count=1: write-combining rathamahata@piledriver /usr/local/src/linux-3.9.5 $ free -m total used free shared buffers cached Mem: 7370 714 6656 0 35 243 -/+ buffers/cache: 434 6935 Swap: 3659 0 3659 rathamahata@piledriver /usr/local/src/linux-3.9.5 $ -- To unsubscribe from this list: send the line "unsubscribe stable" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html