[dpdk-dev] [PATCH] net/i40e: fix flow control watermark mismatch

Kevin Traynor ktraynor at redhat.com
Thu Aug 10 17:15:32 CEST 2017


On 08/10/2017 11:48 AM, Qi Zhang wrote:
> Flow control watermark is not read out correctly,
> that may cause an application who not intend to change
> watermark but does change it with a rte_eth_dev_flow_ctrl_set
> call right after rte_eth_dev_flow_ctrl_get.
> 
> Fixes: f53577f06925 ("i40e: support flow control")
> Cc: stable at dpdk.org
> 
> Signed-off-by: Qi Zhang <qi.z.zhang at intel.com>
> ---
>  drivers/net/i40e/i40e_ethdev.c | 19 +++++++++++++------
>  1 file changed, 13 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
> index 71cb7d3..8b008c4 100644
> --- a/drivers/net/i40e/i40e_ethdev.c
> +++ b/drivers/net/i40e/i40e_ethdev.c
> @@ -86,12 +86,6 @@
>  /* Flow control default timer */
>  #define I40E_DEFAULT_PAUSE_TIME 0xFFFFU
>  
> -/* Flow control default high water */
> -#define I40E_DEFAULT_HIGH_WATER (0x1C40/1024)
> -
> -/* Flow control default low water */
> -#define I40E_DEFAULT_LOW_WATER  (0x1A40/1024)
> -
>  /* Flow control enable fwd bit */
>  #define I40E_PRTMAC_FWD_CTRL   0x00000001
>  
> @@ -101,6 +95,12 @@
>  /* Kilobytes shift */
>  #define I40E_KILOSHIFT 10
>  
> +/* Flow control default high water */
> +#define I40E_DEFAULT_HIGH_WATER (0xF2000 >> I40E_KILOSHIFT)
> +
> +/* Flow control default low water */
> +#define I40E_DEFAULT_LOW_WATER  (0xF2000 >> I40E_KILOSHIFT)
> +

I'm not sure these are needed anymore. Would seem if you want a correct
value prior to flow_ctl_get() being called, the registers should also be
read during init. Is there a need for the PMD to have the correct value
prior to flow_ctrl_get() ? I didn't see one.

>  /* Receive Average Packet Size in Byte*/
>  #define I40E_PACKET_AVERAGE_SIZE 128
>  
> @@ -3199,6 +3199,13 @@ i40e_flow_ctrl_get(struct rte_eth_dev *dev, struct rte_eth_fc_conf *fc_conf)
>  	struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
>  
>  	fc_conf->pause_time = pf->fc_conf.pause_time;
> +
> +	/* read out from register, in case they are modified by other port */
> +	pf->fc_conf.high_water[I40E_MAX_TRAFFIC_CLASS] =
> +		I40E_READ_REG(hw, I40E_GLRPB_GHW) >> I40E_KILOSHIFT;
> +	pf->fc_conf.low_water[I40E_MAX_TRAFFIC_CLASS] =
> +		I40E_READ_REG(hw, I40E_GLRPB_GLW) >> I40E_KILOSHIFT;
> +
>  	fc_conf->high_water =  pf->fc_conf.high_water[I40E_MAX_TRAFFIC_CLASS];
>  	fc_conf->low_water = pf->fc_conf.low_water[I40E_MAX_TRAFFIC_CLASS];
>  
> 



More information about the dev mailing list