Message ID | 20200617082505.1159131-1-ardb@kernel.org (mailing list archive) |
---|---|
State | Mainlined, archived |
Headers | show |
Series | ACPI: avoid relocations for table signature array | expand |
On Wednesday, June 17, 2020 10:25:05 AM CEST Ard Biesheuvel wrote: > On architectures that implement KASLR using the ELF native RELA relocation > format (such as arm64), every absolute reference in the code incurs an > overhead of 24 bytes in the .rela section. So storing a 41 element array > of 4 character signature strings using an array of pointer-to-char incurs > an 8x overhead (32 bytes per entry => ~1500 bytes), and given the fixed > length of the entries, and the fact that the array is only used locally, > it is much better to use an array of arrays here, which gets rid of the > overhead entirely. > > While at it, make it __initconst, as it is never referenced except from > __init code. > > Signed-off-by: Ard Biesheuvel <ardb@kernel.org> > --- > drivers/acpi/tables.c | 8 ++++---- > 1 file changed, 4 insertions(+), 4 deletions(-) > > diff --git a/drivers/acpi/tables.c b/drivers/acpi/tables.c > index 0e905c3d1645..ada36bc40c2b 100644 > --- a/drivers/acpi/tables.c > +++ b/drivers/acpi/tables.c > @@ -490,7 +490,7 @@ static u8 __init acpi_table_checksum(u8 *buffer, u32 length) > } > > /* All but ACPI_SIG_RSDP and ACPI_SIG_FACS: */ > -static const char * const table_sigs[] = { > +static const char table_sigs[][ACPI_NAMESEG_SIZE] __initconst = { > ACPI_SIG_BERT, ACPI_SIG_BGRT, ACPI_SIG_CPEP, ACPI_SIG_ECDT, > ACPI_SIG_EINJ, ACPI_SIG_ERST, ACPI_SIG_HEST, ACPI_SIG_MADT, > ACPI_SIG_MSCT, ACPI_SIG_SBST, ACPI_SIG_SLIT, ACPI_SIG_SRAT, > @@ -501,7 +501,7 @@ static const char * const table_sigs[] = { > ACPI_SIG_WDDT, ACPI_SIG_WDRT, ACPI_SIG_DSDT, ACPI_SIG_FADT, > ACPI_SIG_PSDT, ACPI_SIG_RSDT, ACPI_SIG_XSDT, ACPI_SIG_SSDT, > ACPI_SIG_IORT, ACPI_SIG_NFIT, ACPI_SIG_HMAT, ACPI_SIG_PPTT, > - ACPI_SIG_NHLT, NULL }; > + ACPI_SIG_NHLT }; > > #define ACPI_HEADER_SIZE sizeof(struct acpi_table_header) > > @@ -548,11 +548,11 @@ void __init acpi_table_upgrade(void) > > table = file.data; > > - for (sig = 0; table_sigs[sig]; sig++) > + for (sig = 0; sig < ARRAY_SIZE(table_sigs); sig++) > if (!memcmp(table->signature, table_sigs[sig], 4)) > break; > > - if (!table_sigs[sig]) { > + if (sig >= ARRAY_SIZE(table_sigs)) { > pr_err("ACPI OVERRIDE: Unknown signature [%s%s]\n", > cpio_path, file.name); > continue; > Applied as 5.9 material, thanks!
diff --git a/drivers/acpi/tables.c b/drivers/acpi/tables.c index 0e905c3d1645..ada36bc40c2b 100644 --- a/drivers/acpi/tables.c +++ b/drivers/acpi/tables.c @@ -490,7 +490,7 @@ static u8 __init acpi_table_checksum(u8 *buffer, u32 length) } /* All but ACPI_SIG_RSDP and ACPI_SIG_FACS: */ -static const char * const table_sigs[] = { +static const char table_sigs[][ACPI_NAMESEG_SIZE] __initconst = { ACPI_SIG_BERT, ACPI_SIG_BGRT, ACPI_SIG_CPEP, ACPI_SIG_ECDT, ACPI_SIG_EINJ, ACPI_SIG_ERST, ACPI_SIG_HEST, ACPI_SIG_MADT, ACPI_SIG_MSCT, ACPI_SIG_SBST, ACPI_SIG_SLIT, ACPI_SIG_SRAT, @@ -501,7 +501,7 @@ static const char * const table_sigs[] = { ACPI_SIG_WDDT, ACPI_SIG_WDRT, ACPI_SIG_DSDT, ACPI_SIG_FADT, ACPI_SIG_PSDT, ACPI_SIG_RSDT, ACPI_SIG_XSDT, ACPI_SIG_SSDT, ACPI_SIG_IORT, ACPI_SIG_NFIT, ACPI_SIG_HMAT, ACPI_SIG_PPTT, - ACPI_SIG_NHLT, NULL }; + ACPI_SIG_NHLT }; #define ACPI_HEADER_SIZE sizeof(struct acpi_table_header) @@ -548,11 +548,11 @@ void __init acpi_table_upgrade(void) table = file.data; - for (sig = 0; table_sigs[sig]; sig++) + for (sig = 0; sig < ARRAY_SIZE(table_sigs); sig++) if (!memcmp(table->signature, table_sigs[sig], 4)) break; - if (!table_sigs[sig]) { + if (sig >= ARRAY_SIZE(table_sigs)) { pr_err("ACPI OVERRIDE: Unknown signature [%s%s]\n", cpio_path, file.name); continue;
On architectures that implement KASLR using the ELF native RELA relocation format (such as arm64), every absolute reference in the code incurs an overhead of 24 bytes in the .rela section. So storing a 41 element array of 4 character signature strings using an array of pointer-to-char incurs an 8x overhead (32 bytes per entry => ~1500 bytes), and given the fixed length of the entries, and the fact that the array is only used locally, it is much better to use an array of arrays here, which gets rid of the overhead entirely. While at it, make it __initconst, as it is never referenced except from __init code. Signed-off-by: Ard Biesheuvel <ardb@kernel.org> --- drivers/acpi/tables.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)