Skip to content

Commit 49f36ce

Browse files
wendanilguohan
authored andcommitted
Per buffer pool watermark polling mode (sonic-net#485)
Add STATS_MODE field parsing when oid in FLEX_COUTER_TABLE key is SAI_OBJECT_TYPE_BUFFER_POOL. Use READ_AND_CLEAR mode when either global stats polling mode or the particular buffer pool stats polling mode is READ_AND_CLEAR. In the opposite, use READ mode (no stats clear) only when both global and per buffer pool stats polling mode are READ.
1 parent 2fc2c8a commit 49f36ce

File tree

3 files changed

+67
-33
lines changed

3 files changed

+67
-33
lines changed

syncd/syncd.cpp

+21-10
Original file line numberDiff line numberDiff line change
@@ -3022,14 +3022,16 @@ void processFlexCounterEvent(
30223022
}
30233023

30243024
const auto values = kfvFieldsValues(kco);
3025+
std::vector<std::string> counterIds;
3026+
std::string statsMode;
30253027
for (const auto& valuePair : values)
30263028
{
30273029
const auto field = fvField(valuePair);
30283030
const auto value = fvValue(valuePair);
30293031

30303032
if (op == SET_COMMAND)
30313033
{
3032-
auto idStrings = swss::tokenize(value, ',');
3034+
auto idStrings = swss::tokenize(value, ',');
30333035

30343036
if (objectType == SAI_OBJECT_TYPE_PORT && field == PORT_COUNTER_ID_LIST)
30353037
{
@@ -3105,22 +3107,31 @@ void processFlexCounterEvent(
31053107
}
31063108
else if (objectType == SAI_OBJECT_TYPE_BUFFER_POOL && field == BUFFER_POOL_COUNTER_ID_LIST)
31073109
{
3108-
std::vector<sai_buffer_pool_stat_t> bufferPoolCounterIds;
3109-
for (const auto &str : idStrings)
3110-
{
3111-
sai_buffer_pool_stat_t stat;
3112-
sai_deserialize_buffer_pool_stat(str.c_str(), &stat);
3113-
bufferPoolCounterIds.push_back(stat);
3114-
}
3115-
3116-
FlexCounter::setBufferPoolCounterList(vid, rid, groupName, bufferPoolCounterIds);
3110+
counterIds = idStrings;
3111+
}
3112+
else if (objectType == SAI_OBJECT_TYPE_BUFFER_POOL && field == STATS_MODE_FIELD)
3113+
{
3114+
statsMode = value;
31173115
}
31183116
else
31193117
{
31203118
SWSS_LOG_ERROR("Object type and field combination is not supported, object type %s, field %s", objectTypeStr.c_str(), field.c_str());
31213119
}
31223120
}
31233121
}
3122+
3123+
if (objectType == SAI_OBJECT_TYPE_BUFFER_POOL && counterIds.size())
3124+
{
3125+
std::vector<sai_buffer_pool_stat_t> bufferPoolCounterIds;
3126+
for (const auto &str : counterIds)
3127+
{
3128+
sai_buffer_pool_stat_t stat;
3129+
sai_deserialize_buffer_pool_stat(str.c_str(), &stat);
3130+
bufferPoolCounterIds.push_back(stat);
3131+
}
3132+
3133+
FlexCounter::setBufferPoolCounterList(vid, rid, groupName, bufferPoolCounterIds, statsMode);
3134+
}
31243135
}
31253136

31263137
void printUsage()

syncd/syncd_flex_counter.cpp

+37-19
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,9 @@ FlexCounter::RifCounterIds::RifCounterIds(
6161

6262
FlexCounter::BufferPoolCounterIds::BufferPoolCounterIds(
6363
_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)
6667
{
6768
SWSS_LOG_ENTER();
6869
}
@@ -463,14 +464,29 @@ void FlexCounter::setRifCounterList(
463464
void FlexCounter::setBufferPoolCounterList(
464465
_In_ sai_object_id_t bufferPoolVid,
465466
_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)
468470
{
469471
SWSS_LOG_ENTER();
470472

471473
FlexCounter &fc = getInstance(instanceId);
472474

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);
474490

475491
// Filter unsupported counters
476492
std::vector<sai_buffer_pool_stat_t> supportedIds;
@@ -504,7 +520,7 @@ void FlexCounter::setBufferPoolCounterList(
504520
return;
505521
}
506522

507-
auto bufferPoolCounterIds = std::make_shared<BufferPoolCounterIds>(bufferPoolId, supportedIds);
523+
auto bufferPoolCounterIds = std::make_shared<BufferPoolCounterIds>(bufferPoolId, supportedIds, bufferPoolStatsMode);
508524
fc.m_bufferPoolCounterIdsMap.emplace(bufferPoolVid, bufferPoolCounterIds);
509525

510526
// Start flex counter thread in case it was not running due to empty counter IDs map
@@ -1194,6 +1210,7 @@ void FlexCounter::collectCounters(
11941210
const auto &bufferPoolVid = it.first;
11951211
const auto &bufferPoolId = it.second->bufferPoolId;
11961212
const auto &bufferPoolCounterIds = it.second->bufferPoolCounterIds;
1213+
const auto &bufferPoolStatsMode = it.second->bufferPoolStatsMode;
11971214

11981215
std::vector<uint64_t> bufferPoolStats(bufferPoolCounterIds.size());
11991216

@@ -1215,22 +1232,22 @@ void FlexCounter::collectCounters(
12151232
sai_serialize_status(status).c_str());
12161233
continue;
12171234
}
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)
12191236
{
12201237
status = sai_metadata_sai_buffer_api->clear_buffer_pool_stats(
12211238
bufferPoolId,
12221239
static_cast<uint32_t>(bufferPoolCounterIds.size()),
12231240
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+
}
12341251
}
12351252

12361253
// Write counter values to DB table
@@ -1529,7 +1546,8 @@ void FlexCounter::saiUpdateSupportedRifCounters(sai_object_id_t rifId)
15291546

15301547
void FlexCounter::saiUpdateSupportedBufferPoolCounters(
15311548
_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)
15331551
{
15341552
SWSS_LOG_ENTER();
15351553

@@ -1550,7 +1568,7 @@ void FlexCounter::saiUpdateSupportedBufferPoolCounters(
15501568
continue;
15511569
}
15521570

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)
15541572
{
15551573
status = sai_metadata_sai_buffer_api->clear_buffer_pool_stats(bufferPoolId, 1, (const sai_stat_id_t *)&counterId);
15561574
if (status != SAI_STATUS_SUCCESS)

syncd/syncd_flex_counter.h

+9-4
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,9 @@ class FlexCounter
4040
static void setBufferPoolCounterList(
4141
_In_ sai_object_id_t bufferPoolVid,
4242
_In_ sai_object_id_t bufferPoolId,
43-
_In_ std::string instanceId,
44-
_In_ const std::vector<sai_buffer_pool_stat_t> &counterIds);
43+
_In_ const std::string &instanceId,
44+
_In_ const std::vector<sai_buffer_pool_stat_t> &counterIds,
45+
_In_ const std::string &statsMode = "");
4546
static void setQueueAttrList(
4647
_In_ sai_object_id_t queueVid,
4748
_In_ sai_object_id_t queueId,
@@ -143,9 +144,11 @@ class FlexCounter
143144
{
144145
BufferPoolCounterIds(
145146
_In_ sai_object_id_t bufferPool,
146-
_In_ const std::vector<sai_buffer_pool_stat_t> &bufferPoolIds);
147+
_In_ const std::vector<sai_buffer_pool_stat_t> &bufferPoolIds,
148+
_In_ sai_stats_mode_t statsMode);
147149

148150
sai_object_id_t bufferPoolId;
151+
sai_stats_mode_t bufferPoolStatsMode;
149152
std::vector<sai_buffer_pool_stat_t> bufferPoolCounterIds;
150153
};
151154

@@ -183,7 +186,9 @@ class FlexCounter
183186
void saiUpdateSupportedQueueCounters(sai_object_id_t queueId, const std::vector<sai_queue_stat_t> &counterIds);
184187
void saiUpdateSupportedPriorityGroupCounters(sai_object_id_t priorityGroupId, const std::vector<sai_ingress_priority_group_stat_t> &counterIds);
185188
void saiUpdateSupportedRifCounters(sai_object_id_t rifId);
186-
void saiUpdateSupportedBufferPoolCounters(sai_object_id_t bufferPoolId, const std::vector<sai_buffer_pool_stat_t> &counterIds);
189+
void saiUpdateSupportedBufferPoolCounters(sai_object_id_t bufferPoolId,
190+
const std::vector<sai_buffer_pool_stat_t> &counterIds,
191+
sai_stats_mode_t statsMode = SAI_STATS_MODE_READ_AND_CLEAR);
187192
bool isPortCounterSupported(sai_port_stat_t counter) const;
188193
bool isQueueCounterSupported(sai_queue_stat_t counter) const;
189194
bool isPriorityGroupCounterSupported(sai_ingress_priority_group_stat_t counter) const;

0 commit comments

Comments
 (0)