aboutsummaryrefslogtreecommitdiff
path: root/lib/libnvram
diff options
context:
space:
mode:
authorNikunj A Dadhania <nikunj@linux.vnet.ibm.com>2016-05-09 16:43:37 +0530
committerAlexey Kardashevskiy <aik@ozlabs.ru>2016-05-19 13:53:32 +1000
commitb6c46e72f2a76a23ae86e24b3c6531b9e8fdc659 (patch)
tree2d22eafaf275bcc270b9ce5d21e468ea5dacb4bb /lib/libnvram
parent29eb8e25cf0cb9f584bb95e8619e43375be71448 (diff)
downloadSLOF-b6c46e72f2a76a23ae86e24b3c6531b9e8fdc659.zip
SLOF-b6c46e72f2a76a23ae86e24b3c6531b9e8fdc659.tar.gz
SLOF-b6c46e72f2a76a23ae86e24b3c6531b9e8fdc659.tar.bz2
rtas-nvram: optimize erase
As this was done at byte granularity, erasing complete nvram(64K default) took a lot of time. To reduce the number of rtas call per byte write which is expensive, the erase is done at one shot using the nvram_buffer that is initiated during the nvram_init call for RTAS_NVRAM. After this patch there is ~450msec improvement during boot. Default qemu booting does not provide file backed nvram, so every boot there would be full erase of 64K. Before this patch: real 0m2.214s user 0m0.015s sys 0m0.006s real 0m2.222s user 0m0.014s sys 0m0.005s real 0m2.201s user 0m0.010s sys 0m0.005s After this patch: real 0m1.762s user 0m0.014s sys 0m0.006s real 0m1.773s user 0m0.011s sys 0m0.004s real 0m1.754s user 0m0.013s sys 0m0.005s Signed-off-by: Nikunj A Dadhania <nikunj@linux.vnet.ibm.com> Reviewed-by: Thomas Huth <thuth@redhat.com> Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
Diffstat (limited to 'lib/libnvram')
-rw-r--r--lib/libnvram/nvram.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/lib/libnvram/nvram.c b/lib/libnvram/nvram.c
index 473814e..99deb2a 100644
--- a/lib/libnvram/nvram.c
+++ b/lib/libnvram/nvram.c
@@ -373,6 +373,17 @@ void erase_nvram(int offset, int len)
{
int i;
+#ifdef RTAS_NVRAM
+ char *erase_buf = get_nvram_buffer(len);
+ if (erase_buf) {
+ /* Speed up by erasing all memory at once */
+ memset(erase_buf, 0, len);
+ nvram_store(offset, erase_buf, len);
+ free_nvram_buffer(erase_buf);
+ return;
+ }
+ /* If get_nvram_buffer failed, fall through to default code */
+#endif
for (i=offset; i<offset+len; i++)
nvram_write_byte(i, 0);
}