[Intel-wired-lan] [PATCH iwl-next] ice: Remove LAG+SRIOV mutual exclusion

Michal Schmidt mschmidt at redhat.com
Sat May 13 11:18:14 UTC 2023


On Fri, May 12, 2023 at 11:08 AM Wojciech Drewek
<wojciech.drewek at intel.com> wrote:
>
> From: Dave Ertman <david.m.ertman at intel.com>
>
> There was a change previously to stop SR-IOV and LAG from existing on the
> same interface.  This was to prevent the violation of LACP (Link
> Aggregation Control Protocol).  The method to achieve this was to add a
> no-op Rx handler onto the netdev when SR-IOV VFs were present, thus
> blocking bonding, bridging, etc from claiming the interface by adding
> its own Rx handler.  Also, when an interface was added into a aggregate,
> then the SR-IOV capability was set to false.
>
> There are some users that have in house solutions using both SR-IOV and
> bridging/bonding that this method interferes with (e.g. creating duplicate
> VFs on the bonded interfaces and failing between them when the interface
> fails over).
>
> It makes more sense to provide the most functionality
> possible, the restriction on co-existence of these features will be
> removed.  No additional functionality is currently being provided beyond
> what existed before the co-existence restriction was put into place.  It is
> up to the end user to not implement a solution that would interfere with
> existing network protocols.
>
> Reviewed-by: Michal Swiatkowski <michal.swiatkowski at linux.intel.com>
> Signed-off-by: Dave Ertman <david.m.ertman at intel.com>
> Signed-off-by: Wojciech Drewek <wojciech.drewek at intel.com>
> ---
>  .../device_drivers/ethernet/intel/ice.rst     | 18 -------
>  drivers/net/ethernet/intel/ice/ice.h          | 19 -------
>  drivers/net/ethernet/intel/ice/ice_lag.c      | 12 -----
>  drivers/net/ethernet/intel/ice/ice_lag.h      | 53 -------------------
>  drivers/net/ethernet/intel/ice/ice_lib.c      |  2 -
>  drivers/net/ethernet/intel/ice/ice_sriov.c    |  4 --
>  6 files changed, 108 deletions(-)

I see that both Alexander Lobakin's and my feedback about the previous
version has been accomodated.
And thanks for updating the Documentation too.

Reviewed-by: Michal Schmidt <mschmidt at redhat.com>

