bootmem_data_t *ent;
ent = list_entry(iter, bootmem_data_t, list);
- if (bdata->node_boot_start < ent->node_boot_start)
+ if (bdata->node_min_pfn < ent->node_min_pfn)
break;
}
list_add_tail(&bdata->list, iter);
mminit_validate_memmodel_limits(&start, &end);
bdata->node_bootmem_map = phys_to_virt(PFN_PHYS(mapstart));
- bdata->node_boot_start = PFN_PHYS(start);
+ bdata->node_min_pfn = start;
bdata->node_low_pfn = end;
link_bootmem(bdata);
if (!bdata->node_bootmem_map)
return 0;
- start = PFN_DOWN(bdata->node_boot_start);
+ start = bdata->node_min_pfn;
end = bdata->node_low_pfn;
/*
unsigned long *map, idx, vec;
map = bdata->node_bootmem_map;
- idx = start - PFN_DOWN(bdata->node_boot_start);
+ idx = start - bdata->node_min_pfn;
vec = ~map[idx / BITS_PER_LONG];
if (aligned && vec == ~0UL && start + BITS_PER_LONG < end) {
}
page = virt_to_page(bdata->node_bootmem_map);
- pages = bdata->node_low_pfn - PFN_DOWN(bdata->node_boot_start);
+ pages = bdata->node_low_pfn - bdata->node_min_pfn;
pages = bootmem_bootmap_pages(pages);
count += pages;
while (pages--)
unsigned long idx;
bdebug("nid=%td start=%lx end=%lx\n", bdata - bootmem_node_data,
- sidx + PFN_DOWN(bdata->node_boot_start),
- eidx + PFN_DOWN(bdata->node_boot_start));
+ sidx + bdata->node_min_pfn,
+ eidx + bdata->node_min_pfn);
if (bdata->hint_idx > sidx)
bdata->hint_idx = sidx;
bdebug("nid=%td start=%lx end=%lx flags=%x\n",
bdata - bootmem_node_data,
- sidx + PFN_DOWN(bdata->node_boot_start),
- eidx + PFN_DOWN(bdata->node_boot_start),
+ sidx + bdata->node_min_pfn,
+ eidx + bdata->node_min_pfn,
flags);
for (idx = sidx; idx < eidx; idx++)
return -EBUSY;
}
bdebug("silent double reserve of PFN %lx\n",
- idx + PFN_DOWN(bdata->node_boot_start));
+ idx + bdata->node_min_pfn);
}
return 0;
}
bdebug("nid=%td start=%lx end=%lx reserve=%d flags=%x\n",
bdata - bootmem_node_data, start, end, reserve, flags);
- BUG_ON(start < PFN_DOWN(bdata->node_boot_start));
+ BUG_ON(start < bdata->node_min_pfn);
BUG_ON(end > bdata->node_low_pfn);
- sidx = start - PFN_DOWN(bdata->node_boot_start);
- eidx = end - PFN_DOWN(bdata->node_boot_start);
+ sidx = start - bdata->node_min_pfn;
+ eidx = end - bdata->node_min_pfn;
if (reserve)
return __reserve(bdata, sidx, eidx, flags);
int err;
unsigned long max;
- if (pos < PFN_DOWN(bdata->node_boot_start)) {
+ if (pos < bdata->node_min_pfn ||
+ pos >= bdata->node_low_pfn) {
BUG_ON(pos != start);
continue;
}
bdata - bootmem_node_data, size, PAGE_ALIGN(size) >> PAGE_SHIFT,
align, goal, limit);
- min = PFN_DOWN(bdata->node_boot_start);
+ min = bdata->node_min_pfn;
max = bdata->node_low_pfn;
goal >>= PAGE_SHIFT;
else
start = ALIGN(min, step);
- sidx = start - PFN_DOWN(bdata->node_boot_start);
- midx = max - PFN_DOWN(bdata->node_boot_start);
+ sidx = start - bdata->node_min_pfn;;
+ midx = max - bdata->node_min_pfn;
if (bdata->hint_idx > sidx) {
/*
goto find_block;
}
- if (bdata->last_end_off &&
+ if (bdata->last_end_off & (PAGE_SIZE - 1) &&
PFN_DOWN(bdata->last_end_off) + 1 == sidx)
start_off = ALIGN(bdata->last_end_off, align);
else
PFN_UP(end_off), BOOTMEM_EXCLUSIVE))
BUG();
- region = phys_to_virt(bdata->node_boot_start + start_off);
+ region = phys_to_virt(PFN_PHYS(bdata->node_min_pfn) +
+ start_off);
memset(region, 0, size);
return region;
}
if (goal && bdata->node_low_pfn <= PFN_DOWN(goal))
continue;
- if (limit && bdata->node_boot_start >= limit)
+ if (limit && bdata->node_min_pfn >= PFN_DOWN(limit))
break;
region = alloc_bootmem_core(bdata, size, align, goal, limit);
void * __init alloc_bootmem_section(unsigned long size,
unsigned long section_nr)
{
- void *ptr;
- unsigned long limit, goal, start_nr, end_nr, pfn;
- struct pglist_data *pgdat;
+ bootmem_data_t *bdata;
+ unsigned long pfn, goal, limit;
pfn = section_nr_to_pfn(section_nr);
- goal = PFN_PHYS(pfn);
- limit = PFN_PHYS(section_nr_to_pfn(section_nr + 1)) - 1;
- pgdat = NODE_DATA(early_pfn_to_nid(pfn));
- ptr = alloc_bootmem_core(pgdat->bdata, size, SMP_CACHE_BYTES, goal,
- limit);
-
- if (!ptr)
- return NULL;
-
- start_nr = pfn_to_section_nr(PFN_DOWN(__pa(ptr)));
- end_nr = pfn_to_section_nr(PFN_DOWN(__pa(ptr) + size));
- if (start_nr != section_nr || end_nr != section_nr) {
- printk(KERN_WARNING "alloc_bootmem failed on section %ld.\n",
- section_nr);
- free_bootmem_node(pgdat, __pa(ptr), size);
- ptr = NULL;
- }
+ goal = pfn << PAGE_SHIFT;
+ limit = section_nr_to_pfn(section_nr + 1) << PAGE_SHIFT;
+ bdata = &bootmem_node_data[early_pfn_to_nid(pfn)];
- return ptr;
+ return alloc_bootmem_core(bdata, size, SMP_CACHE_BYTES, goal, limit);
}
#endif