Re: [PATCH iwl-net 06/10] ice: keep adding MAC filters after one that already exists
From: Ivan Vecera
Date: Sat Oct 03 2026 - 05:59:02 EST
On October 2, 2026 3:07:48 PM GMT+02:00, Petr Oros <poros@xxxxxxxxxx> wrote:
>ice_add_mac() returns as soon as one entry of the list fails, including
>-EEXIST for a filter that is already programmed for the VSI. The rest of
>the list is never added. ice_vsi_sync_fltr() treats -EEXIST as success,
>so the skipped addresses are considered synced and their traffic is
>dropped until they are removed and added again.
>
>In a test that adds 50 multicast addresses to a port in a burst with
>the port MAC address in the middle of it, 19 of them were left without
>a filter.
>
>Continue with the next entry on -EEXIST and report it once the whole
>list has been processed. Other errors still stop the loop.
>
>There is no i40e counterpart of this fix, i40e keeps its MAC filters in
>a hash with a state per filter and syncs them differently. It was found
>while building a reproducer for the MAC filter overflow handling that
>i40e fixed in commit e58872398684 ("i40e: fix disabling overflow
>promiscuous mode") and commit 7363115efb04 ("i40e: do not force filter
>failure in overflow promiscuous").
>
>Commit bbb968e8b34c ("ice: Fix issues updating VSI MAC filters") dealt
>with the same problem for the VF MAC filter requests, which are now
>added one by one with -EEXIST tolerated, but left ice_add_mac() and the
>PF filter sync as they were.
>
>Fixes: 89f3e4a5b762 ("ice: Do not bail out when filter already exists")
>Assisted-by: LLM
>Signed-off-by: Petr Oros <poros@xxxxxxxxxx>
>---
> drivers/net/ethernet/intel/ice/ice_switch.c | 4 +++-
> 1 file changed, 3 insertions(+), 1 deletion(-)
>
>diff --git a/drivers/net/ethernet/intel/ice/ice_switch.c b/drivers/net/ethernet/intel/ice/ice_switch.c
>index 2ee5cb6ffdab1f..239d4d9633baa6 100644
>--- a/drivers/net/ethernet/intel/ice/ice_switch.c
>+++ b/drivers/net/ethernet/intel/ice/ice_switch.c
>@@ -3659,7 +3659,9 @@ int ice_add_mac(struct ice_hw *hw, struct list_head *m_list)
>
> m_list_itr->status = ice_add_rule_internal(hw, ICE_SW_LKUP_MAC,
> m_list_itr);
>- if (m_list_itr->status)
>+ if (m_list_itr->status == -EEXIST)
>+ status = -EEXIST;
>+ else if (m_list_itr->status)
> return m_list_itr->status;
> }
>
Reviewed-by: Ivan Vecera <ivecera@xxxxxxxxxx>