[Intel-wired-lan] [PATCH v2 5/6] [net-next]net: i40e: Refactor VF BW rate limiting function to be reused on the PF as well
Shannon Nelson
shannon.nelson at oracle.com
Thu Aug 17 19:43:49 UTC 2017
On 8/17/2017 3:01 AM, Amritha Nambiar wrote:
> This patch refactors the BW rate limiting for Tx traffic
> on the VF to be reused in the next patch for rate limiting Tx
> traffic for the VSIs on the PF as well.
>
> Signed-off-by: Amritha Nambiar <amritha.nambiar at intel.com>
> ---
> drivers/net/ethernet/intel/i40e/i40e.h | 5 ++
> drivers/net/ethernet/intel/i40e/i40e_main.c | 63 ++++++++++++++++++++
> drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c | 45 +-------------
> 3 files changed, 70 insertions(+), 43 deletions(-)
>
> diff --git a/drivers/net/ethernet/intel/i40e/i40e.h b/drivers/net/ethernet/intel/i40e/i40e.h
> index 2565280..304921e 100644
> --- a/drivers/net/ethernet/intel/i40e/i40e.h
> +++ b/drivers/net/ethernet/intel/i40e/i40e.h
> @@ -128,6 +128,10 @@
> /* default to trying for four seconds */
> #define I40E_TRY_LINK_TIMEOUT (4 * HZ)
>
> +/* BW rate limiting */
> +#define I40E_BW_CREDIT_DIVISOR 50 /* 50Mbps per BW credit */
> +#define I40E_MAX_BW_INACTIVE_ACCUM 4 /* accumulate 4 credits max */
> +
> /* driver state flags */
> enum i40e_state_t {
> __I40E_TESTING,
> @@ -1042,4 +1046,5 @@ static inline bool i40e_enabled_xdp_vsi(struct i40e_vsi *vsi)
> }
>
> int i40e_create_queue_channel(struct i40e_vsi *vsi, struct i40e_channel *ch);
> +int i40e_set_bw_limit(struct i40e_vsi *vsi, u16 seid, u64 max_tx_rate);
> #endif /* _I40E_H_ */
> diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c
> index 5b783fc..fcf563a 100644
> --- a/drivers/net/ethernet/intel/i40e/i40e_main.c
> +++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
> @@ -5405,6 +5405,69 @@ static int i40e_vsi_config_tc(struct i40e_vsi *vsi, u8 enabled_tc)
> }
>
> /**
> + * i40e_get_link_speed - Returns link speed for the interface
> + * @vsi: VSI to be configured
> + *
> + **/
> +int i40e_get_link_speed(struct i40e_vsi *vsi)
> +{
> + struct i40e_pf *pf = vsi->back;
> +
> + switch (pf->hw.phy.link_info.link_speed) {
> + case I40E_LINK_SPEED_40GB:
> + return 40000;
> + case I40E_LINK_SPEED_25GB:
> + return 25000;
> + case I40E_LINK_SPEED_20GB:
> + return 20000;
> + case I40E_LINK_SPEED_10GB:
> + return 10000;
> + case I40E_LINK_SPEED_1GB:
> + return 1000;
> + default:
> + return -EINVAL;
> + }
> +}
> +
> +/**
> + * i40e_set_bw_limit - setup BW limit for Tx traffic based on max_tx_rate
> + * @vsi: VSI to be configured
> + * @seid: seid of the channel/VSI
> + * @max_tx_rate: max TX rate to be configured as BW limit
> + *
> + * Helper function to set BW limit for a given VSI
> + **/
> +int i40e_set_bw_limit(struct i40e_vsi *vsi, u16 seid, u64 max_tx_rate)
> +{
> + struct i40e_pf *pf = vsi->back;
> + int speed = 0;
> + int ret = 0;
> +
> + speed = i40e_get_link_speed(vsi);
> + if (max_tx_rate > speed) {
> + dev_err(&pf->pdev->dev,
> + "Invalid max tx rate %llu specified for VSI seid %d.",
> + max_tx_rate, seid);
> + return -EINVAL;
> + }
> + if ((max_tx_rate < 50) && (max_tx_rate > 0)) {
if (max_tx_rate && (max_tx_rate < 50)) {
> + dev_warn(&pf->pdev->dev,
> + "Setting max tx rate to minimum usable value of 50Mbps.\n");
> + max_tx_rate = 50;
> + }
> +
> + /* Tx rate credits are in values of 50Mbps, 0 is disabled*/
This should be indented with a tab, not spaces
> + ret = i40e_aq_config_vsi_bw_limit(&pf->hw, seid,
> + max_tx_rate / I40E_BW_CREDIT_DIVISOR,
> + I40E_MAX_BW_INACTIVE_ACCUM, NULL);
> + if (ret)
> + dev_err(&pf->pdev->dev,
> + "Failed set tx rate (%llu Mbps) for vsi->seid %u, error code %d.\n",
> + max_tx_rate, seid, ret);
Please do the AQ error decode here with i40e_stat_str() and i40e_aq_str()
> + return ret;
> +}
> +
> +/**
> * i40e_remove_queue_channels - Remove queue channels for the TCs
> * @vsi: VSI to be configured
> *
> diff --git a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
> index 92fe06d..a1d2391 100644
> --- a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
> +++ b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
> @@ -3061,8 +3061,6 @@ int i40e_ndo_set_vf_port_vlan(struct net_device *netdev, int vf_id,
> return ret;
> }
>
> -#define I40E_BW_CREDIT_DIVISOR 50 /* 50Mbps per BW credit */
> -#define I40E_MAX_BW_INACTIVE_ACCUM 4 /* device can accumulate 4 credits max */
> /**
> * i40e_ndo_set_vf_bw
> * @netdev: network interface device structure
> @@ -3078,7 +3076,6 @@ int i40e_ndo_set_vf_bw(struct net_device *netdev, int vf_id, int min_tx_rate,
> struct i40e_pf *pf = np->vsi->back;
> struct i40e_vsi *vsi;
> struct i40e_vf *vf;
> - int speed = 0;
> int ret = 0;
>
> /* validate the request */
> @@ -3103,48 +3100,10 @@ int i40e_ndo_set_vf_bw(struct net_device *netdev, int vf_id, int min_tx_rate,
> goto error;
> }
>
> - switch (pf->hw.phy.link_info.link_speed) {
> - case I40E_LINK_SPEED_40GB:
> - speed = 40000;
> - break;
> - case I40E_LINK_SPEED_25GB:
> - speed = 25000;
> - break;
> - case I40E_LINK_SPEED_20GB:
> - speed = 20000;
> - break;
> - case I40E_LINK_SPEED_10GB:
> - speed = 10000;
> - break;
> - case I40E_LINK_SPEED_1GB:
> - speed = 1000;
> - break;
> - default:
> - break;
> - }
> -
> - if (max_tx_rate > speed) {
> - dev_err(&pf->pdev->dev, "Invalid max tx rate %d specified for VF %d.\n",
> - max_tx_rate, vf->vf_id);
> - ret = -EINVAL;
> + ret = i40e_set_bw_limit(vsi, vsi->seid, max_tx_rate);
> + if (ret)
> goto error;
> - }
>
> - if ((max_tx_rate < 50) && (max_tx_rate > 0)) {
> - dev_warn(&pf->pdev->dev, "Setting max Tx rate to minimum usable value of 50Mbps.\n");
> - max_tx_rate = 50;
> - }
> -
> - /* Tx rate credits are in values of 50Mbps, 0 is disabled*/
> - ret = i40e_aq_config_vsi_bw_limit(&pf->hw, vsi->seid,
> - max_tx_rate / I40E_BW_CREDIT_DIVISOR,
> - I40E_MAX_BW_INACTIVE_ACCUM, NULL);
> - if (ret) {
> - dev_err(&pf->pdev->dev, "Unable to set max tx rate, error code %d.\n",
> - ret);
> - ret = -EIO;
> - goto error;
> - }
> vf->tx_rate = max_tx_rate;
> error:
> return ret;
>
> _______________________________________________
> Intel-wired-lan mailing list
> Intel-wired-lan at osuosl.org
> https://lists.osuosl.org/mailman/listinfo/intel-wired-lan
>
More information about the Intel-wired-lan
mailing list