linux-yocto/drivers/net/ethernet/intel/i40e
Aleksandr Loktionov f30490e969 i40e: fix race condition by adding filter's intermediate sync state
Fix a race condition in the i40e driver that leads to MAC/VLAN filters
becoming corrupted and leaking. Address the issue that occurs under
heavy load when multiple threads are concurrently modifying MAC/VLAN
filters by setting mac and port VLAN.

1. Thread T0 allocates a filter in i40e_add_filter() within
        i40e_ndo_set_vf_port_vlan().
2. Thread T1 concurrently frees the filter in __i40e_del_filter() within
        i40e_ndo_set_vf_mac().
3. Subsequently, i40e_service_task() calls i40e_sync_vsi_filters(), which
        refers to the already freed filter memory, causing corruption.

Reproduction steps:
1. Spawn multiple VFs.
2. Apply a concurrent heavy load by running parallel operations to change
        MAC addresses on the VFs and change port VLANs on the host.
3. Observe errors in dmesg:
"Error I40E_AQ_RC_ENOSPC adding RX filters on VF XX,
	please set promiscuous on manually for VF XX".

Exact code for stable reproduction Intel can't open-source now.

The fix involves implementing a new intermediate filter state,
I40E_FILTER_NEW_SYNC, for the time when a filter is on a tmp_add_list.
These filters cannot be deleted from the hash list directly but
must be removed using the full process.

Fixes: 278e7d0b9d ("i40e: store MAC/VLAN filters in a hash with the MAC Address as key")
Signed-off-by: Aleksandr Loktionov <aleksandr.loktionov@intel.com>
Tested-by: Pucha Himasekhar Reddy <himasekharx.reddy.pucha@intel.com> (A Contingent worker at Intel)
Reviewed-by: Michal Schmidt <mschmidt@redhat.com>
Tested-by: Michal Schmidt <mschmidt@redhat.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
2024-11-04 13:09:34 -08:00
..
i40e_adminq_cmd.h
i40e_adminq.c
i40e_adminq.h i40e: fix: remove needless retries of NVM update 2024-07-11 17:31:52 -07:00
i40e_alloc.h
i40e_client.c i40e: Add helper to access main VSI 2024-04-30 09:33:05 -07:00
i40e_common.c net: intel: introduce {, Intel} Ethernet common library 2024-04-24 11:06:25 -07:00
i40e_dcb_nl.c
i40e_dcb.c
i40e_dcb.h
i40e_ddp.c i40e: Add helper to access main VSI 2024-04-30 09:33:05 -07:00
i40e_debug.h
i40e_debugfs.c i40e: fix race condition by adding filter's intermediate sync state 2024-11-04 13:09:34 -08:00
i40e_devids.h
i40e_devlink.c
i40e_devlink.h
i40e_diag.c
i40e_diag.h
i40e_ethtool.c i40e: Remove setting of RX software timestamp 2024-09-06 09:34:17 +01:00
i40e_hmc.c
i40e_hmc.h
i40e_io.h
i40e_lan_hmc.c
i40e_lan_hmc.h
i40e_main.c i40e: fix race condition by adding filter's intermediate sync state 2024-11-04 13:09:34 -08:00
i40e_nvm.c
i40e_prototype.h net: intel: introduce {, Intel} Ethernet common library 2024-04-24 11:06:25 -07:00
i40e_ptp.c i40e: Add helper to access main VSI 2024-04-30 09:33:05 -07:00
i40e_register.h
i40e_trace.h tracing/treewide: Remove second parameter of __assign_str() 2024-05-22 20:14:47 -04:00
i40e_txrx_common.h
i40e_txrx.c i40e: Add helper to access main VSI 2024-04-30 09:33:05 -07:00
i40e_txrx.h i40e: Refactor argument of i40e_detect_recover_hung() 2024-04-30 09:33:01 -07:00
i40e_type.h net: intel: introduce {, Intel} Ethernet common library 2024-04-24 11:06:25 -07:00
i40e_virtchnl_pf.c i40e: Fix macvlan leak by synchronizing access to mac_filter_hash 2024-10-08 14:39:21 -07:00
i40e_virtchnl_pf.h
i40e_xsk.c dma-mapping updates for Linux 6.10 2024-05-20 10:23:39 -07:00
i40e_xsk.h
i40e.h i40e: fix race condition by adding filter's intermediate sync state 2024-11-04 13:09:34 -08:00
Makefile net: intel: Use *-y instead of *-objs in Makefile 2024-06-10 19:52:44 -07:00