Skip to content

Commit 3033b84

Browse files
author
Ard Biesheuvel
committed
arm64/efi: remove free_boot_services() and friends
Now that we are calling SetVirtualAddressMap() from the stub, there is no need to reserve boot-only memory regions, which implies that there is also no reason to free them again later. Acked-by: Leif Lindholm <[email protected]> Acked-by: Will Deacon <[email protected]> Tested-by: Leif Lindholm <[email protected]> Signed-off-by: Ard Biesheuvel <[email protected]>
1 parent f3cdfd2 commit 3033b84

File tree

1 file changed

+1
-122
lines changed

1 file changed

+1
-122
lines changed

arch/arm64/kernel/efi.c

Lines changed: 1 addition & 122 deletions
Original file line numberDiff line numberDiff line change
@@ -199,9 +199,7 @@ static __init void reserve_regions(void)
199199
if (is_normal_ram(md))
200200
early_init_dt_add_memory_arch(paddr, size);
201201

202-
if (is_reserve_region(md) ||
203-
md->type == EFI_BOOT_SERVICES_CODE ||
204-
md->type == EFI_BOOT_SERVICES_DATA) {
202+
if (is_reserve_region(md)) {
205203
memblock_reserve(paddr, size);
206204
if (uefi_debug)
207205
pr_cont("*");
@@ -214,123 +212,6 @@ static __init void reserve_regions(void)
214212
set_bit(EFI_MEMMAP, &efi.flags);
215213
}
216214

217-
218-
static u64 __init free_one_region(u64 start, u64 end)
219-
{
220-
u64 size = end - start;
221-
222-
if (uefi_debug)
223-
pr_info(" EFI freeing: 0x%012llx-0x%012llx\n", start, end - 1);
224-
225-
free_bootmem_late(start, size);
226-
return size;
227-
}
228-
229-
static u64 __init free_region(u64 start, u64 end)
230-
{
231-
u64 map_start, map_end, total = 0;
232-
233-
if (end <= start)
234-
return total;
235-
236-
map_start = (u64)memmap.phys_map;
237-
map_end = PAGE_ALIGN(map_start + (memmap.map_end - memmap.map));
238-
map_start &= PAGE_MASK;
239-
240-
if (start < map_end && end > map_start) {
241-
/* region overlaps UEFI memmap */
242-
if (start < map_start)
243-
total += free_one_region(start, map_start);
244-
245-
if (map_end < end)
246-
total += free_one_region(map_end, end);
247-
} else
248-
total += free_one_region(start, end);
249-
250-
return total;
251-
}
252-
253-
static void __init free_boot_services(void)
254-
{
255-
u64 total_freed = 0;
256-
u64 keep_end, free_start, free_end;
257-
efi_memory_desc_t *md;
258-
259-
/*
260-
* If kernel uses larger pages than UEFI, we have to be careful
261-
* not to inadvertantly free memory we want to keep if there is
262-
* overlap at the kernel page size alignment. We do not want to
263-
* free is_reserve_region() memory nor the UEFI memmap itself.
264-
*
265-
* The memory map is sorted, so we keep track of the end of
266-
* any previous region we want to keep, remember any region
267-
* we want to free and defer freeing it until we encounter
268-
* the next region we want to keep. This way, before freeing
269-
* it, we can clip it as needed to avoid freeing memory we
270-
* want to keep for UEFI.
271-
*/
272-
273-
keep_end = 0;
274-
free_start = 0;
275-
276-
for_each_efi_memory_desc(&memmap, md) {
277-
u64 paddr, npages, size;
278-
279-
if (is_reserve_region(md)) {
280-
/*
281-
* We don't want to free any memory from this region.
282-
*/
283-
if (free_start) {
284-
/* adjust free_end then free region */
285-
if (free_end > md->phys_addr)
286-
free_end -= PAGE_SIZE;
287-
total_freed += free_region(free_start, free_end);
288-
free_start = 0;
289-
}
290-
keep_end = md->phys_addr + (md->num_pages << EFI_PAGE_SHIFT);
291-
continue;
292-
}
293-
294-
if (md->type != EFI_BOOT_SERVICES_CODE &&
295-
md->type != EFI_BOOT_SERVICES_DATA) {
296-
/* no need to free this region */
297-
continue;
298-
}
299-
300-
/*
301-
* We want to free memory from this region.
302-
*/
303-
paddr = md->phys_addr;
304-
npages = md->num_pages;
305-
memrange_efi_to_native(&paddr, &npages);
306-
size = npages << PAGE_SHIFT;
307-
308-
if (free_start) {
309-
if (paddr <= free_end)
310-
free_end = paddr + size;
311-
else {
312-
total_freed += free_region(free_start, free_end);
313-
free_start = paddr;
314-
free_end = paddr + size;
315-
}
316-
} else {
317-
free_start = paddr;
318-
free_end = paddr + size;
319-
}
320-
if (free_start < keep_end) {
321-
free_start += PAGE_SIZE;
322-
if (free_start >= free_end)
323-
free_start = 0;
324-
}
325-
}
326-
if (free_start)
327-
total_freed += free_region(free_start, free_end);
328-
329-
if (total_freed)
330-
pr_info("Freed 0x%llx bytes of EFI boot services memory",
331-
total_freed);
332-
}
333-
334215
void __init efi_init(void)
335216
{
336217
struct efi_fdt_params params;
@@ -402,8 +283,6 @@ static int __init arm64_enable_runtime_services(void)
402283
}
403284
set_bit(EFI_SYSTEM_TABLES, &efi.flags);
404285

405-
free_boot_services();
406-
407286
if (!efi_enabled(EFI_VIRTMAP)) {
408287
pr_err("No UEFI virtual mapping was installed -- runtime services will not be available\n");
409288
return -1;

0 commit comments

Comments
 (0)