ACK: [PATCH][SRU][Disco] net: hns3: fix for not calculating tx bd num correctly

You-Sheng Yang vicamo.yang at canonical.com
Thu Apr 11 04:14:45 UTC 2019


Acked-By: You-Sheng Yang <vicamo.yang at canonical.com>

On 2019/4/11 1:08 AM, dann frazier wrote:
> From: Yunsheng Lin <linyunsheng at huawei.com>
> 
> BugLink: https://bugs.launchpad.net/bugs/1824194
> 
> When there is only one byte in a frag, the current calculation
> using "(size + HNS3_MAX_BD_SIZE - 1) >> HNS3_MAX_BD_SIZE_OFFSET"
> will return zero, because HNS3_MAX_BD_SIZE is 65535 and
> HNS3_MAX_BD_SIZE_OFFSET is 16. So it will cause tx error when
> a frag's size is one byte.
> 
> This patch fixes it by using DIV_ROUND_UP.
> 
> Fixes: 3fe13ed95dd3 ("net: hns3: avoid mult + div op in critical data path")
> Signed-off-by: Yunsheng Lin <linyunsheng at huawei.com>
> Signed-off-by: David S. Miller <davem at davemloft.net>
> (cherry picked from commit 5f543a54eec08228ab0cc0a49cf5d79dd32c9e5e)
> Signed-off-by: dann frazier <dann.frazier at canonical.com>
> ---
>  drivers/net/ethernet/hisilicon/hns3/hns3_enet.c | 13 ++++++-------
>  drivers/net/ethernet/hisilicon/hns3/hns3_enet.h |  1 -
>  2 files changed, 6 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
> index 1c1f17ec6be2d..162cb9afa0e70 100644
> --- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
> +++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
> @@ -22,6 +22,7 @@
>  #include "hns3_enet.h"
>  
>  #define hns3_set_field(origin, shift, val)	((origin) |= ((val) << (shift)))
> +#define hns3_tx_bd_count(S)	DIV_ROUND_UP(S, HNS3_MAX_BD_SIZE)
>  
>  static void hns3_clear_all_ring(struct hnae3_handle *h);
>  static void hns3_force_clear_all_rx_ring(struct hnae3_handle *h);
> @@ -1079,7 +1080,7 @@ static int hns3_fill_desc(struct hns3_enet_ring *ring, void *priv,
>  
>  	desc_cb->length = size;
>  
> -	frag_buf_num = (size + HNS3_MAX_BD_SIZE - 1) >> HNS3_MAX_BD_SIZE_OFFSET;
> +	frag_buf_num = hns3_tx_bd_count(size);
>  	sizeoflast = size & HNS3_TX_LAST_SIZE_M;
>  	sizeoflast = sizeoflast ? sizeoflast : HNS3_MAX_BD_SIZE;
>  
> @@ -1124,14 +1125,13 @@ static int hns3_nic_maybe_stop_tso(struct sk_buff **out_skb, int *bnum,
>  	int i;
>  
>  	size = skb_headlen(skb);
> -	buf_num = (size + HNS3_MAX_BD_SIZE - 1) >> HNS3_MAX_BD_SIZE_OFFSET;
> +	buf_num = hns3_tx_bd_count(size);
>  
>  	frag_num = skb_shinfo(skb)->nr_frags;
>  	for (i = 0; i < frag_num; i++) {
>  		frag = &skb_shinfo(skb)->frags[i];
>  		size = skb_frag_size(frag);
> -		bdnum_for_frag = (size + HNS3_MAX_BD_SIZE - 1) >>
> -				 HNS3_MAX_BD_SIZE_OFFSET;
> +		bdnum_for_frag = hns3_tx_bd_count(size);
>  		if (unlikely(bdnum_for_frag > HNS3_MAX_BD_PER_FRAG))
>  			return -ENOMEM;
>  
> @@ -1139,8 +1139,7 @@ static int hns3_nic_maybe_stop_tso(struct sk_buff **out_skb, int *bnum,
>  	}
>  
>  	if (unlikely(buf_num > HNS3_MAX_BD_PER_FRAG)) {
> -		buf_num = (skb->len + HNS3_MAX_BD_SIZE - 1) >>
> -			  HNS3_MAX_BD_SIZE_OFFSET;
> +		buf_num = hns3_tx_bd_count(skb->len);
>  		if (ring_space(ring) < buf_num)
>  			return -EBUSY;
>  		/* manual split the send packet */
> @@ -1169,7 +1168,7 @@ static int hns3_nic_maybe_stop_tx(struct sk_buff **out_skb, int *bnum,
>  	buf_num = skb_shinfo(skb)->nr_frags + 1;
>  
>  	if (unlikely(buf_num > HNS3_MAX_BD_PER_FRAG)) {
> -		buf_num = (skb->len + HNS3_MAX_BD_SIZE - 1) / HNS3_MAX_BD_SIZE;
> +		buf_num = hns3_tx_bd_count(skb->len);
>  		if (ring_space(ring) < buf_num)
>  			return -EBUSY;
>  		/* manual split the send packet */
> diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h
> index 1db0bd41d2096..75669cd0c3114 100644
> --- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h
> +++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h
> @@ -193,7 +193,6 @@ enum hns3_nic_state {
>  #define HNS3_VECTOR_INITED			1
>  
>  #define HNS3_MAX_BD_SIZE			65535
> -#define HNS3_MAX_BD_SIZE_OFFSET		16
>  #define HNS3_MAX_BD_PER_FRAG			8
>  #define HNS3_MAX_BD_PER_PKT			MAX_SKB_FRAGS
>  
> 

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: OpenPGP digital signature
URL: <https://lists.ubuntu.com/archives/kernel-team/attachments/20190411/197893ac/attachment-0001.sig>


More information about the kernel-team mailing list