Re: [PATCH] [11/18] Fix alignment bug in bootmem allocator

From: Yinghai Lu
Date: Sun Mar 16 2008 - 22:20:00 EST


On Sun, Mar 16, 2008 at 6:58 PM, Andi Kleen <andi@xxxxxxxxxxxxxx> wrote:
>
> Without this fix bootmem can return unaligned addresses when the start of a
> node is not aligned to the align value. Needed for reliably allocating
> gigabyte pages.
> Signed-off-by: Andi Kleen <ak@xxxxxxx>
>
> ---
> mm/bootmem.c | 4 +++-
> 1 file changed, 3 insertions(+), 1 deletion(-)
>
> Index: linux/mm/bootmem.c
> ===================================================================
> --- linux.orig/mm/bootmem.c
> +++ linux/mm/bootmem.c
> @@ -197,6 +197,7 @@ __alloc_bootmem_core(struct bootmem_data
> {
> unsigned long offset, remaining_size, areasize, preferred;
> unsigned long i, start = 0, incr, eidx, end_pfn;
> + unsigned long pfn;
> void *ret;
>
> if (!size) {
> @@ -239,12 +240,13 @@ __alloc_bootmem_core(struct bootmem_data
> preferred = PFN_DOWN(ALIGN(preferred, align)) + offset;
> areasize = (size + PAGE_SIZE-1) / PAGE_SIZE;
> incr = align >> PAGE_SHIFT ? : 1;
> + pfn = PFN_DOWN(bdata->node_boot_start);
>
> restart_scan:
> for (i = preferred; i < eidx; i += incr) {
> unsigned long j;
> i = find_next_zero_bit(bdata->node_bootmem_map, eidx, i);
> - i = ALIGN(i, incr);
> + i = ALIGN(pfn + i, incr) - pfn;
> if (i >= eidx)
> break;
> if (test_bit(i, bdata->node_bootmem_map))
> --

node_boot_start is not page aligned?

YH
--
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/