The free_bootmem_late and memblock_free_late do exactly the same thing: they iterate over a range and give pages to the page allocator. Replace calls to free_bootmem_late with calls to memblock_free_late and remove the bootmem variant.
Unified · Split
| @@ -12,6 +12,7 @@ · 11 unmodified lines | |||
| 12 | #include <linux/mm.h> | 12 | #include <linux/mm.h> |
| 13 | #include <linux/miscdevice.h> | 13 | #include <linux/miscdevice.h> |
| 14 | #include <linux/bootmem.h> | 14 | #include <linux/bootmem.h> |
| 15 | #include <linux/memblock.h> | ||
| 15 | #include <linux/export.h> | 16 | #include <linux/export.h> |
| 16 | #include <linux/refcount.h> | 17 | #include <linux/refcount.h> |
| 17 | 18 | ||
| @@ -190,7 +191,7 @@ static void __init mdesc_memblock_free(struct mdesc_handle *hp) · 172 unmodified lines | |||
| 190 | 191 | ||
| 191 | alloc_size = PAGE_ALIGN(hp->handle_size); | 192 | alloc_size = PAGE_ALIGN(hp->handle_size); |
| 192 | start = __pa(hp); | 193 | start = __pa(hp); |
| 193 | free_bootmem_late(start, alloc_size); | 194 | memblock_free_late(start, alloc_size); |
| 194 | } | 195 | } |
| 195 | 196 | ||
| 196 | static struct mdesc_mem_ops memblock_mdesc_ops = { | 197 | static struct mdesc_mem_ops memblock_mdesc_ops = { |
| @@ -333,7 +333,7 @@ void __init efi_reserve_boot_services(void) · 332 unmodified lines | |||
| 333 | 333 | ||
| 334 | /* | 334 | /* |
| 335 | * Because the following memblock_reserve() is paired | 335 | * Because the following memblock_reserve() is paired |
| 336 | * with free_bootmem_late() for this region in | 336 | * with memblock_free_late() for this region in |
| 337 | * efi_free_boot_services(), we must be extremely | 337 | * efi_free_boot_services(), we must be extremely |
| 338 | * careful not to reserve, and subsequently free, | 338 | * careful not to reserve, and subsequently free, |
| 339 | * critical regions of memory (like the kernel image) or | 339 | * critical regions of memory (like the kernel image) or |
| @@ -364,7 +364,7 @@ void __init efi_reserve_boot_services(void) · 24 unmodified lines | |||
| 364 | * doesn't make sense as far as the firmware is | 364 | * doesn't make sense as far as the firmware is |
| 365 | * concerned, but it does provide us with a way to tag | 365 | * concerned, but it does provide us with a way to tag |
| 366 | * those regions that must not be paired with | 366 | * those regions that must not be paired with |
| 367 | * free_bootmem_late(). | 367 | * memblock_free_late(). |
| 368 | */ | 368 | */ |
| 369 | md->attribute |= EFI_MEMORY_RUNTIME; | 369 | md->attribute |= EFI_MEMORY_RUNTIME; |
| 370 | } | 370 | } |
| @@ -414,7 +414,7 @@ void __init efi_free_boot_services(void) · 43 unmodified lines | |||
| 414 | size -= rm_size; | 414 | size -= rm_size; |
| 415 | } | 415 | } |
| 416 | 416 | ||
| 417 | free_bootmem_late(start, size); | 417 | memblock_free_late(start, size); |
| 418 | } | 418 | } |
| 419 | 419 | ||
| 420 | if (!num_entries) | 420 | if (!num_entries) |
| @@ -235,7 +235,7 @@ static int __init map_properties(void) · 234 unmodified lines | |||
| 235 | */ | 235 | */ |
| 236 | data->len = 0; | 236 | data->len = 0; |
| 237 | memunmap(data); | 237 | memunmap(data); |
| 238 | free_bootmem_late(pa_data + sizeof(*data), data_len); | 238 | memblock_free_late(pa_data + sizeof(*data), data_len); |
| 239 | 239 | ||
| 240 | return ret; | 240 | return ret; |
| 241 | } | 241 | } |
| @@ -30,8 +30,6 @@ extern unsigned long free_all_bootmem(void); · 29 unmodified lines | |||
| 30 | extern void reset_node_managed_pages(pg_data_t *pgdat); | 30 | extern void reset_node_managed_pages(pg_data_t *pgdat); |
| 31 | extern void reset_all_zones_managed_pages(void); | 31 | extern void reset_all_zones_managed_pages(void); |
| 32 | 32 | ||
| 33 | extern void free_bootmem_late(unsigned long physaddr, unsigned long size); | ||
| 34 | |||
| 35 | /* We are using top down, so it is safe to use 0 here */ | 33 | /* We are using top down, so it is safe to use 0 here */ |
| 36 | #define BOOTMEM_LOW_LIMIT 0 | 34 | #define BOOTMEM_LOW_LIMIT 0 |
| 37 | 35 | ||
| @@ -33,30 +33,6 @@ unsigned long min_low_pfn; · 32 unmodified lines | |||
| 33 | unsigned long max_pfn; | 33 | unsigned long max_pfn; |
| 34 | unsigned long long max_possible_pfn; | 34 | unsigned long long max_possible_pfn; |
| 35 | 35 | ||
| 36 | /** | ||
| 37 | * free_bootmem_late - free bootmem pages directly to page allocator | ||
| 38 | * @addr: starting address of the range | ||
| 39 | * @size: size of the range in bytes | ||
| 40 | * | ||
| 41 | * This is only useful when the bootmem allocator has already been torn | ||
| 42 | * down, but we are still initializing the system. Pages are given directly | ||
| 43 | * to the page allocator, no bootmem metadata is updated because it is gone. | ||
| 44 | */ | ||
| 45 | void __init free_bootmem_late(unsigned long addr, unsigned long size) | ||
| 46 | { | ||
| 47 | unsigned long cursor, end; | ||
| 48 | |||
| 49 | kmemleak_free_part_phys(addr, size); | ||
| 50 | |||
| 51 | cursor = PFN_UP(addr); | ||
| 52 | end = PFN_DOWN(addr + size); | ||
| 53 | |||
| 54 | for (; cursor < end; cursor++) { | ||
| 55 | __free_pages_bootmem(pfn_to_page(cursor), cursor, 0); | ||
| 56 | totalram_pages++; | ||
| 57 | } | ||
| 58 | } | ||
| 59 | |||
| 60 | static void __init __free_pages_memory(unsigned long start, unsigned long end) | 36 | static void __init __free_pages_memory(unsigned long start, unsigned long end) |
| 61 | { | 37 | { |
| 62 | int order; | 38 | int order; |