> -----Original Message-----
> From: Intel-wired-lan <[email protected]> On Behalf Of Jose
> Ignacio Tornos Martinez
> Sent: Wednesday, April 29, 2026 12:24 PM
> To: [email protected]
> Cc: [email protected]; Kitszel, Przemyslaw
> <[email protected]>; Loktionov, Aleksandr
> <[email protected]>; Keller, Jacob E <[email protected]>;
> [email protected]; [email protected]; Nguyen, Anthony L
> <[email protected]>; [email protected]; [email protected];
> [email protected]; [email protected]; Jose Ignacio Tornos Martinez
> <[email protected]>
> Subject: [Intel-wired-lan] [PATCH net v5 2/4] i40e: skip unnecessary VF reset
> when setting trust
> 
> The current implementation triggers a VF reset when changing the trust 
> setting,
> causing a ~10 second delay during bonding setup.
> 
> In all the cases, the reset causes a ~10 second delay during which:
> - VF must reinitialize completely
> - Any in-progress operations (like bonding enslave) fail with timeouts
> - VF is unavailable
> 
> When granting trust, no reset is needed - we can just set the capability flag 
> to
> allow privileged operations.
> 
> When revoking trust, we only need to reset (conservative approach) if the VF 
> has
> actually configured advanced features that require cleanup (ADQ/cloud filters,
> promiscuous mode). For VFs in a clean state, we can safely change the trust
> setting without the disruptive reset.
> 
> When we don't reset, we manually handle capability flag via helper function,
> eliminating the delay.
> 
> Signed-off-by: Jose Ignacio Tornos Martinez <[email protected]>
> ---
> v5: kdoc should end with '*/' not '**/' (new function)
>     Address AI review (sashiko.dev) from Simon Horman:
>     -  Adopt a conservative approach checking multiple conditions before
>        skipping reset: ADQ, cloud filters, promiscuous mode
>     - Simplify helper function to only handle capability flag
> v4: https://lore.kernel.org/all/20260423130405.139568-3-
> [email protected]/
> 
>  .../ethernet/intel/i40e/i40e_virtchnl_pf.c    | 38 ++++++++++++++-----
>  1 file changed, 28 insertions(+), 10 deletions(-)
> 
> diff --git a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
> b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
> index a26c3d47ec15..0cc434b26eb8 100644
> --- a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
> +++ b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
> @@ -4943,6 +4943,23 @@ int i40e_ndo_set_vf_spoofchk(struct net_device
> *netdev, int vf_id, bool enable)
>       return ret;
>  }
> 
> +/**
> + * i40e_setup_vf_trust - Enable/disable VF trust mode without reset
> + * @vf: VF to configure
> + * @setting: trust setting
> + *
> + * Update VF flags when changing trust without performing a VF reset.
> + * This is only called when it's safe to skip the reset (VF has no
> +advanced
> + * features configured that need cleanup).
> + */
> +static void i40e_setup_vf_trust(struct i40e_vf *vf, bool setting) {
> +     if (setting)
> +             set_bit(I40E_VIRTCHNL_VF_CAP_PRIVILEGE, &vf->vf_caps);
> +     else
> +             clear_bit(I40E_VIRTCHNL_VF_CAP_PRIVILEGE, &vf->vf_caps); }
> +
>  /**
>   * i40e_ndo_set_vf_trust
>   * @netdev: network interface device structure of the pf @@ -4987,19 +5004,20
> @@ int i40e_ndo_set_vf_trust(struct net_device *netdev, int vf_id, bool 
> setting)
>       set_bit(__I40E_MACVLAN_SYNC_PENDING, pf->state);
>       pf->vsi[vf->lan_vsi_idx]->flags |= I40E_VSI_FLAG_FILTER_CHANGED;
> 
> -     i40e_vc_reset_vf(vf, true);
> +     /* Reset only if revoking trust and VF has advanced features configured
> */
> +     if (!setting &&
> +         (vf->adq_enabled || vf->num_cloud_filters > 0 ||
> +          test_bit(I40E_VF_STATE_UC_PROMISC, &vf->vf_states) ||
> +          test_bit(I40E_VF_STATE_MC_PROMISC, &vf->vf_states))) {
> +             i40e_vc_reset_vf(vf, true);
> +             i40e_del_all_cloud_filters(vf);
> +     } else {
> +             i40e_setup_vf_trust(vf, setting);
> +     }
> +
>       dev_info(&pf->pdev->dev, "VF %u is now %strusted\n",
>                vf_id, setting ? "" : "un");
> 
> -     if (vf->adq_enabled) {
> -             if (!vf->trusted) {
> -                     dev_info(&pf->pdev->dev,
> -                              "VF %u no longer Trusted, deleting all cloud
> filters\n",
> -                              vf_id);
> -                     i40e_del_all_cloud_filters(vf);
> -             }
> -     }
> -
>  out:
>       clear_bit(__I40E_VIRTCHNL_OP_PENDING, pf->state);
>       return ret;
> --
> 2.53.0


Tested-by: Rafal Romanowski <[email protected]>

Reply via email to