aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/firmware/efi/fake_mem.c
diff options
context:
space:
mode:
authorDan Williams <dan.j.williams@intel.com>2020-01-13 18:22:43 +0100
committerIngo Molnar <mingo@kernel.org>2020-01-20 08:14:29 +0100
commit1db91035d01aa8bfa2350c00ccb63d629b4041ad (patch)
tree8e71bbf16648063805b4a959510cd45852733bf2 /drivers/firmware/efi/fake_mem.c
parentefi: Add a flags parameter to efi_memory_map (diff)
downloadlinux-dev-1db91035d01aa8bfa2350c00ccb63d629b4041ad.tar.xz
linux-dev-1db91035d01aa8bfa2350c00ccb63d629b4041ad.zip
efi: Add tracking for dynamically allocated memmaps
In preparation for fixing efi_memmap_alloc() leaks, add support for recording whether the memmap was dynamically allocated from slab, memblock, or is the original physical memmap provided by the platform. Given this tracking is established in efi_memmap_alloc() and needs to be carried to efi_memmap_install(), use 'struct efi_memory_map_data' to convey the flags. Some small cleanups result from this reorganization, specifically the removal of local variables for 'phys' and 'size' that are already tracked in @data. Signed-off-by: Dan Williams <dan.j.williams@intel.com> Signed-off-by: Ard Biesheuvel <ardb@kernel.org> Signed-off-by: Ingo Molnar <mingo@kernel.org> Link: https://lore.kernel.org/r/20200113172245.27925-12-ardb@kernel.org
Diffstat (limited to 'drivers/firmware/efi/fake_mem.c')
-rw-r--r--drivers/firmware/efi/fake_mem.c14
1 files changed, 6 insertions, 8 deletions
diff --git a/drivers/firmware/efi/fake_mem.c b/drivers/firmware/efi/fake_mem.c
index bb9fc70d0cfa..a8d20568d532 100644
--- a/drivers/firmware/efi/fake_mem.c
+++ b/drivers/firmware/efi/fake_mem.c
@@ -36,9 +36,9 @@ static int __init cmp_fake_mem(const void *x1, const void *x2)
void __init efi_fake_memmap(void)
{
+ struct efi_memory_map_data data = { 0 };
int new_nr_map = efi.memmap.nr_map;
efi_memory_desc_t *md;
- phys_addr_t new_memmap_phy;
void *new_memmap;
int i;
@@ -55,15 +55,13 @@ void __init efi_fake_memmap(void)
}
/* allocate memory for new EFI memmap */
- new_memmap_phy = efi_memmap_alloc(new_nr_map);
- if (!new_memmap_phy)
+ if (efi_memmap_alloc(new_nr_map, &data) != 0)
return;
/* create new EFI memmap */
- new_memmap = early_memremap(new_memmap_phy,
- efi.memmap.desc_size * new_nr_map);
+ new_memmap = early_memremap(data.phys_map, data.size);
if (!new_memmap) {
- memblock_free(new_memmap_phy, efi.memmap.desc_size * new_nr_map);
+ memblock_free(data.phys_map, data.size);
return;
}
@@ -71,9 +69,9 @@ void __init efi_fake_memmap(void)
efi_memmap_insert(&efi.memmap, new_memmap, &efi_fake_mems[i]);
/* swap into new EFI memmap */
- early_memunmap(new_memmap, efi.memmap.desc_size * new_nr_map);
+ early_memunmap(new_memmap, data.size);
- efi_memmap_install(new_memmap_phy, new_nr_map);
+ efi_memmap_install(&data);
/* print new EFI memmap */
efi_print_memmap();