Messages in this thread | | | Date | Tue, 10 Nov 2009 10:05:52 +0200 | From | Pekka Enberg <> | Subject | Re: [PATCH 07/10] bootmem: add free_bootmem_late |
| |
FUJITA Tomonori wrote: > On Mon, 9 Nov 2009 22:21:48 +0200 > Pekka Enberg <penberg@cs.helsinki.fi> wrote: > >> On Mon, Nov 9, 2009 at 10:13 PM, Pekka Enberg <penberg@cs.helsinki.fi> wrote: >>>> for (cursor = start; cursor < end; cursor += BITS_PER_LONG) { >>>> - unsigned long idx, vec; >>>> + unsigned long vec; >>>> >>>> - idx = cursor - start; >>>> - vec = ~map[idx / BITS_PER_LONG]; >>>> + if (map) { >>>> + unsigned long idx = cursor - start; >>>> + vec = ~map[idx / BITS_PER_LONG]; >>>> + } else { >>>> + if (end - cursor >= BITS_PER_LONG) >>>> + vec = ~0UL; >>> Why do we need the above? >> OK, I figured that out. I'm not sure why you want to play tricks with >> "vec" when you could just add a new helper that calls >> __free_pages_bootmem() for the full contiguous page range. > > I'm not sure why Chris did that, but yeah, I think that it's cleaner > to leave free_all_bootmem_core alone. > > There is just one user of free_bootmem_late to free some memory so how > about the following simple patch instead 7/10?
Looks good to me!
Acked-by: Pekka Enberg <penberg@cs.helsinki.fi>
> diff --git a/include/linux/bootmem.h b/include/linux/bootmem.h > index dd97fb8..b10ec49 100644 > --- a/include/linux/bootmem.h > +++ b/include/linux/bootmem.h > @@ -53,6 +53,7 @@ extern void free_bootmem_node(pg_data_t *pgdat, > unsigned long addr, > unsigned long size); > extern void free_bootmem(unsigned long addr, unsigned long size); > +extern void free_bootmem_late(unsigned long addr, unsigned long size); > > /* > * Flags for reserve_bootmem (also if CONFIG_HAVE_ARCH_BOOTMEM_NODE, > diff --git a/mm/bootmem.c b/mm/bootmem.c > index 94ef2e7..b0b393b 100644 > --- a/mm/bootmem.c > +++ b/mm/bootmem.c > @@ -196,6 +196,30 @@ static unsigned long __init free_bootmem_pages(unsigned long start, > return count; > } > > +/* > + * free_bootmem_late - free bootmem pages directly to page allocator > + * @addr: starting address of the range > + * @size: size of the range in bytes > + * > + * This is only useful when the bootmem allocator has already been torn > + * down, but we are still initializing the system. Pages are given directly > + * to the page allocator, no bootmem metadata is updated because it is gone. > + */ > +void __init free_bootmem_late(unsigned long addr, unsigned long size) > +{ > + unsigned long cursor, end; > + > + kmemleak_free_part(__va(addr), size); > + > + cursor = PFN_UP(addr); > + end = PFN_DOWN(addr + size); > + > + for (; cursor < end; cursor++) { > + __free_pages_bootmem(pfn_to_page(cursor), 0); > + totalram_pages++; > + } > +} > + > static unsigned long __init free_all_bootmem_core(bootmem_data_t *bdata) > { > struct page *page; > >
| |