Messages in this thread | | | Subject | Re: [PATCH v3 2/5] memblock: Improve memblock to support allocation from lower address. | From | Toshi Kani <> | Date | Fri, 13 Sep 2013 15:53:28 -0600 |
| |
On Fri, 2013-09-13 at 17:30 +0800, Tang Chen wrote: : > @@ -100,8 +180,7 @@ phys_addr_t __init_memblock memblock_find_in_range_node(phys_addr_t start, > phys_addr_t end, phys_addr_t size, > phys_addr_t align, int nid) > { > - phys_addr_t this_start, this_end, cand; > - u64 i; > + phys_addr_t ret; > > /* pump up @end */ > if (end == MEMBLOCK_ALLOC_ACCESSIBLE) > @@ -111,18 +190,22 @@ phys_addr_t __init_memblock memblock_find_in_range_node(phys_addr_t start, > start = max_t(phys_addr_t, start, PAGE_SIZE); > end = max(start, end); > > - for_each_free_mem_range_reverse(i, nid, &this_start, &this_end, NULL) { > - this_start = clamp(this_start, start, end); > - this_end = clamp(this_end, start, end); > + if (memblock_direction_bottom_up()) { > + /* > + * MEMBLOCK_ALLOC_ACCESSIBLE is 0, which is less than the end > + * of kernel image. So callers specify MEMBLOCK_ALLOC_ACCESSIBLE > + * as @start is OK. > + */ > + start = max(start, __pa_symbol(_end)); /* End of kernel image. */ > > - if (this_end < size) > - continue; > + ret = __memblock_find_range(start, end, size, align, nid); > + if (ret) > + return ret; > > - cand = round_down(this_end - size, align); > - if (cand >= this_start) > - return cand; > + pr_warn("memblock: Failed to allocate memory in bottom up direction. Now try top down direction.\n");
Is there any chance that this retry will succeed given that start and end are still the same?
Thanks, -Toshi
> } > - return 0; > + > + return __memblock_find_range_rev(start, end, size, align, nid); > } > > /**
| |