diff options
author | Dan Crowell <dcrowell@us.ibm.com> | 2019-02-07 15:21:19 -0600 |
---|---|---|
committer | Daniel M. Crowell <dcrowell@us.ibm.com> | 2019-02-22 10:01:26 -0600 |
commit | eba5c2ffe5ffb1f50966b7990e2f5f71f09105ce (patch) | |
tree | 528d700a0838bf326c5590776d21a6ca8902d3e6 /src | |
parent | 99f296373162b8996f92e1f1ffbdb977fe90cf12 (diff) | |
download | talos-hostboot-eba5c2ffe5ffb1f50966b7990e2f5f71f09105ce.tar.gz talos-hostboot-eba5c2ffe5ffb1f50966b7990e2f5f71f09105ce.zip |
Statically allocate work pages for PNOR Resource Provider
Any time the PNOR Resource Provider loads in a page that is ECC
protected it allocates 0x1200 bytes to hold the data while it
is decoded. Continuously allocating 2 pages from the heap leads
to a couple of potential issues:
- fragmentation of memory due to constant new/delete of pages
- extremely low memory situation could prevent new code from
paging in
The solution here is to place the working buffer inside the PNOR
RP class itself. This means we will only do a single allocation
of the memory early on in the boot and the memory is always
available.
Change-Id: I7faabb6be7cc89abdb8a8fb962e0623a2bcd5e99
Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/71546
Reviewed-by: Corey V. Swenson <cswenson@us.ibm.com>
Reviewed-by: Nicholas E. Bofferding <bofferdn@us.ibm.com>
Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com>
Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com>
Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com>
Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Reviewed-by: Michael Baiocchi <mbaiocch@us.ibm.com>
Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/usr/pnor/pnorrp.C | 23 | ||||
-rw-r--r-- | src/usr/pnor/pnorrp.H | 12 |
2 files changed, 15 insertions, 20 deletions
diff --git a/src/usr/pnor/pnorrp.C b/src/usr/pnor/pnorrp.C index c9a5e5336..af6ccf3fa 100644 --- a/src/usr/pnor/pnorrp.C +++ b/src/usr/pnor/pnorrp.C @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2011,2018 */ +/* Contributors Listed Below - COPYRIGHT 2011,2019 */ /* [+] Google Inc. */ /* [+] International Business Machines Corp. */ /* */ @@ -251,6 +251,7 @@ iv_TOC_used(TOC_0) ,iv_shutdown_pending(false) { TRACDCOMP(g_trac_pnor, "PnorRP::PnorRP> " ); + // setup everything in a separate function initDaemon(); @@ -1315,7 +1316,6 @@ errlHndl_t PnorRP::readFromDevice( uint64_t i_offset, { TRACUCOMP(g_trac_pnor, "PnorRP::readFromDevice> i_offset=0x%X, i_chip=%d", i_offset, i_chip ); errlHndl_t l_errhdl = NULL; - uint8_t* ecc_buffer = NULL; o_fatalError = 0; do @@ -1329,8 +1329,7 @@ errlHndl_t PnorRP::readFromDevice( uint64_t i_offset, // if we need to handle ECC we need to read more than 1 page if( i_ecc ) { - ecc_buffer = new uint8_t[PAGESIZE_PLUS_ECC](); - data_to_read = ecc_buffer; + data_to_read = iv_ecc_buffer; read_size = PAGESIZE_PLUS_ECC; } @@ -1408,11 +1407,6 @@ errlHndl_t PnorRP::readFromDevice( uint64_t i_offset, } } while(0); - if( ecc_buffer ) - { - delete[] ecc_buffer; - } - TRACUCOMP(g_trac_pnor, "< PnorRP::readFromDevice" ); return l_errhdl; } @@ -1427,7 +1421,6 @@ errlHndl_t PnorRP::writeToDevice( uint64_t i_offset, { TRACUCOMP(g_trac_pnor, "PnorRP::writeToDevice> i_offset=%X, i_chip=%d", i_offset, i_chip ); errlHndl_t l_errhdl = NULL; - uint8_t* ecc_buffer = NULL; do { @@ -1440,11 +1433,10 @@ errlHndl_t PnorRP::writeToDevice( uint64_t i_offset, // apply ECC to data if needed if( i_ecc ) { - ecc_buffer = new uint8_t[PAGESIZE_PLUS_ECC]; PNOR::ECC::injectECC( reinterpret_cast<uint8_t*>(i_src), PAGESIZE, - reinterpret_cast<uint8_t*>(ecc_buffer) ); - data_to_write = reinterpret_cast<void*>(ecc_buffer); + reinterpret_cast<uint8_t*>(iv_ecc_buffer) ); + data_to_write = reinterpret_cast<void*>(iv_ecc_buffer); write_size = PAGESIZE_PLUS_ECC; } @@ -1463,11 +1455,6 @@ errlHndl_t PnorRP::writeToDevice( uint64_t i_offset, } } while(0); - if( ecc_buffer ) - { - delete[] ecc_buffer; - } - TRACUCOMP(g_trac_pnor, "< PnorRP::writeToDevice" ); return l_errhdl; } diff --git a/src/usr/pnor/pnorrp.H b/src/usr/pnor/pnorrp.H index 9ab654678..1fe3c088c 100644 --- a/src/usr/pnor/pnorrp.H +++ b/src/usr/pnor/pnorrp.H @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2011,2018 */ +/* Contributors Listed Below - COPYRIGHT 2011,2019 */ /* [+] Google Inc. */ /* [+] International Business Machines Corp. */ /* */ @@ -35,6 +35,8 @@ #include "pnor_common.H" #include "ffs.h" #include <config.h> +#include "pnor_utils.H" + /** * PNOR Resource Provider */ @@ -189,7 +191,7 @@ class PnorRP /** * sent when a shutdown message is sent, used to elimnate further writes - * to pnore during a shutdown process + * to pnor during a shutdown process */ bool iv_shutdown_pending; @@ -200,6 +202,12 @@ class PnorRP std::map<uint64_t,FlashStats_t> iv_stats; /** + * Create a permanent buffer to handle ECC translations rather than + * constantly allocating new pages every time. This is always 2 pages. + */ + uint8_t iv_ecc_buffer[PNOR::PAGESIZE_PLUS_ECC]; + + /** * @brief Initialize the daemon, called by constructor */ void initDaemon(); |