From 89d0728401efc53c833c8fc1cc82099ac86165f1 Mon Sep 17 00:00:00 2001 From: Prince Sunny Date: Fri, 26 Mar 2021 08:33:12 -0700 Subject: [PATCH] Revert "Revert "[buffermgr] Support maximum port headroom checking (#1607)" (#1675)" (#1682) This reverts commit acfcb85d1dcaa717a0734ed9af95f36e5399e502 effectively re-merging https://github.com/Azure/sonic-swss/pull/1607 --- cfgmgr/buffer_check_headroom_mellanox.lua | 28 ++--------------------- orchagent/port.h | 1 + orchagent/portsorch.cpp | 23 +++++++++++++++++++ orchagent/portsorch.h | 3 +++ 4 files changed, 29 insertions(+), 26 deletions(-) diff --git a/cfgmgr/buffer_check_headroom_mellanox.lua b/cfgmgr/buffer_check_headroom_mellanox.lua index da4a443b1b40..510a967b7303 100644 --- a/cfgmgr/buffer_check_headroom_mellanox.lua +++ b/cfgmgr/buffer_check_headroom_mellanox.lua @@ -10,36 +10,15 @@ local new_pg = ARGV[3] local accumulative_size = 0 local appl_db = "0" -local config_db = "4" local state_db = "6" local ret_true = {} -local ret_false = {} local ret = {} local default_ret = {} table.insert(ret_true, "result:true") -table.insert(ret_false, "result:false") --- Fetch the cable length from CONFIG_DB -redis.call('SELECT', config_db) -local cable_length_keys = redis.call('KEYS', 'CABLE_LENGTH*') -if #cable_length_keys == 0 then - return ret_true -end - --- Check whether cable length exceeds 300m (maximum value in the non-dynamic-buffer solution) -local cable_length_str = redis.call('HGET', cable_length_keys[1], port) -if cable_length_str == nil then - return ret_true -end -local cable_length = tonumber(string.sub(cable_length_str, 1, -2)) -if cable_length > 300 then - default_ret = ret_false -else - default_ret = ret_true -end -table.insert(default_ret, 'debug:no max_headroom_size configured, check cable length instead') +default_ret = ret_true local speed = redis.call('HGET', 'PORT|' .. port, 'speed') @@ -67,7 +46,6 @@ local function get_number_of_pgs(keyname) local range = string.match(keyname, "Ethernet%d+:([^%s]+)$") local size if range == nil then - table.insert(debuginfo, "debug:invalid pg:" .. keyname) return 0 end if string.len(range) == 1 then @@ -119,11 +97,9 @@ if max_headroom_size > accumulative_size then table.insert(ret, "result:true") else table.insert(ret, "result:false") + table.insert(ret, "debug:Accumulative headroom on port " .. accumulative_size .. " exceeds the maximum available headroom which is " .. max_headroom_size) end -table.insert(ret, "debug:max headroom:" .. max_headroom_size) -table.insert(ret, "debug:accumulative headroom:" .. accumulative_size) - for i = 1, #debuginfo do table.insert(ret, debuginfo[i]) end diff --git a/orchagent/port.h b/orchagent/port.h index 274d2230a3a6..17131b6f4b61 100644 --- a/orchagent/port.h +++ b/orchagent/port.h @@ -124,6 +124,7 @@ class Port uint32_t m_vnid = VNID_NONE; uint32_t m_fdb_count = 0; uint32_t m_up_member_count = 0; + uint32_t m_maximum_headroom = 0; /* * Following two bit vectors are used to lock diff --git a/orchagent/portsorch.cpp b/orchagent/portsorch.cpp index 749481240bba..57b3df955589 100755 --- a/orchagent/portsorch.cpp +++ b/orchagent/portsorch.cpp @@ -263,6 +263,9 @@ PortsOrch::PortsOrch(DBConnector *db, vector &tableNames) m_flexCounterTable = unique_ptr(new ProducerTable(m_flex_db.get(), FLEX_COUNTER_TABLE)); m_flexCounterGroupTable = unique_ptr(new ProducerTable(m_flex_db.get(), FLEX_COUNTER_GROUP_TABLE)); + m_state_db = shared_ptr(new DBConnector("STATE_DB", 0)); + m_stateBufferMaximumValueTable = unique_ptr(new Table(m_state_db.get(), STATE_BUFFER_MAXIMUM_VALUE_TABLE)); + initGearbox(); string queueWmSha, pgWmSha; @@ -3322,6 +3325,25 @@ void PortsOrch::initializePriorityGroups(Port &port) SWSS_LOG_INFO("Get priority groups for port %s", port.m_alias.c_str()); } +void PortsOrch::initializePortMaximumHeadroom(Port &port) +{ + sai_attribute_t attr; + + attr.id = SAI_PORT_ATTR_QOS_MAXIMUM_HEADROOM_SIZE; + + sai_status_t status = sai_port_api->get_port_attribute(port.m_port_id, 1, &attr); + if (status != SAI_STATUS_SUCCESS) + { + SWSS_LOG_NOTICE("Unable to get the maximum headroom for port %s rv:%d, ignored", port.m_alias.c_str(), status); + return; + } + + vector fvVector; + port.m_maximum_headroom = attr.value.u32; + fvVector.emplace_back("max_headroom_size", to_string(port.m_maximum_headroom)); + m_stateBufferMaximumValueTable->set(port.m_alias, fvVector); +} + bool PortsOrch::initializePort(Port &port) { SWSS_LOG_ENTER(); @@ -3330,6 +3352,7 @@ bool PortsOrch::initializePort(Port &port) initializePriorityGroups(port); initializeQueues(port); + initializePortMaximumHeadroom(port); /* Create host interface */ if (!addHostIntfs(port, port.m_alias, port.m_hif_id)) diff --git a/orchagent/portsorch.h b/orchagent/portsorch.h index 5fcbacc0cf3c..627a4f4b38b0 100755 --- a/orchagent/portsorch.h +++ b/orchagent/portsorch.h @@ -155,6 +155,7 @@ class PortsOrch : public Orch, public Subject unique_ptr
m_pgTable; unique_ptr
m_pgPortTable; unique_ptr
m_pgIndexTable; + unique_ptr
m_stateBufferMaximumValueTable; unique_ptr m_flexCounterTable; unique_ptr m_flexCounterGroupTable; @@ -165,6 +166,7 @@ class PortsOrch : public Orch, public Subject shared_ptr m_counter_db; shared_ptr m_flex_db; + shared_ptr m_state_db; FlexCounterManager port_stat_manager; FlexCounterManager port_buffer_drop_stat_manager; @@ -227,6 +229,7 @@ class PortsOrch : public Orch, public Subject bool initializePort(Port &port); void initializePriorityGroups(Port &port); + void initializePortMaximumHeadroom(Port &port); void initializeQueues(Port &port); bool addHostIntfs(Port &port, string alias, sai_object_id_t &host_intfs_id);