> diff --git a/Documentation/networking/device_drivers/ethernet/intel/ice.rst b/Documentation/networking/device_drivers/ethernet/intel/ice.rst
> index 69695e5511f4..e4d065c55ea8 100644
> --- a/Documentation/networking/device_drivers/ethernet/intel/ice.rst
> +++ b/Documentation/networking/device_drivers/ethernet/intel/ice.rst
> @@ -84,24 +84,6 @@ Once the VM shuts down, or otherwise releases the VF, the command will
>  complete.
>
>
> -Important notes for SR-IOV and Link Aggregation
> ------------------------------------------------
> -Link Aggregation is mutually exclusive with SR-IOV.
> -
> -- If Link Aggregation is active, SR-IOV VFs cannot be created on the PF.
> -- If SR-IOV is active, you cannot set up Link Aggregation on the interface.
> -
> -Bridging and MACVLAN are also affected by this. If you wish to use bridging or
> -MACVLAN with SR-IOV, you must set up bridging or MACVLAN before enabling
> -SR-IOV. If you are using bridging or MACVLAN in conjunction with SR-IOV, and
> -you want to remove the interface from the bridge or MACVLAN, you must follow
> -these steps:
> -
> -1. Destroy SR-IOV VFs if they exist
> -2. Remove the interface from the bridge or MACVLAN
> -3. Recreate SRIOV VFs as needed
> -
> -
>  Additional Features and Configurations
>  ======================================
>
> diff --git a/drivers/net/ethernet/intel/ice/ice.h b/drivers/net/ethernet/intel/ice/ice.h
> index 8b016511561f..b4bca1d964a9 100644
> --- a/drivers/net/ethernet/intel/ice/ice.h
> +++ b/drivers/net/ethernet/intel/ice/ice.h
> @@ -814,25 +814,6 @@ static inline bool ice_is_switchdev_running(struct ice_pf *pf)
>         return pf->switchdev.is_running;
>  }
>
> -/**
> - * ice_set_sriov_cap - enable SRIOV in PF flags
> - * @pf: PF struct
> - */
> -static inline void ice_set_sriov_cap(struct ice_pf *pf)
> -{
> -       if (pf->hw.func_caps.common_cap.sr_iov_1_1)
> -               set_bit(ICE_FLAG_SRIOV_CAPABLE, pf->flags);
> -}
> -
> -/**
> - * ice_clear_sriov_cap - disable SRIOV in PF flags
> - * @pf: PF struct
> - */
> -static inline void ice_clear_sriov_cap(struct ice_pf *pf)
> -{
> -       clear_bit(ICE_FLAG_SRIOV_CAPABLE, pf->flags);
> -}
> -
>  #define ICE_FD_STAT_CTR_BLOCK_COUNT    256
>  #define ICE_FD_STAT_PF_IDX(base_idx) \
>                         ((base_idx) * ICE_FD_STAT_CTR_BLOCK_COUNT)
> diff --git a/drivers/net/ethernet/intel/ice/ice_lag.c b/drivers/net/ethernet/intel/ice/ice_lag.c
> index ee5b36941ba3..5a7753bda324 100644
> --- a/drivers/net/ethernet/intel/ice/ice_lag.c
> +++ b/drivers/net/ethernet/intel/ice/ice_lag.c
> @@ -6,15 +6,6 @@
>  #include "ice.h"
>  #include "ice_lag.h"
>
> -/**
> - * ice_lag_nop_handler - no-op Rx handler to disable LAG
> - * @pskb: pointer to skb pointer
> - */
> -rx_handler_result_t ice_lag_nop_handler(struct sk_buff __always_unused **pskb)
> -{
> -       return RX_HANDLER_PASS;
> -}
> -
>  /**
>   * ice_lag_set_primary - set PF LAG state as Primary
>   * @lag: LAG info struct
> @@ -158,7 +149,6 @@ ice_lag_link(struct ice_lag *lag, struct netdev_notifier_changeupper_info *info)
>                 lag->upper_netdev = upper;
>         }
>
> -       ice_clear_sriov_cap(pf);
>         ice_clear_rdma_cap(pf);
>
>         lag->bonded = true;
> @@ -205,7 +195,6 @@ ice_lag_unlink(struct ice_lag *lag,
>         }
>
>         lag->peer_netdev = NULL;
> -       ice_set_sriov_cap(pf);
>         ice_set_rdma_cap(pf);
>         lag->bonded = false;
>         lag->role = ICE_LAG_NONE;
> @@ -229,7 +218,6 @@ static void ice_lag_unregister(struct ice_lag *lag, struct net_device *netdev)
>         if (lag->upper_netdev) {
>                 dev_put(lag->upper_netdev);
>                 lag->upper_netdev = NULL;
> -               ice_set_sriov_cap(pf);
>                 ice_set_rdma_cap(pf);
>         }
>         /* perform some cleanup in case we come back */
> diff --git a/drivers/net/ethernet/intel/ice/ice_lag.h b/drivers/net/ethernet/intel/ice/ice_lag.h
> index 51b5cf467ce2..54d6663fe586 100644
> --- a/drivers/net/ethernet/intel/ice/ice_lag.h
> +++ b/drivers/net/ethernet/intel/ice/ice_lag.h
> @@ -26,62 +26,9 @@ struct ice_lag {
>         u8 bonded:1; /* currently bonded */
>         u8 primary:1; /* this is primary */
>         u8 handler:1; /* did we register a rx_netdev_handler */
> -       /* each thing blocking bonding will increment this value by one.
> -        * If this value is zero, then bonding is allowed.
> -        */
> -       u16 dis_lag;
>         u8 role;
>  };
>
>  int ice_init_lag(struct ice_pf *pf);
>  void ice_deinit_lag(struct ice_pf *pf);
> -rx_handler_result_t ice_lag_nop_handler(struct sk_buff **pskb);
> -
> -/**
> - * ice_disable_lag - increment LAG disable count
> - * @lag: LAG struct
> - */
> -static inline void ice_disable_lag(struct ice_lag *lag)
> -{
> -       /* If LAG this PF is not already disabled, disable it */
> -       rtnl_lock();
> -       if (!netdev_is_rx_handler_busy(lag->netdev)) {
> -               if (!netdev_rx_handler_register(lag->netdev,
> -                                               ice_lag_nop_handler,
> -                                               NULL))
> -                       lag->handler = true;
> -       }
> -       rtnl_unlock();
> -       lag->dis_lag++;
> -}
> -
> -/**
> - * ice_enable_lag - decrement disable count for a PF
> - * @lag: LAG struct
> - *
> - * Decrement the disable counter for a port, and if that count reaches
> - * zero, then remove the no-op Rx handler from that netdev
> - */
> -static inline void ice_enable_lag(struct ice_lag *lag)
> -{
> -       if (lag->dis_lag)
> -               lag->dis_lag--;
> -       if (!lag->dis_lag && lag->handler) {
> -               rtnl_lock();
> -               netdev_rx_handler_unregister(lag->netdev);
> -               rtnl_unlock();
> -               lag->handler = false;
> -       }
> -}
> -
> -/**
> - * ice_is_lag_dis - is LAG disabled
> - * @lag: LAG struct
> - *
> - * Return true if bonding is disabled
> - */
> -static inline bool ice_is_lag_dis(struct ice_lag *lag)
> -{
> -       return !!(lag->dis_lag);
> -}
>  #endif /* _ICE_LAG_H_ */
> diff --git a/drivers/net/ethernet/intel/ice/ice_lib.c b/drivers/net/ethernet/intel/ice/ice_lib.c
> index d9731476cd7f..5ddb95d1073a 100644
> --- a/drivers/net/ethernet/intel/ice/ice_lib.c
> +++ b/drivers/net/ethernet/intel/ice/ice_lib.c
> @@ -2712,8 +2712,6 @@ ice_vsi_setup(struct ice_pf *pf, struct ice_vsi_cfg_params *params)
>         return vsi;
>
>  err_vsi_cfg:
> -       if (params->type == ICE_VSI_VF)
> -               ice_enable_lag(pf->lag);
>         ice_vsi_free(vsi);
>
>         return NULL;
> diff --git a/drivers/net/ethernet/intel/ice/ice_sriov.c b/drivers/net/ethernet/intel/ice/ice_sriov.c
> index 9788f363e9dc..a222cd702fd5 100644
> --- a/drivers/net/ethernet/intel/ice/ice_sriov.c
> +++ b/drivers/net/ethernet/intel/ice/ice_sriov.c
> @@ -960,8 +960,6 @@ int ice_sriov_configure(struct pci_dev *pdev, int num_vfs)
>         if (!num_vfs) {
>                 if (!pci_vfs_assigned(pdev)) {
>                         ice_free_vfs(pf);
> -                       if (pf->lag)
> -                               ice_enable_lag(pf->lag);
>                         return 0;
>                 }
>
> @@ -973,8 +971,6 @@ int ice_sriov_configure(struct pci_dev *pdev, int num_vfs)
>         if (err)
>                 return err;
>
> -       if (pf->lag)
> -               ice_disable_lag(pf->lag);
>         return num_vfs;
>  }
>
> --
> 2.39.2
>



More information about the Intel-wired-lan mailing list