@@ -61,8 +61,9 @@ FlexCounter::RifCounterIds::RifCounterIds(
61
61
62
62
FlexCounter::BufferPoolCounterIds::BufferPoolCounterIds (
63
63
_In_ sai_object_id_t bufferPool,
64
- _In_ const std::vector<sai_buffer_pool_stat_t > &bufferPoolIds):
65
- bufferPoolId(bufferPool), bufferPoolCounterIds(bufferPoolIds)
64
+ _In_ const std::vector<sai_buffer_pool_stat_t > &bufferPoolIds,
65
+ _In_ sai_stats_mode_t statsMode):
66
+ bufferPoolId(bufferPool), bufferPoolStatsMode(statsMode), bufferPoolCounterIds(bufferPoolIds)
66
67
{
67
68
SWSS_LOG_ENTER ();
68
69
}
@@ -463,14 +464,29 @@ void FlexCounter::setRifCounterList(
463
464
void FlexCounter::setBufferPoolCounterList (
464
465
_In_ sai_object_id_t bufferPoolVid,
465
466
_In_ sai_object_id_t bufferPoolId,
466
- _In_ std::string instanceId,
467
- _In_ const std::vector<sai_buffer_pool_stat_t > &counterIds)
467
+ _In_ const std::string &instanceId,
468
+ _In_ const std::vector<sai_buffer_pool_stat_t > &counterIds,
469
+ _In_ const std::string &statsMode)
468
470
{
469
471
SWSS_LOG_ENTER ();
470
472
471
473
FlexCounter &fc = getInstance (instanceId);
472
474
473
- fc.saiUpdateSupportedBufferPoolCounters (bufferPoolId, counterIds);
475
+ sai_stats_mode_t bufferPoolStatsMode = SAI_STATS_MODE_READ_AND_CLEAR;
476
+ if (statsMode == STATS_MODE_READ_AND_CLEAR)
477
+ {
478
+ bufferPoolStatsMode = SAI_STATS_MODE_READ_AND_CLEAR;
479
+ }
480
+ else if (statsMode == STATS_MODE_READ)
481
+ {
482
+ bufferPoolStatsMode = SAI_STATS_MODE_READ;
483
+ }
484
+ else
485
+ {
486
+ SWSS_LOG_WARN (" Stats mode %s not supported for flex counter. Using STATS_MODE_READ_AND_CLEAR" , statsMode.c_str ());
487
+ }
488
+
489
+ fc.saiUpdateSupportedBufferPoolCounters (bufferPoolId, counterIds, bufferPoolStatsMode);
474
490
475
491
// Filter unsupported counters
476
492
std::vector<sai_buffer_pool_stat_t > supportedIds;
@@ -504,7 +520,7 @@ void FlexCounter::setBufferPoolCounterList(
504
520
return ;
505
521
}
506
522
507
- auto bufferPoolCounterIds = std::make_shared<BufferPoolCounterIds>(bufferPoolId, supportedIds);
523
+ auto bufferPoolCounterIds = std::make_shared<BufferPoolCounterIds>(bufferPoolId, supportedIds, bufferPoolStatsMode );
508
524
fc.m_bufferPoolCounterIdsMap .emplace (bufferPoolVid, bufferPoolCounterIds);
509
525
510
526
// Start flex counter thread in case it was not running due to empty counter IDs map
@@ -1194,6 +1210,7 @@ void FlexCounter::collectCounters(
1194
1210
const auto &bufferPoolVid = it.first ;
1195
1211
const auto &bufferPoolId = it.second ->bufferPoolId ;
1196
1212
const auto &bufferPoolCounterIds = it.second ->bufferPoolCounterIds ;
1213
+ const auto &bufferPoolStatsMode = it.second ->bufferPoolStatsMode ;
1197
1214
1198
1215
std::vector<uint64_t > bufferPoolStats (bufferPoolCounterIds.size ());
1199
1216
@@ -1215,22 +1232,22 @@ void FlexCounter::collectCounters(
1215
1232
sai_serialize_status (status).c_str ());
1216
1233
continue ;
1217
1234
}
1218
- if (m_statsMode == SAI_STATS_MODE_READ_AND_CLEAR)
1235
+ if (m_statsMode == SAI_STATS_MODE_READ_AND_CLEAR || bufferPoolStatsMode == SAI_STATS_MODE_READ_AND_CLEAR )
1219
1236
{
1220
1237
status = sai_metadata_sai_buffer_api->clear_buffer_pool_stats (
1221
1238
bufferPoolId,
1222
1239
static_cast <uint32_t >(bufferPoolCounterIds.size ()),
1223
1240
reinterpret_cast <const sai_stat_id_t *>(bufferPoolCounterIds.data ()));
1224
- }
1225
- if (status != SAI_STATUS_SUCCESS)
1226
- {
1227
- // Because of stat pre-qualification in setting the buffer pool counter list,
1228
- // it is less likely that we will get a failure return here in clearing the stats
1229
- SWSS_LOG_ERROR ( " %s: failed to clear stats of buffer pool %s, rv: %s " ,
1230
- m_instanceId .c_str (),
1231
- sai_serialize_object_id (bufferPoolId ).c_str (),
1232
- sai_serialize_status (status). c_str ()) ;
1233
- continue ;
1241
+ if (status != SAI_STATUS_SUCCESS)
1242
+ {
1243
+ // Because of stat pre-qualification in setting the buffer pool counter list,
1244
+ // it is less likely that we will get a failure return here in clearing the stats
1245
+ SWSS_LOG_ERROR ( " %s: failed to clear stats of buffer pool %s, rv: %s " ,
1246
+ m_instanceId. c_str () ,
1247
+ sai_serialize_object_id (bufferPoolId) .c_str (),
1248
+ sai_serialize_status (status ).c_str ());
1249
+ continue ;
1250
+ }
1234
1251
}
1235
1252
1236
1253
// Write counter values to DB table
@@ -1529,7 +1546,8 @@ void FlexCounter::saiUpdateSupportedRifCounters(sai_object_id_t rifId)
1529
1546
1530
1547
void FlexCounter::saiUpdateSupportedBufferPoolCounters (
1531
1548
_In_ sai_object_id_t bufferPoolId,
1532
- _In_ const std::vector<sai_buffer_pool_stat_t > &counterIds)
1549
+ _In_ const std::vector<sai_buffer_pool_stat_t > &counterIds,
1550
+ _In_ sai_stats_mode_t statsMode)
1533
1551
{
1534
1552
SWSS_LOG_ENTER ();
1535
1553
@@ -1550,7 +1568,7 @@ void FlexCounter::saiUpdateSupportedBufferPoolCounters(
1550
1568
continue ;
1551
1569
}
1552
1570
1553
- if (m_statsMode == SAI_STATS_MODE_READ_AND_CLEAR)
1571
+ if (m_statsMode == SAI_STATS_MODE_READ_AND_CLEAR || statsMode == SAI_STATS_MODE_READ_AND_CLEAR )
1554
1572
{
1555
1573
status = sai_metadata_sai_buffer_api->clear_buffer_pool_stats (bufferPoolId, 1 , (const sai_stat_id_t *)&counterId);
1556
1574
if (status != SAI_STATUS_SUCCESS)
0 commit comments