Messages in this thread | | | Date | Tue, 15 Apr 2008 15:41:37 +0200 | From | Roel Kluin <> | Subject | Re: + bootmem-node-setup-agnostic-free_bootmem.patch added to -mm tree |
| |
Johannes Weiner wrote:
> How about the following (untested, even uncompiled, but you should get > the idea) proposal which would replace the patch discussed in this > thread: > > --- tree-linus.orig/mm/bootmem.c > +++ tree-linus/mm/bootmem.c > @@ -421,7 +421,25 @@ int __init reserve_bootmem(unsigned long > > void __init free_bootmem(unsigned long addr, unsigned long size) > { > - free_bootmem_core(NODE_DATA(0)->bdata, addr, size); > + bootmem_data_t *bdata; > + > + list_for_each_entry(bdata, &bdata_list, list) { > + unsigned long remainder = 0; > + > + if (addr < bdata->node_boot_start) > + continue; > + > + if (PFN_DOWN(addr + size) > bdata->node_low_pfn) > + remainder = PFN_DOWN(addr + size) - bdata->node_low_pfn; > + > + size -= PFN_PHYS(remainder); > + free_bootmem_core(bdata, addr, size) Missing semicolon here -----------------------------^
> + > + if (!remainder) > + break; > + > + addr = PFN_PHYS(bdata->node_low_pfn + 1); > + } > }
This should do the same as (untested):
void __init free_bootmem(unsigned long addr, unsigned long size) { bootmem_data_t *bdata;
list_for_each_entry(bdata, &bdata_list, list) { unsigned long remainder;
if (addr < bdata->node_boot_start) continue;
remainder = PFN_DOWN(addr + size) - bdata->node_low_pfn;
if (remainder <= 0) { free_bootmem_core(bdata, addr, size); return; }
size -= PFN_PHYS(remainder); free_bootmem_core(bdata, addr, size); addr = PFN_PHYS(bdata->node_low_pfn + 1); } }
| |