Skip to content

Commit

Permalink
efi/esrt: Use efi_mem_reserve() and avoid a kmalloc()
Browse files Browse the repository at this point in the history
We can use the new efi_mem_reserve() API to mark the ESRT table as
reserved forever and save ourselves the trouble of copying the data
out into a kmalloc buffer.

The added advantage is that now the ESRT driver will work across
kexec reboot.

Tested-by: Dave Young <[email protected]> [kexec/kdump]
Tested-by: Ard Biesheuvel <[email protected]> [arm]
Acked-by: Ard Biesheuvel <[email protected]>
Cc: Leif Lindholm <[email protected]>
Cc: Peter Jones <[email protected]>
Cc: Borislav Petkov <[email protected]>
Cc: Mark Rutland <[email protected]>
Signed-off-by: Matt Fleming <[email protected]>
  • Loading branch information
mfleming committed Sep 9, 2016
1 parent 31ce8cc commit 8e80632
Showing 1 changed file with 4 additions and 16 deletions.
20 changes: 4 additions & 16 deletions drivers/firmware/efi/esrt.c
Original file line number Diff line number Diff line change
Expand Up @@ -235,7 +235,7 @@ static struct attribute_group esrt_attr_group = {
};

/*
* remap the table, copy it to kmalloced pages, and unmap it.
* remap the table, validate it, mark it reserved and unmap it.
*/
void __init efi_esrt_init(void)
{
Expand Down Expand Up @@ -335,7 +335,7 @@ void __init efi_esrt_init(void)

end = esrt_data + size;
pr_info("Reserving ESRT space from %pa to %pa.\n", &esrt_data, &end);
memblock_reserve(esrt_data, esrt_data_size);
efi_mem_reserve(esrt_data, esrt_data_size);

pr_debug("esrt-init: loaded.\n");
err_memunmap:
Expand Down Expand Up @@ -382,28 +382,18 @@ static void cleanup_entry_list(void)
static int __init esrt_sysfs_init(void)
{
int error;
struct efi_system_resource_table __iomem *ioesrt;

pr_debug("esrt-sysfs: loading.\n");
if (!esrt_data || !esrt_data_size)
return -ENOSYS;

ioesrt = ioremap(esrt_data, esrt_data_size);
if (!ioesrt) {
esrt = ioremap(esrt_data, esrt_data_size);
if (!esrt) {
pr_err("ioremap(%pa, %zu) failed.\n", &esrt_data,
esrt_data_size);
return -ENOMEM;
}

esrt = kmalloc(esrt_data_size, GFP_KERNEL);
if (!esrt) {
pr_err("kmalloc failed. (wanted %zu bytes)\n", esrt_data_size);
iounmap(ioesrt);
return -ENOMEM;
}

memcpy_fromio(esrt, ioesrt, esrt_data_size);

esrt_kobj = kobject_create_and_add("esrt", efi_kobj);
if (!esrt_kobj) {
pr_err("Firmware table registration failed.\n");
Expand All @@ -429,8 +419,6 @@ static int __init esrt_sysfs_init(void)
if (error)
goto err_cleanup_list;

memblock_remove(esrt_data, esrt_data_size);

pr_debug("esrt-sysfs: loaded.\n");

return 0;
Expand Down

0 comments on commit 8e80632

Please sign in to comment.