Skip to content

Commit caab633

Browse files
sihuihan88lguohan
authored andcommitted
[pfcwd]: Add support to poll queue attr in syncd (sonic-net#241)
* [pfcwd]: Add support to poll queue attr in syncd * update as comments * remove extra empty line
1 parent 037d2f8 commit caab633

File tree

5 files changed

+140
-9
lines changed

5 files changed

+140
-9
lines changed

meta/saiserialize.cpp

+16
Original file line numberDiff line numberDiff line change
@@ -716,6 +716,14 @@ std::string sai_serialize_queue_stat(
716716
return sai_serialize_enum(counter, &sai_metadata_enum_sai_queue_stat_t);
717717
}
718718

719+
std::string sai_serialize_queue_attr(
720+
_In_ const sai_queue_attr_t attr)
721+
{
722+
SWSS_LOG_ENTER();
723+
724+
return sai_serialize_enum(attr, &sai_metadata_enum_sai_queue_attr_t);
725+
}
726+
719727
std::string sai_serialize_switch_oper_status(
720728
_In_ sai_object_id_t switch_id,
721729
_In_ sai_switch_oper_status_t status)
@@ -2804,3 +2812,11 @@ void sai_deserialize_queue_stat(
28042812
sai_deserialize_enum(s, &sai_metadata_enum_sai_queue_stat_t, (int32_t&)stat);
28052813
}
28062814

2815+
void sai_deserialize_queue_attr(
2816+
_In_ const std::string& s,
2817+
_Out_ sai_queue_attr_t& attr)
2818+
{
2819+
SWSS_LOG_ENTER();
2820+
2821+
sai_deserialize_enum(s, &sai_metadata_enum_sai_queue_attr_t, (int32_t&)attr);
2822+
}

meta/saiserialize.h

+6
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,9 @@ std::string sai_serialize_port_stat(
7575
std::string sai_serialize_queue_stat(
7676
_In_ const sai_queue_stat_t counter);
7777

78+
std::string sai_serialize_queue_attr(
79+
_In_ const sai_queue_attr_t attr);
80+
7881
std::string sai_serialize_switch_oper_status(
7982
_In_ sai_object_id_t switch_id,
8083
_In_ sai_switch_oper_status_t status);
@@ -220,4 +223,7 @@ void sai_deserialize_queue_stat(
220223
_In_ const std::string& s,
221224
_Out_ sai_queue_stat_t& stat);
222225

226+
void sai_deserialize_queue_attr(
227+
_In_ const std::string& s,
228+
_Out_ sai_queue_attr_t& attr);
223229
#endif // __SAI_SERIALIZE__

syncd/syncd.cpp

+12
Original file line numberDiff line numberDiff line change
@@ -2417,6 +2417,18 @@ void processPfcWdEvent(
24172417
}
24182418
PfcWatchdog::setQueueCounterList(vid, rid, queueCounterIds);
24192419
}
2420+
else if (objectType == SAI_OBJECT_TYPE_QUEUE && field == PFC_WD_QUEUE_ATTR_ID_LIST)
2421+
{
2422+
std::vector<sai_queue_attr_t> queueAttrIds;
2423+
for (const auto &str : idStrings)
2424+
{
2425+
sai_queue_attr_t attr;
2426+
sai_deserialize_queue_attr(str, attr);
2427+
queueAttrIds.push_back(attr);
2428+
}
2429+
2430+
PfcWatchdog::setQueueAttrList(vid, rid, queueAttrIds);
2431+
}
24202432
else
24212433
{
24222434
SWSS_LOG_ERROR("Object type not supported");

syncd/syncd_pfc_watchdog.cpp

+90-9
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,13 @@ PfcWatchdog::QueueCounterIds::QueueCounterIds(
1818
{
1919
}
2020

21+
PfcWatchdog::QueueAttrIds::QueueAttrIds(
22+
_In_ sai_object_id_t queue,
23+
_In_ const std::vector<sai_queue_attr_t> &queueIds):
24+
queueId(queue), queueAttrIds(queueIds)
25+
{
26+
}
27+
2128
void PfcWatchdog::setPortCounterList(
2229
_In_ sai_object_id_t portVid,
2330
_In_ sai_object_id_t portId,
@@ -64,6 +71,30 @@ void PfcWatchdog::setQueueCounterList(
6471
wd.startWatchdogThread();
6572
}
6673

74+
void PfcWatchdog::setQueueAttrList(
75+
_In_ sai_object_id_t queueVid,
76+
_In_ sai_object_id_t queueId,
77+
_In_ const std::vector<sai_queue_attr_t> &attrIds)
78+
{
79+
SWSS_LOG_ENTER();
80+
81+
PfcWatchdog &wd = getInstance();
82+
83+
auto it = wd.m_queueAttrIdsMap.find(queueVid);
84+
if (it != wd.m_queueAttrIdsMap.end())
85+
{
86+
(*it).second->queueAttrIds = attrIds;
87+
return;
88+
}
89+
90+
auto queueAttrIds = std::make_shared<QueueAttrIds>(queueId, attrIds);
91+
wd.m_queueAttrIdsMap.emplace(queueVid, queueAttrIds);
92+
93+
// Start watchdog thread in case it was not running due to empty counter IDs map
94+
wd.startWatchdogThread();
95+
}
96+
97+
6798
void PfcWatchdog::removePort(
6899
_In_ sai_object_id_t portVid)
69100
{
@@ -81,7 +112,7 @@ void PfcWatchdog::removePort(
81112
wd.m_portCounterIdsMap.erase(it);
82113

83114
// Stop watchdog thread if counter IDs map is empty
84-
if (wd.m_queueCounterIdsMap.empty() && wd.m_portCounterIdsMap.empty())
115+
if (wd.m_queueCounterIdsMap.empty() && wd.m_portCounterIdsMap.empty() && wd.m_queueAttrIdsMap.empty())
85116
{
86117
wd.endWatchdogThread();
87118
}
@@ -94,17 +125,26 @@ void PfcWatchdog::removeQueue(
94125

95126
PfcWatchdog &wd = getInstance();
96127

97-
auto it = wd.m_queueCounterIdsMap.find(queueVid);
98-
if (it == wd.m_queueCounterIdsMap.end())
128+
auto counterIter = wd.m_queueCounterIdsMap.find(queueVid);
129+
if (counterIter == wd.m_queueCounterIdsMap.end())
99130
{
100131
SWSS_LOG_ERROR("Trying to remove nonexisting queue counter Ids 0x%lx", queueVid);
101132
return;
102133
}
103134

104-
wd.m_queueCounterIdsMap.erase(it);
135+
wd.m_queueCounterIdsMap.erase(counterIter);
136+
137+
auto attrIter = wd.m_queueAttrIdsMap.find(queueVid);
138+
if (attrIter == wd.m_queueAttrIdsMap.end())
139+
{
140+
SWSS_LOG_ERROR("Trying to remove nonexisting queue attr Ids 0x%lx", queueVid);
141+
return;
142+
}
143+
144+
wd.m_queueAttrIdsMap.erase(attrIter);
105145

106146
// Stop watchdog thread if counter IDs map is empty
107-
if (wd.m_queueCounterIdsMap.empty() && wd.m_portCounterIdsMap.empty())
147+
if (wd.m_queueCounterIdsMap.empty() && wd.m_portCounterIdsMap.empty() && wd.m_queueAttrIdsMap.empty())
108148
{
109149
wd.endWatchdogThread();
110150
}
@@ -176,8 +216,6 @@ void PfcWatchdog::collectCounters(
176216
{
177217
SWSS_LOG_ENTER();
178218

179-
std::lock_guard<std::mutex> lock(g_mutex);
180-
181219
// Collect stats for every registered port
182220
for (const auto &kv: m_portCounterIdsMap)
183221
{
@@ -249,15 +287,56 @@ void PfcWatchdog::collectCounters(
249287

250288
countersTable.set(queueVidStr, values, "");
251289
}
290+
291+
// Collect stats for every registered queue
292+
for (const auto &kv: m_queueAttrIdsMap)
293+
{
294+
const auto &queueVid = kv.first;
295+
const auto &queueId = kv.second->queueId;
296+
const auto &queueAttrIds = kv.second->queueAttrIds;
297+
298+
std::vector<sai_attribute_t> queueAttr(queueAttrIds.size());
299+
300+
for (uint64_t i =0; i< queueAttrIds.size(); i++)
301+
{
302+
queueAttr[i].id = queueAttrIds[i];
303+
}
304+
305+
// Get queue attr
306+
sai_status_t status = sai_metadata_sai_queue_api->get_queue_attribute(
307+
queueId,
308+
static_cast<uint32_t>(queueAttrIds.size()),
309+
queueAttr.data());
310+
311+
if (status != SAI_STATUS_SUCCESS)
312+
{
313+
SWSS_LOG_ERROR("Failed to get attr of queue 0x%lx: %d", queueVid, status);
314+
continue;
315+
}
316+
317+
// Push all counter values to a single vector
318+
std::vector<swss::FieldValueTuple> values;
319+
320+
for (size_t i = 0; i != queueAttrIds.size(); i++)
321+
{
322+
const std::string &counterName = sai_serialize_queue_attr(queueAttrIds[i]);
323+
auto meta = sai_metadata_get_attr_metadata(SAI_OBJECT_TYPE_QUEUE, queueAttr[i].id);
324+
325+
values.emplace_back(counterName, sai_serialize_attr_value(*meta, queueAttr[i]));
326+
}
327+
// Write counters to DB
328+
std::string queueVidStr = sai_serialize_object_id(queueVid);
329+
330+
countersTable.set(queueVidStr, values, "");
331+
}
332+
252333
}
253334

254335
void PfcWatchdog::runPlugins(
255336
_In_ swss::DBConnector& db)
256337
{
257338
SWSS_LOG_ENTER();
258339

259-
std::lock_guard<std::mutex> lock(g_mutex);
260-
261340
const std::vector<std::string> argv =
262341
{
263342
std::to_string(COUNTERS_DB),
@@ -299,6 +378,8 @@ void PfcWatchdog::pfcWatchdogThread(void)
299378

300379
while (m_runPfcWatchdogThread)
301380
{
381+
382+
std::lock_guard<std::mutex> lock(g_mutex);
302383
collectCounters(countersTable);
303384
runPlugins(db);
304385

syncd/syncd_pfc_watchdog.h

+16
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,11 @@ class PfcWatchdog
2222
_In_ sai_object_id_t queueVid,
2323
_In_ sai_object_id_t queueId,
2424
_In_ const std::vector<sai_queue_stat_t> &counterIds);
25+
static void setQueueAttrList(
26+
_In_ sai_object_id_t queueVid,
27+
_In_ sai_object_id_t queueId,
28+
_In_ const std::vector<sai_queue_attr_t> &attrIds);
29+
2530
static void removePort(
2631
_In_ sai_object_id_t portVid);
2732
static void removeQueue(
@@ -49,6 +54,16 @@ class PfcWatchdog
4954
std::vector<sai_queue_stat_t> queueCounterIds;
5055
};
5156

57+
struct QueueAttrIds
58+
{
59+
QueueAttrIds(
60+
_In_ sai_object_id_t queue,
61+
_In_ const std::vector<sai_queue_attr_t> &queueIds);
62+
63+
sai_object_id_t queueId;
64+
std::vector<sai_queue_attr_t> queueAttrIds;
65+
};
66+
5267
struct PortCounterIds
5368
{
5469
PortCounterIds(
@@ -72,6 +87,7 @@ class PfcWatchdog
7287
// Key is a Virtual ID
7388
std::map<sai_object_id_t, std::shared_ptr<PortCounterIds>> m_portCounterIdsMap;
7489
std::map<sai_object_id_t, std::shared_ptr<QueueCounterIds>> m_queueCounterIdsMap;
90+
std::map<sai_object_id_t, std::shared_ptr<QueueAttrIds>> m_queueAttrIdsMap;
7591

7692
// Plugins
7793
std::set<std::string> m_queuePlugins;

0 commit comments

Comments
 (0)