On Wed, Jul 31, 2024 at 6:56 PM Jacob Keller <jacob.e.kel...@intel.com> wrote: > > When adding a switch filter (such as a MAC or VLAN filter), it is expected > that the driver will detect the case where the filter already exists, and > return -EEXIST. This is used by calling code such as ice_vc_add_mac_addr, > and ice_vsi_add_vlan to avoid incrementing the accounting fields such as > vsi->num_vlan or vf->num_mac. > > This logic works correctly for the case where only a single VSI has added a > given switch filter. > > When a second VSI adds the same switch filter, the driver converts the > existing filter from an ICE_FWD_TO_VSI filter into an ICE_FWD_TO_VSI_LIST > filter. This saves switch resources, by ensuring that multiple VSIs can > re-use the same filter. > > The ice_add_update_vsi_list() function is responsible for doing this > conversion. When first converting a filter from the FWD_TO_VSI into > FWD_TO_VSI_LIST, it checks if the VSI being added is the same as the > existing rule's VSI. In such a case it returns -EEXIST. > > However, when the switch rule has already been converted to a > FWD_TO_VSI_LIST, the logic is different. Adding a new VSI in this case just > requires extending the VSI list entry. The logic for checking if the rule > already exists in this case returns 0 instead of -EEXIST. > > This breaks the accounting logic mentioned above, so the counters for how > many MAC and VLAN filters exist for a given VF or VSI no longer accurately > reflect the actual count. This breaks other code which relies on these > counts. > > In typical usage this primarily affects such filters generally shared by > multiple VSIs such as VLAN 0, or broadcast and multicast MAC addresses. > > Fix this by correctly reporting -EEXIST in the case of adding the same VSI > to a switch rule already converted to ICE_FWD_TO_VSI_LIST. > > Fixes: 9daf8208dd4d ("ice: Add support for switch filter programming") > Signed-off-by: Jacob Keller <jacob.e.kel...@intel.com> > --- > --- > drivers/net/ethernet/intel/ice/ice_switch.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/drivers/net/ethernet/intel/ice/ice_switch.c > b/drivers/net/ethernet/intel/ice/ice_switch.c > index fe8847184cb1..0160f0bae8d6 100644
Reviewed-by: Michal Schmidt <mschm...@redhat.com>