phys_addr_t __init memblock_alloc_nid(phys_addr_t size, phys_addr_t align, int nid) { struct memblock_type *mem = &memblock.memory; int i; BUG_ON(0 == size); /* We align the size to limit fragmentation. Without this, a lot of * small allocs quickly eat up the whole reserve array on sparc */ size = memblock_align_up(size, align); /* We do a bottom-up search for a region with the right * nid since that's easier considering how memblock_nid_range() * works */ for (i = 0; i < mem->cnt; i++) { phys_addr_t ret = memblock_alloc_nid_region(&mem->regions[i], size, align, nid); if (ret != MEMBLOCK_ERROR) return ret; } return 0; }
u64 __init memblock_alloc_nid(u64 size, u64 align, int nid, u64 (*nid_range)(u64 start, u64 end, int *nid)) { struct memblock_region *mem = &memblock.memory; int i; BUG_ON(0 == size); size = memblock_align_up(size, align); for (i = 0; i < mem->cnt; i++) { u64 ret = memblock_alloc_nid_region(&mem->region[i], nid_range, size, align, nid); if (ret != ~(u64)0) return ret; } return memblock_alloc(size, align); }