Skip to content

Commit

Permalink
Per buffer pool watermark polling mode (sonic-net#485)
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
wendani authored and lguohan committed Jul 16, 2019
1 parent 2fc2c8a commit 49f36ce
Show file tree
Hide file tree
Showing 3 changed files with 67 additions and 33 deletions.
31 changes: 21 additions & 10 deletions syncd/syncd.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3022,14 +3022,16 @@ void processFlexCounterEvent(
}

const auto values = kfvFieldsValues(kco);
std::vector<std::string> counterIds;
std::string statsMode;
for (const auto& valuePair : values)
{
const auto field = fvField(valuePair);
const auto value = fvValue(valuePair);

if (op == SET_COMMAND)
{
auto idStrings = swss::tokenize(value, ',');
auto idStrings = swss::tokenize(value, ',');

if (objectType == SAI_OBJECT_TYPE_PORT && field == PORT_COUNTER_ID_LIST)
{
Expand Down Expand Up @@ -3105,22 +3107,31 @@ void processFlexCounterEvent(
}
else if (objectType == SAI_OBJECT_TYPE_BUFFER_POOL && field == BUFFER_POOL_COUNTER_ID_LIST)
{
std::vector<sai_buffer_pool_stat_t> bufferPoolCounterIds;
for (const auto &str : idStrings)
{
sai_buffer_pool_stat_t stat;
sai_deserialize_buffer_pool_stat(str.c_str(), &stat);
bufferPoolCounterIds.push_back(stat);
}

FlexCounter::setBufferPoolCounterList(vid, rid, groupName, bufferPoolCounterIds);
counterIds = idStrings;
}
else if (objectType == SAI_OBJECT_TYPE_BUFFER_POOL && field == STATS_MODE_FIELD)
{
statsMode = value;
}
else
{
SWSS_LOG_ERROR("Object type and field combination is not supported, object type %s, field %s", objectTypeStr.c_str(), field.c_str());
}
}
}

if (objectType == SAI_OBJECT_TYPE_BUFFER_POOL && counterIds.size())
{
std::vector<sai_buffer_pool_stat_t> bufferPoolCounterIds;
for (const auto &str : counterIds)
{
sai_buffer_pool_stat_t stat;
sai_deserialize_buffer_pool_stat(str.c_str(), &stat);
bufferPoolCounterIds.push_back(stat);
}

FlexCounter::setBufferPoolCounterList(vid, rid, groupName, bufferPoolCounterIds, statsMode);
}
}

void printUsage()
Expand Down
56 changes: 37 additions & 19 deletions syncd/syncd_flex_counter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -61,8 +61,9 @@ FlexCounter::RifCounterIds::RifCounterIds(

FlexCounter::BufferPoolCounterIds::BufferPoolCounterIds(
_In_ sai_object_id_t bufferPool,
_In_ const std::vector<sai_buffer_pool_stat_t> &bufferPoolIds):
bufferPoolId(bufferPool), bufferPoolCounterIds(bufferPoolIds)
_In_ const std::vector<sai_buffer_pool_stat_t> &bufferPoolIds,
_In_ sai_stats_mode_t statsMode):
bufferPoolId(bufferPool), bufferPoolStatsMode(statsMode), bufferPoolCounterIds(bufferPoolIds)
{
SWSS_LOG_ENTER();
}
Expand Down Expand Up @@ -463,14 +464,29 @@ void FlexCounter::setRifCounterList(
void FlexCounter::setBufferPoolCounterList(
_In_ sai_object_id_t bufferPoolVid,
_In_ sai_object_id_t bufferPoolId,
_In_ std::string instanceId,
_In_ const std::vector<sai_buffer_pool_stat_t> &counterIds)
_In_ const std::string &instanceId,
_In_ const std::vector<sai_buffer_pool_stat_t> &counterIds,
_In_ const std::string &statsMode)
{
SWSS_LOG_ENTER();

FlexCounter &fc = getInstance(instanceId);

fc.saiUpdateSupportedBufferPoolCounters(bufferPoolId, counterIds);
sai_stats_mode_t bufferPoolStatsMode = SAI_STATS_MODE_READ_AND_CLEAR;
if (statsMode == STATS_MODE_READ_AND_CLEAR)
{
bufferPoolStatsMode = SAI_STATS_MODE_READ_AND_CLEAR;
}
else if (statsMode == STATS_MODE_READ)
{
bufferPoolStatsMode = SAI_STATS_MODE_READ;
}
else
{
SWSS_LOG_WARN("Stats mode %s not supported for flex counter. Using STATS_MODE_READ_AND_CLEAR", statsMode.c_str());
}

fc.saiUpdateSupportedBufferPoolCounters(bufferPoolId, counterIds, bufferPoolStatsMode);

// Filter unsupported counters
std::vector<sai_buffer_pool_stat_t> supportedIds;
Expand Down Expand Up @@ -504,7 +520,7 @@ void FlexCounter::setBufferPoolCounterList(
return;
}

auto bufferPoolCounterIds = std::make_shared<BufferPoolCounterIds>(bufferPoolId, supportedIds);
auto bufferPoolCounterIds = std::make_shared<BufferPoolCounterIds>(bufferPoolId, supportedIds, bufferPoolStatsMode);
fc.m_bufferPoolCounterIdsMap.emplace(bufferPoolVid, bufferPoolCounterIds);

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

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

Expand All @@ -1215,22 +1232,22 @@ void FlexCounter::collectCounters(
sai_serialize_status(status).c_str());
continue;
}
if (m_statsMode == SAI_STATS_MODE_READ_AND_CLEAR)
if (m_statsMode == SAI_STATS_MODE_READ_AND_CLEAR || bufferPoolStatsMode == SAI_STATS_MODE_READ_AND_CLEAR)
{
status = sai_metadata_sai_buffer_api->clear_buffer_pool_stats(
bufferPoolId,
static_cast<uint32_t>(bufferPoolCounterIds.size()),
reinterpret_cast<const sai_stat_id_t *>(bufferPoolCounterIds.data()));
}
if (status != SAI_STATUS_SUCCESS)
{
// Because of stat pre-qualification in setting the buffer pool counter list,
// it is less likely that we will get a failure return here in clearing the stats
SWSS_LOG_ERROR("%s: failed to clear stats of buffer pool %s, rv: %s",
m_instanceId.c_str(),
sai_serialize_object_id(bufferPoolId).c_str(),
sai_serialize_status(status).c_str());
continue;
if (status != SAI_STATUS_SUCCESS)
{
// Because of stat pre-qualification in setting the buffer pool counter list,
// it is less likely that we will get a failure return here in clearing the stats
SWSS_LOG_ERROR("%s: failed to clear stats of buffer pool %s, rv: %s",
m_instanceId.c_str(),
sai_serialize_object_id(bufferPoolId).c_str(),
sai_serialize_status(status).c_str());
continue;
}
}

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

void FlexCounter::saiUpdateSupportedBufferPoolCounters(
_In_ sai_object_id_t bufferPoolId,
_In_ const std::vector<sai_buffer_pool_stat_t> &counterIds)
_In_ const std::vector<sai_buffer_pool_stat_t> &counterIds,
_In_ sai_stats_mode_t statsMode)
{
SWSS_LOG_ENTER();

Expand All @@ -1550,7 +1568,7 @@ void FlexCounter::saiUpdateSupportedBufferPoolCounters(
continue;
}

if (m_statsMode == SAI_STATS_MODE_READ_AND_CLEAR)
if (m_statsMode == SAI_STATS_MODE_READ_AND_CLEAR || statsMode == SAI_STATS_MODE_READ_AND_CLEAR)
{
status = sai_metadata_sai_buffer_api->clear_buffer_pool_stats(bufferPoolId, 1, (const sai_stat_id_t *)&counterId);
if (status != SAI_STATUS_SUCCESS)
Expand Down
13 changes: 9 additions & 4 deletions syncd/syncd_flex_counter.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,9 @@ class FlexCounter
static void setBufferPoolCounterList(
_In_ sai_object_id_t bufferPoolVid,
_In_ sai_object_id_t bufferPoolId,
_In_ std::string instanceId,
_In_ const std::vector<sai_buffer_pool_stat_t> &counterIds);
_In_ const std::string &instanceId,
_In_ const std::vector<sai_buffer_pool_stat_t> &counterIds,
_In_ const std::string &statsMode = "");
static void setQueueAttrList(
_In_ sai_object_id_t queueVid,
_In_ sai_object_id_t queueId,
Expand Down Expand Up @@ -143,9 +144,11 @@ class FlexCounter
{
BufferPoolCounterIds(
_In_ sai_object_id_t bufferPool,
_In_ const std::vector<sai_buffer_pool_stat_t> &bufferPoolIds);
_In_ const std::vector<sai_buffer_pool_stat_t> &bufferPoolIds,
_In_ sai_stats_mode_t statsMode);

sai_object_id_t bufferPoolId;
sai_stats_mode_t bufferPoolStatsMode;
std::vector<sai_buffer_pool_stat_t> bufferPoolCounterIds;
};

Expand Down Expand Up @@ -183,7 +186,9 @@ class FlexCounter
void saiUpdateSupportedQueueCounters(sai_object_id_t queueId, const std::vector<sai_queue_stat_t> &counterIds);
void saiUpdateSupportedPriorityGroupCounters(sai_object_id_t priorityGroupId, const std::vector<sai_ingress_priority_group_stat_t> &counterIds);
void saiUpdateSupportedRifCounters(sai_object_id_t rifId);
void saiUpdateSupportedBufferPoolCounters(sai_object_id_t bufferPoolId, const std::vector<sai_buffer_pool_stat_t> &counterIds);
void saiUpdateSupportedBufferPoolCounters(sai_object_id_t bufferPoolId,
const std::vector<sai_buffer_pool_stat_t> &counterIds,
sai_stats_mode_t statsMode = SAI_STATS_MODE_READ_AND_CLEAR);
bool isPortCounterSupported(sai_port_stat_t counter) const;
bool isQueueCounterSupported(sai_queue_stat_t counter) const;
bool isPriorityGroupCounterSupported(sai_ingress_priority_group_stat_t counter) const;
Expand Down

0 comments on commit 49f36ce

Please sign in to comment.