From 08e8cea7a668ee2b6328fbb7d2b1cec5e07a2d1f Mon Sep 17 00:00:00 2001 From: Sambath Kumar Balasubramanian Date: Thu, 16 Sep 2021 17:27:05 -0700 Subject: [PATCH 1/7] Add support for voq counters in portsorch. 1) Add m_voq_ids to SystemPortInfo to maintain the list of queue ids. 2) Add two new tables COUNTERS_SYSTEM_PORT_NAME_MAP and COUNTERS_VOQ_NAME_MAP to enable queuestat to differentiate between Port Tx queues and Voqs. 3) Add a new function initializeVoqs that retrieves the number of voqs for a system port and stores the voq object ids in m_voq_ids 4) Add code to handle queue type SAI_QUEUE_TYPE_UNICAST_VOQ. 5) Initialize voqs and populate COUNTERS_SYSTEM_PORT_NAME_MAP in addSystemPorts function. 6) Update generateQueueMap to generate queue maps for both Txqs and Voq. For PHY ports in a voq system both Txqs and Voqs are instantiated. For Voqs of remote system port, only Voq counters are initialized. --- orchagent/port.h | 1 + orchagent/portsorch.cpp | 119 +++++++++++++++++++++++++++++++++++++--- orchagent/portsorch.h | 5 +- 3 files changed, 115 insertions(+), 10 deletions(-) diff --git a/orchagent/port.h b/orchagent/port.h index 57c9f6e2d9..90f247ae46 100644 --- a/orchagent/port.h +++ b/orchagent/port.h @@ -50,6 +50,7 @@ struct SystemPortInfo std::string alias = ""; sai_system_port_type_t type = SAI_SYSTEM_PORT_TYPE_LOCAL; sai_object_id_t local_port_oid = 0; + std::vector m_voq_ids; uint32_t port_id = 0; uint32_t switch_id = 0; uint32_t core_index = 0; diff --git a/orchagent/portsorch.cpp b/orchagent/portsorch.cpp index 76babdf24d..d3f6c30b72 100755 --- a/orchagent/portsorch.cpp +++ b/orchagent/portsorch.cpp @@ -299,6 +299,8 @@ PortsOrch::PortsOrch(DBConnector *db, DBConnector *stateDb, vector(new DBConnector("COUNTERS_DB", 0)); m_counterTable = unique_ptr(new Table(m_counter_db.get(), COUNTERS_PORT_NAME_MAP)); + m_counterSysPortTable = unique_ptr
( + new Table(m_counter_db.get(), COUNTERS_SYSTEM_PORT_NAME_MAP)); m_counterLagTable = unique_ptr
(new Table(m_counter_db.get(), COUNTERS_LAG_NAME_MAP)); FieldValueTuple tuple("", ""); vector defaultLagFv; @@ -313,6 +315,7 @@ PortsOrch::PortsOrch(DBConnector *db, DBConnector *stateDb, vector(new Table(m_counter_db.get(), COUNTERS_QUEUE_NAME_MAP)); + m_voqTable = unique_ptr
(new Table(m_counter_db.get(), COUNTERS_VOQ_NAME_MAP)); m_queuePortTable = unique_ptr
(new Table(m_counter_db.get(), COUNTERS_QUEUE_PORT_MAP)); m_queueIndexTable = unique_ptr
(new Table(m_counter_db.get(), COUNTERS_QUEUE_INDEX_MAP)); m_queueTypeTable = unique_ptr
(new Table(m_counter_db.get(), COUNTERS_QUEUE_TYPE_MAP)); @@ -2055,6 +2058,9 @@ bool PortsOrch::getQueueTypeAndIndex(sai_object_id_t queue_id, string &type, uin case SAI_QUEUE_TYPE_MULTICAST: type = "SAI_QUEUE_TYPE_MULTICAST"; break; + case SAI_QUEUE_TYPE_UNICAST_VOQ: + type = "SAI_QUEUE_TYPE_UNICAST_VOQ"; + break; default: SWSS_LOG_ERROR("Got unsupported queue type %d for %" PRIu64 " queue", attr[0].value.s32, queue_id); throw runtime_error("Got unsupported queue type"); @@ -3897,6 +3903,51 @@ void PortsOrch::doTask(Consumer &consumer) } } +void PortsOrch::initializeVoqs(Port &port) +{ + SWSS_LOG_ENTER(); + + sai_attribute_t attr; + attr.id = SAI_SYSTEM_PORT_ATTR_QOS_NUMBER_OF_VOQS; + sai_status_t status = sai_system_port_api->get_system_port_attribute( + port.m_system_port_oid, 1, &attr); + if (status != SAI_STATUS_SUCCESS) + { + SWSS_LOG_ERROR("Failed to get number of voqs for port %s rv:%d", port.m_alias.c_str(), status); + task_process_status handle_status = handleSaiGetStatus(SAI_API_PORT, status); + if (handle_status != task_process_status::task_success) + { + throw runtime_error("PortsOrch initialization failure."); + } + } + SWSS_LOG_INFO("Get %d voq for port %s", attr.value.u32, port.m_alias.c_str()); + + port.m_system_port_info.m_voq_ids.resize(attr.value.u32); + + if (attr.value.u32 == 0) + { + return; + } + + attr.id = SAI_SYSTEM_PORT_ATTR_QOS_VOQ_LIST; + attr.value.objlist.count = (uint32_t)port.m_system_port_info.m_voq_ids.size(); + attr.value.objlist.list = port.m_system_port_info.m_voq_ids.data(); + + status = sai_system_port_api->get_system_port_attribute( + port.m_system_port_oid, 1, &attr); + if (status != SAI_STATUS_SUCCESS) + { + SWSS_LOG_ERROR("Failed to get voq list for port %s rv:%d", port.m_alias.c_str(), status); + task_process_status handle_status = handleSaiGetStatus(SAI_API_PORT, status); + if (handle_status != task_process_status::task_success) + { + throw runtime_error("PortsOrch initialization failure."); + } + } + + SWSS_LOG_INFO("Get voqs for port %s", port.m_alias.c_str()); +} + void PortsOrch::initializeQueues(Port &port) { SWSS_LOG_ENTER(); @@ -5009,14 +5060,23 @@ void PortsOrch::generateQueueMap() { if (it.second.m_type == Port::PHY) { - generateQueueMapPerPort(it.second); + generateQueueMapPerPort(it.second, false); + if (gMySwitchType == "voq") + { + generateQueueMapPerPort(it.second, true); + } } + + if (it.second.m_type == Port::SYSTEM) + { + generateQueueMapPerPort(it.second, true); + } } m_isQueueMapGenerated = true; } -void PortsOrch::generateQueueMapPerPort(const Port& port) +void PortsOrch::generateQueueMapPerPort(const Port& port, bool voq) { /* Create the Queue map in the Counter DB */ /* Add stat counters to flex_counter */ @@ -5024,20 +5084,43 @@ void PortsOrch::generateQueueMapPerPort(const Port& port) vector queuePortVector; vector queueIndexVector; vector queueTypeVector; + std::vector queue_ids; + if (voq) + { + queue_ids = port.m_system_port_info.m_voq_ids; + } + else + { + queue_ids = port.m_queue_ids; + } - for (size_t queueIndex = 0; queueIndex < port.m_queue_ids.size(); ++queueIndex) + for (size_t queueIndex = 0; queueIndex < queue_ids.size(); ++queueIndex) { std::ostringstream name; - name << port.m_alias << ":" << queueIndex; + if (voq) + { + name << port.m_system_port_info.alias << ":" << queueIndex; + } + else + { + name << port.m_alias << ":" << queueIndex; + } - const auto id = sai_serialize_object_id(port.m_queue_ids[queueIndex]); + const auto id = sai_serialize_object_id(queue_ids[queueIndex]); queueVector.emplace_back(name.str(), id); - queuePortVector.emplace_back(id, sai_serialize_object_id(port.m_port_id)); + if (voq) + { + queuePortVector.emplace_back(id, sai_serialize_object_id(port.m_system_port_oid)); + } + else + { + queuePortVector.emplace_back(id, sai_serialize_object_id(port.m_port_id)); + } string queueType; uint8_t queueRealIndex = 0; - if (getQueueTypeAndIndex(port.m_queue_ids[queueIndex], queueType, queueRealIndex)) + if (getQueueTypeAndIndex(queue_ids[queueIndex], queueType, queueRealIndex)) { queueTypeVector.emplace_back(id, queueType); queueIndexVector.emplace_back(id, to_string(queueRealIndex)); @@ -5049,7 +5132,11 @@ void PortsOrch::generateQueueMapPerPort(const Port& port) { counter_stats.emplace(sai_serialize_queue_stat(it)); } - queue_stat_manager.setCounterIdList(port.m_queue_ids[queueIndex], CounterType::QUEUE, counter_stats); + queue_stat_manager.setCounterIdList(queue_ids[queueIndex], CounterType::QUEUE, counter_stats); + + if (voq) { + continue; + } /* add watermark queue counters */ string key = getQueueWatermarkFlexCounterTableKey(id); @@ -5068,7 +5155,14 @@ void PortsOrch::generateQueueMapPerPort(const Port& port) m_flexCounterTable->set(key, fieldValues); } - m_queueTable->set("", queueVector); + if (voq) + { + m_voqTable->set("", queueVector); + } + else + { + m_queueTable->set("", queueVector); + } m_queuePortTable->set("", queuePortVector); m_queueIndexTable->set("", queueIndexVector); m_queueTypeTable->set("", queueTypeVector); @@ -6178,7 +6272,14 @@ bool PortsOrch::addSystemPorts() port.m_system_port_info.speed = attrs[1].value.sysportconfig.speed; port.m_system_port_info.num_voq = attrs[1].value.sysportconfig.num_voq; + initializeVoqs( port ); setPort(port.m_alias, port); + /* Add system port name map to counter table */ + FieldValueTuple tuple(port.m_system_port_info.alias, + sai_serialize_object_id(system_port_oid)); + vector fields; + fields.push_back(tuple); + m_counterSysPortTable->set("", fields); if(m_port_ref_count.find(port.m_alias) == m_port_ref_count.end()) { m_port_ref_count[port.m_alias] = 0; diff --git a/orchagent/portsorch.h b/orchagent/portsorch.h index 22efce3561..4f97adb6b4 100755 --- a/orchagent/portsorch.h +++ b/orchagent/portsorch.h @@ -154,10 +154,12 @@ class PortsOrch : public Orch, public Subject private: unique_ptr
m_counterTable; + unique_ptr
m_counterSysPortTable; unique_ptr
m_counterLagTable; unique_ptr
m_portTable; unique_ptr
m_gearboxTable; unique_ptr
m_queueTable; + unique_ptr
m_voqTable; unique_ptr
m_queuePortTable; unique_ptr
m_queueIndexTable; unique_ptr
m_queueTypeTable; @@ -241,6 +243,7 @@ class PortsOrch : public Orch, public Subject void initializePriorityGroups(Port &port); void initializePortMaximumHeadroom(Port &port); void initializeQueues(Port &port); + void initializeVoqs(Port &port); bool addHostIntfs(Port &port, string alias, sai_object_id_t &host_intfs_id); bool setHostIntfsStripTag(Port &port, sai_hostif_vlan_tag_t strip); @@ -288,7 +291,7 @@ class PortsOrch : public Orch, public Subject bool getQueueTypeAndIndex(sai_object_id_t queue_id, string &type, uint8_t &index); bool m_isQueueMapGenerated = false; - void generateQueueMapPerPort(const Port& port); + void generateQueueMapPerPort(const Port& port, bool voq); bool m_isPriorityGroupMapGenerated = false; void generatePriorityGroupMapPerPort(const Port& port); From 8dc421f54de67e8ece24bfe270f88bd684129671 Mon Sep 17 00:00:00 2001 From: Sambath Kumar Balasubramanian Date: Tue, 24 May 2022 09:56:46 -0700 Subject: [PATCH 2/7] Fix build issue --- orchagent/portsorch.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/orchagent/portsorch.cpp b/orchagent/portsorch.cpp index e8de19efd9..ccfe6ed254 100755 --- a/orchagent/portsorch.cpp +++ b/orchagent/portsorch.cpp @@ -2438,7 +2438,7 @@ bool PortsOrch::initPort(const string &alias, const string &role, const int inde /* when a port is added and queue map counter is enabled --> we need to add queue map counter for it */ if (m_isQueueMapGenerated) { - generateQueueMapPerPort(p); + generateQueueMapPerPort(p, false); } PortUpdate update = { p, true }; From 20178e959e66f95e119a5abe4e61671c62336d10 Mon Sep 17 00:00:00 2001 From: Sambath Kumar Balasubramanian Date: Thu, 22 Sep 2022 13:37:19 -0700 Subject: [PATCH 3/7] Fix compile issue. --- orchagent/p4orch/tests/fake_portorch.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/orchagent/p4orch/tests/fake_portorch.cpp b/orchagent/p4orch/tests/fake_portorch.cpp index 5224ec55af..f9098f6639 100644 --- a/orchagent/p4orch/tests/fake_portorch.cpp +++ b/orchagent/p4orch/tests/fake_portorch.cpp @@ -185,7 +185,7 @@ void PortsOrch::generateQueueMap(std::map queues { } -void PortsOrch::generateQueueMapPerPort(const Port& port, FlexCounterQueueStates& queuesState) +void PortsOrch::generateQueueMapPerPort(const Port& port, FlexCounterQueueStates& queuesState, bool voq) { } From 89f6ec74271647436683e42795d9488063dc94d1 Mon Sep 17 00:00:00 2001 From: Sambath Kumar Balasubramanian Date: Thu, 22 Sep 2022 13:37:19 -0700 Subject: [PATCH 4/7] Fix compile issue. --- orchagent/portsorch.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/orchagent/portsorch.cpp b/orchagent/portsorch.cpp index 6fad616784..f079322d8c 100755 --- a/orchagent/portsorch.cpp +++ b/orchagent/portsorch.cpp @@ -6017,13 +6017,15 @@ void PortsOrch::generateQueueMap(map queuesState generateQueueMapPerPort(it.second, queuesStateVector.at(it.second.m_alias), false); if (gMySwitchType == "voq") { - generateQueueMapPerPort(it.second, FlexCounterQueueStates(), true); + // pass a dummy FlexCounterQueueStates since it is not used for voqs. + generateQueueMapPerPort(it.second, FlexCounterQueueStates(0), true); } } if (it.second.m_type == Port::SYSTEM) { - generateQueueMapPerPort(it.second, FlexCounterQueueStates(), true); + // pass a dummy FlexCounterQueueStates since it is not used for voqs. + generateQueueMapPerPort(it.second, FlexCounterQueueStates(0), true); } } From 91ca4978a887a7c3458494c309d87cfb5c411752 Mon Sep 17 00:00:00 2001 From: Sambath Kumar Balasubramanian Date: Thu, 22 Sep 2022 13:56:46 -0700 Subject: [PATCH 5/7] Fix compile error. --- orchagent/portsorch.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/orchagent/portsorch.cpp b/orchagent/portsorch.cpp index f079322d8c..4d5c47d873 100755 --- a/orchagent/portsorch.cpp +++ b/orchagent/portsorch.cpp @@ -6018,14 +6018,16 @@ void PortsOrch::generateQueueMap(map queuesState if (gMySwitchType == "voq") { // pass a dummy FlexCounterQueueStates since it is not used for voqs. - generateQueueMapPerPort(it.second, FlexCounterQueueStates(0), true); + FlexCounterQueueStates counterState(0); + generateQueueMapPerPort(it.second, counterState, true); } } if (it.second.m_type == Port::SYSTEM) { // pass a dummy FlexCounterQueueStates since it is not used for voqs. - generateQueueMapPerPort(it.second, FlexCounterQueueStates(0), true); + FlexCounterQueueStates counterState(0); + generateQueueMapPerPort(it.second, counterState, true); } } From cc5f0fd6034d89de429cf2be2bd96354ec181fe0 Mon Sep 17 00:00:00 2001 From: Sambath Kumar Balasubramanian Date: Fri, 23 Sep 2022 15:15:05 -0700 Subject: [PATCH 6/7] Fix build. --- orchagent/portsorch.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/orchagent/portsorch.cpp b/orchagent/portsorch.cpp index 483ca9140c..4a63577540 100755 --- a/orchagent/portsorch.cpp +++ b/orchagent/portsorch.cpp @@ -2803,7 +2803,7 @@ bool PortsOrch::initPort(const string &alias, const string &role, const int inde /* when a port is added and queue map counter is enabled --> we need to add queue map counter for it */ if (m_isQueueMapGenerated) { - generateQueueMapPerPort(p); + generateQueueMapPerPort(p, false); } PortUpdate update = { p, true }; @@ -6041,9 +6041,7 @@ void PortsOrch::generateQueueMap() if (it.second.m_type == Port::SYSTEM) { - // pass a dummy FlexCounterQueueStates since it is not used for voqs. - FlexCounterQueueStates counterState(0); - generateQueueMapPerPort(it.second, counterState, true); + generateQueueMapPerPort(it.second, true); } } From f81620885c256ca4506d3dad4d7587413088231d Mon Sep 17 00:00:00 2001 From: Sambath Kumar Balasubramanian Date: Tue, 4 Oct 2022 11:13:19 -0700 Subject: [PATCH 7/7] Move the m_voq_ids to the parent class --- orchagent/port.h | 2 +- orchagent/portsorch.cpp | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/orchagent/port.h b/orchagent/port.h index 5df021ec82..7df17edb20 100644 --- a/orchagent/port.h +++ b/orchagent/port.h @@ -56,7 +56,6 @@ struct SystemPortInfo std::string alias = ""; sai_system_port_type_t type = SAI_SYSTEM_PORT_TYPE_LOCAL; sai_object_id_t local_port_oid = 0; - std::vector m_voq_ids; uint32_t port_id = 0; uint32_t switch_id = 0; uint32_t core_index = 0; @@ -145,6 +144,7 @@ class Port std::set m_members; std::set m_child_ports; std::vector m_queue_ids; + std::vector m_voq_ids; std::vector m_priority_group_ids; sai_port_priority_flow_control_mode_t m_pfc_asym = SAI_PORT_PRIORITY_FLOW_CONTROL_MODE_COMBINED; uint8_t m_pfc_bitmask = 0; // PFC enable bit mask diff --git a/orchagent/portsorch.cpp b/orchagent/portsorch.cpp index 4a63577540..057e7cbe1b 100755 --- a/orchagent/portsorch.cpp +++ b/orchagent/portsorch.cpp @@ -4537,7 +4537,7 @@ void PortsOrch::initializeVoqs(Port &port) } SWSS_LOG_INFO("Get %d voq for port %s", attr.value.u32, port.m_alias.c_str()); - port.m_system_port_info.m_voq_ids.resize(attr.value.u32); + port.m_voq_ids.resize(attr.value.u32); if (attr.value.u32 == 0) { @@ -4545,8 +4545,8 @@ void PortsOrch::initializeVoqs(Port &port) } attr.id = SAI_SYSTEM_PORT_ATTR_QOS_VOQ_LIST; - attr.value.objlist.count = (uint32_t)port.m_system_port_info.m_voq_ids.size(); - attr.value.objlist.list = port.m_system_port_info.m_voq_ids.data(); + attr.value.objlist.count = (uint32_t)port.m_voq_ids.size(); + attr.value.objlist.list = port.m_voq_ids.data(); status = sai_system_port_api->get_system_port_attribute( port.m_system_port_oid, 1, &attr); @@ -6097,7 +6097,7 @@ void PortsOrch::generateQueueMapPerPort(const Port& port, bool voq) std::vector queue_ids; if (voq) { - queue_ids = port.m_system_port_info.m_voq_ids; + queue_ids = port.m_voq_ids; } else {