From ad70fe682980c82f7e71d8680a1c09f629f9dbdf Mon Sep 17 00:00:00 2001 From: Zane Shelley Date: Thu, 8 May 2014 22:01:16 -0500 Subject: PRD: TPS bugs Change-Id: I0afbac0b0c985d2efc74d9ad4c99b7d2cbb6c572 CQ: SW260816 Backport: release-fips810 Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/11033 Tested-by: Jenkins Server Reviewed-by: Zane Shelley Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/11058 Reviewed-by: A. Patrick Williams III --- .../diag/prdf/common/plat/pegasus/prdfCenMbaCeTable.C | 14 +++++++++++--- .../common/plat/pegasus/prdfCenMbaTdCtlr_common.H | 1 + src/usr/diag/prdf/common/plat/prdfLineDelete.C | 19 ++++++++++++++++++- src/usr/diag/prdf/common/plat/prdfLineDelete.H | 13 ++++++++++++- src/usr/diag/prdf/common/util/UtilSMap.H | 1 - 5 files changed, 42 insertions(+), 6 deletions(-) (limited to 'src/usr') diff --git a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaCeTable.C b/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaCeTable.C index 3dfe9b263..539df11ab 100644 --- a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaCeTable.C +++ b/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaCeTable.C @@ -58,8 +58,10 @@ bool CenMbaCeTable::addEntry( const CenAddr & i_addr, CeTable::iterator it = std::find( iv_table.begin(), iv_table.end(), data ); if ( iv_table.end() != it ) { - // Update the count - data.count = it->count + 1; + // Update the count only if the entry is active. Otherwise, use the + // reset count from the contructor. + if ( it->active ) + data.count = it->count + 1; // Update the DRAM pins data.dramPins |= it->dramPins; @@ -89,7 +91,7 @@ bool CenMbaCeTable::addEntry( const CenAddr & i_addr, for ( CeTable::iterator it = iv_table.begin(); it != iv_table.end(); it++ ) { - if ( it->addr.getRank() == thisRank ) + if ( it->active && (it->addr.getRank() == thisRank) ) rankCount++; } @@ -131,6 +133,9 @@ bool CenMbaCeTable::addEntry( const CenAddr & i_addr, void CenMbaCeTable::deactivateAll() { + // NOTE: We don't want to reset the count here because it will be used for + // FFDC. Instead the count will be reset in addEntry() if the entry is + // not active. for ( CeTable::iterator it = iv_table.begin(); it != iv_table.end(); it++ ) it->active = false; } @@ -139,6 +144,9 @@ void CenMbaCeTable::deactivateAll() void CenMbaCeTable::deactivateRank( const CenRank & i_rank ) { + // NOTE: We don't want to reset the count here because it will be used for + // FFDC. Instead the count will be reset in addEntry() if the entry is + // not active. for ( CeTable::iterator it = iv_table.begin(); it != iv_table.end(); it++ ) { if ( it->addr.getRank() == i_rank ) diff --git a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaTdCtlr_common.H b/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaTdCtlr_common.H index a111ab26b..1b5d548ef 100644 --- a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaTdCtlr_common.H +++ b/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaTdCtlr_common.H @@ -98,6 +98,7 @@ class CenMbaTdCtlrCommon enum StopConditions { COND_TARGETED_CMD = + mss_MaintCmd::STOP_ON_RETRY_CE_ETE | mss_MaintCmd::STOP_ON_END_ADDRESS | mss_MaintCmd::ENABLE_CMD_COMPLETE_ATTENTION, diff --git a/src/usr/diag/prdf/common/plat/prdfLineDelete.C b/src/usr/diag/prdf/common/plat/prdfLineDelete.C index 35c622d5a..6ea383fec 100755 --- a/src/usr/diag/prdf/common/plat/prdfLineDelete.C +++ b/src/usr/diag/prdf/common/plat/prdfLineDelete.C @@ -5,7 +5,7 @@ /* */ /* IBM CONFIDENTIAL */ /* */ -/* COPYRIGHT International Business Machines Corp. 2005,2013 */ +/* COPYRIGHT International Business Machines Corp. 2005,2014 */ /* */ /* p1 */ /* */ @@ -63,6 +63,23 @@ namespace LineDelete return ( iv_thPolicy.threshold <= count ); } + bool PrdfCacheCETable::addrThReached( PrdfCacheAddress i_addr, + STEP_CODE_DATA_STRUCT & i_sdc ) + { + bool o_reached = false; + + if ( cv_flushTimerInited && !isIntervalElapsed(i_sdc) ) + { + uint32_t * count = cv_ceTable.find( i_addr ); + if ( NULL != count ) + { + o_reached = ( iv_thPolicy.threshold <= *count ); + } + } + + return o_reached; + } + /* PrdfCacheCETable::isIntervalElapsed() */ bool PrdfCacheCETable::isIntervalElapsed( STEP_CODE_DATA_STRUCT & i_sdc ) diff --git a/src/usr/diag/prdf/common/plat/prdfLineDelete.H b/src/usr/diag/prdf/common/plat/prdfLineDelete.H index 635c058be..ba8527f9f 100755 --- a/src/usr/diag/prdf/common/plat/prdfLineDelete.H +++ b/src/usr/diag/prdf/common/plat/prdfLineDelete.H @@ -5,7 +5,7 @@ /* */ /* IBM CONFIDENTIAL */ /* */ -/* COPYRIGHT International Business Machines Corp. 2005,2013 */ +/* COPYRIGHT International Business Machines Corp. 2005,2014 */ /* */ /* p1 */ /* */ @@ -116,6 +116,17 @@ namespace LineDelete */ bool addAddress(PrdfCacheAddress, STEP_CODE_DATA_STRUCT &); + /** + * @brief Checks if the threshold had been reached for the given + * address. + * @param i_addr The CE address. + * @param i_sdc The Service Data Collector. + * @return TRUE if threshold has been reached and time interval has not + * elapsed, FALSE otherwise. + */ + bool addrThReached( PrdfCacheAddress i_addr, + STEP_CODE_DATA_STRUCT & i_sdc ); + /** @fn PrdfCacheCETable::isIntervalElapsed() * @param STEP_CODE_DATA_STRUCT & i_sdc * @return TRUE if the interval time has elapsed. diff --git a/src/usr/diag/prdf/common/util/UtilSMap.H b/src/usr/diag/prdf/common/util/UtilSMap.H index a5da03c8d..7c7e867df 100755 --- a/src/usr/diag/prdf/common/util/UtilSMap.H +++ b/src/usr/diag/prdf/common/util/UtilSMap.H @@ -196,7 +196,6 @@ class UtilSMap } }; - private: data_type * find(const key_type & k) { if (NULL == iv_memblock) -- cgit v1.2.1