diff options
author | Nikunj A Dadhania <nikunj@linux.vnet.ibm.com> | 2016-05-09 16:43:37 +0530 |
---|---|---|
committer | Alexey Kardashevskiy <aik@ozlabs.ru> | 2016-05-19 13:53:32 +1000 |
commit | b6c46e72f2a76a23ae86e24b3c6531b9e8fdc659 (patch) | |
tree | 2d22eafaf275bcc270b9ce5d21e468ea5dacb4bb /lib | |
parent | 29eb8e25cf0cb9f584bb95e8619e43375be71448 (diff) | |
download | SLOF-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')
-rw-r--r-- | lib/libnvram/nvram.c | 11 |
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); } |