aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/intel/ice/ice_sched.c
diff options
context:
space:
mode:
authorVictor Raj <victor.raj@intel.com>2019-02-08 15:50:40 -0500
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>2019-02-25 11:56:01 -0500
commitf70b9d5f4426ceee885cd6799fad4f59d33c1ce7 (patch)
treecc3f045a6962c7a7bfc7eb63aa23e9a64f5fb52d /drivers/net/ethernet/intel/ice/ice_sched.c
parent6e9650d533dda4acf8baff7ac4bb5d8193148c37 (diff)
ice: check for a leaf node presence
Check for a leaf node presence for a given VSI. This check is required before removing a VSI since VSIs can't be removed with enabled queues (with leaf nodes) from the FW scheduler tree unless its a reset. Signed-off-by: Victor Raj <victor.raj@intel.com> Reviewed-by: Bruce Allan <bruce.w.allan@intel.com> Signed-off-by: Anirudh Venkataramanan <anirudh.venkataramanan@intel.com> Tested-by: Andrew Bowers <andrewx.bowers@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Diffstat (limited to 'drivers/net/ethernet/intel/ice/ice_sched.c')
-rw-r--r--drivers/net/ethernet/intel/ice/ice_sched.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/drivers/net/ethernet/intel/ice/ice_sched.c b/drivers/net/ethernet/intel/ice/ice_sched.c
index f355f59d8b64..56049739a250 100644
--- a/drivers/net/ethernet/intel/ice/ice_sched.c
+++ b/drivers/net/ethernet/intel/ice/ice_sched.c
@@ -1616,6 +1616,23 @@ ice_sched_rm_agg_vsi_info(struct ice_port_info *pi, u16 vsi_handle)
1616} 1616}
1617 1617
1618/** 1618/**
1619 * ice_sched_is_leaf_node_present - check for a leaf node in the sub-tree
1620 * @node: pointer to the sub-tree node
1621 *
1622 * This function checks for a leaf node presence in a given sub-tree node.
1623 */
1624static bool ice_sched_is_leaf_node_present(struct ice_sched_node *node)
1625{
1626 u8 i;
1627
1628 for (i = 0; i < node->num_children; i++)
1629 if (ice_sched_is_leaf_node_present(node->children[i]))
1630 return true;
1631 /* check for a leaf node */
1632 return (node->info.data.elem_type == ICE_AQC_ELEM_TYPE_LEAF);
1633}
1634
1635/**
1619 * ice_sched_rm_vsi_cfg - remove the VSI and its children nodes 1636 * ice_sched_rm_vsi_cfg - remove the VSI and its children nodes
1620 * @pi: port information structure 1637 * @pi: port information structure
1621 * @vsi_handle: software VSI handle 1638 * @vsi_handle: software VSI handle
@@ -1649,6 +1666,12 @@ ice_sched_rm_vsi_cfg(struct ice_port_info *pi, u16 vsi_handle, u8 owner)
1649 if (!vsi_node) 1666 if (!vsi_node)
1650 continue; 1667 continue;
1651 1668
1669 if (ice_sched_is_leaf_node_present(vsi_node)) {
1670 ice_debug(pi->hw, ICE_DBG_SCHED,
1671 "VSI has leaf nodes in TC %d\n", i);
1672 status = ICE_ERR_IN_USE;
1673 goto exit_sched_rm_vsi_cfg;
1674 }
1652 while (j < vsi_node->num_children) { 1675 while (j < vsi_node->num_children) {
1653 if (vsi_node->children[j]->owner == owner) { 1676 if (vsi_node->children[j]->owner == owner) {
1654 ice_free_sched_node(pi, vsi_node->children[j]); 1677 ice_free_sched_node(pi, vsi_node->children[j]);