The ice_sched_agg_info structure maintains a list of VSIs associated with the aggregator node. A following change is going to refactor logic from ice_lib.c, and remove the ice_agg_node wrapper structure. Doing so will require keeping track of how many VSIs are on a given aggregator node.
To simplify this tracking, add a member to the ice_sched_agg_info structure which counts the number of VSIs using the node. Increment it when adding a VSI to the list, and decrement when removing the VSI from the list. This will avoid the need to iterate the agg_vsi_list to determine this information. Signed-off-by: Jacob Keller <[email protected]> Reviewed-by: Aleksandr Loktionov <[email protected]> --- drivers/net/ethernet/intel/ice/ice_sched.h | 1 + drivers/net/ethernet/intel/ice/ice_sched.c | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/drivers/net/ethernet/intel/ice/ice_sched.h b/drivers/net/ethernet/intel/ice/ice_sched.h index f2a619fcab8b..992aafc4369d 100644 --- a/drivers/net/ethernet/intel/ice/ice_sched.h +++ b/drivers/net/ethernet/intel/ice/ice_sched.h @@ -68,6 +68,7 @@ struct ice_sched_agg_vsi_info { struct ice_sched_agg_info { struct list_head agg_vsi_list; DECLARE_BITMAP(tc_bitmap, ICE_MAX_TRAFFIC_CLASS); + u32 num_vsis; u32 agg_id; enum ice_agg_type agg_type; /* bw_t_info saves aggregator BW information */ diff --git a/drivers/net/ethernet/intel/ice/ice_sched.c b/drivers/net/ethernet/intel/ice/ice_sched.c index a74f840cba23..bfca45f5c53c 100644 --- a/drivers/net/ethernet/intel/ice/ice_sched.c +++ b/drivers/net/ethernet/intel/ice/ice_sched.c @@ -823,8 +823,10 @@ void ice_sched_clear_agg(struct ice_hw *hw) &agg_info->agg_vsi_list, list_entry) { list_del(&agg_vsi_info->list_entry); devm_kfree(ice_hw_to_dev(hw), agg_vsi_info); + agg_info->num_vsis--; } xa_erase(&hw->agg_list, index); + WARN_ON(agg_info->num_vsis > 0); devm_kfree(ice_hw_to_dev(hw), agg_info); } } @@ -2072,6 +2074,7 @@ static void ice_sched_rm_agg_vsi_info(struct ice_port_info *pi, u16 vsi_handle) list_del(&agg_vsi_info->list_entry); devm_kfree(ice_hw_to_dev(pi->hw), agg_vsi_info); + agg_info->num_vsis--; return; } } @@ -2473,6 +2476,7 @@ ice_move_all_vsi_to_dflt_agg(struct ice_port_info *pi, if (rm_vsi_info && !agg_vsi_info->tc_bitmap[0]) { list_del(&agg_vsi_info->list_entry); devm_kfree(ice_hw_to_dev(pi->hw), agg_vsi_info); + agg_info->num_vsis--; } } @@ -2728,6 +2732,7 @@ ice_sched_cfg_agg(struct ice_port_info *pi, u32 agg_id, /* Initialize the aggregator VSI list head */ INIT_LIST_HEAD(&agg_info->agg_vsi_list); + agg_info->num_vsis = 0; /* Add new entry in aggregator array */ status = xa_insert(&hw->agg_list, agg_id, agg_info, @@ -2915,6 +2920,7 @@ ice_sched_assoc_vsi_to_agg(struct ice_port_info *pi, u32 agg_id, /* add VSI ID into the aggregator list */ agg_vsi_info->vsi_handle = vsi_handle; list_add(&agg_vsi_info->list_entry, &agg_info->agg_vsi_list); + agg_info->num_vsis++; } /* Move VSI node to new aggregator node for requested TC(s) */ ice_for_each_traffic_class(tc) { @@ -2933,6 +2939,7 @@ ice_sched_assoc_vsi_to_agg(struct ice_port_info *pi, u32 agg_id, if (old_agg_vsi_info && !old_agg_vsi_info->tc_bitmap[0]) { list_del(&old_agg_vsi_info->list_entry); devm_kfree(ice_hw_to_dev(pi->hw), old_agg_vsi_info); + old_agg_info->num_vsis--; } return status; } -- 2.54.0.1064.gd145956f57df
