summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaCeTable.C14
-rw-r--r--src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaTdCtlr_common.H1
-rwxr-xr-xsrc/usr/diag/prdf/common/plat/prdfLineDelete.C19
-rwxr-xr-xsrc/usr/diag/prdf/common/plat/prdfLineDelete.H13
-rwxr-xr-xsrc/usr/diag/prdf/common/util/UtilSMap.H1
5 files changed, 42 insertions, 6 deletions
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)
OpenPOWER on IntegriCloud