diff options
-rw-r--r-- | mm/nobootmem.c | 25 |
1 files changed, 8 insertions, 17 deletions
diff --git a/mm/nobootmem.c b/mm/nobootmem.c index 61107cf55bb3..2c254d374655 100644 --- a/mm/nobootmem.c +++ b/mm/nobootmem.c | |||
@@ -82,27 +82,18 @@ void __init free_bootmem_late(unsigned long addr, unsigned long size) | |||
82 | 82 | ||
83 | static void __init __free_pages_memory(unsigned long start, unsigned long end) | 83 | static void __init __free_pages_memory(unsigned long start, unsigned long end) |
84 | { | 84 | { |
85 | unsigned long i, start_aligned, end_aligned; | 85 | int order; |
86 | int order = ilog2(BITS_PER_LONG); | ||
87 | 86 | ||
88 | start_aligned = (start + (BITS_PER_LONG - 1)) & ~(BITS_PER_LONG - 1); | 87 | while (start < end) { |
89 | end_aligned = end & ~(BITS_PER_LONG - 1); | 88 | order = min(MAX_ORDER - 1UL, __ffs(start)); |
90 | 89 | ||
91 | if (end_aligned <= start_aligned) { | 90 | while (start + (1UL << order) > end) |
92 | for (i = start; i < end; i++) | 91 | order--; |
93 | __free_pages_bootmem(pfn_to_page(i), 0); | ||
94 | 92 | ||
95 | return; | 93 | __free_pages_bootmem(pfn_to_page(start), order); |
96 | } | ||
97 | |||
98 | for (i = start; i < start_aligned; i++) | ||
99 | __free_pages_bootmem(pfn_to_page(i), 0); | ||
100 | 94 | ||
101 | for (i = start_aligned; i < end_aligned; i += BITS_PER_LONG) | 95 | start += (1UL << order); |
102 | __free_pages_bootmem(pfn_to_page(i), order); | 96 | } |
103 | |||
104 | for (i = end_aligned; i < end; i++) | ||
105 | __free_pages_bootmem(pfn_to_page(i), 0); | ||
106 | } | 97 | } |
107 | 98 | ||
108 | static unsigned long __init __free_memory_core(phys_addr_t start, | 99 | static unsigned long __init __free_memory_core(phys_addr_t start, |