diff mbox

[net-next,16/19] net: hns: fix bug that alloc skb fail lead to port unavailable

Message ID 1466481399-70080-17-git-send-email-Yisen.Zhuang@huawei.com (mailing list archive)
State New, archived
Headers show

Commit Message

Yisen.Zhuang(Zhuangyuzeng) June 21, 2016, 3:56 a.m. UTC
From: Jun He <hjat2005@huawei.com>

When hns_nic_poll_rx_skb alloc skb fail, it will break receive cycle and
read new fbd_num to start new receive cycle. It recomputes cycle num is
fbd_num minus clean_count, actually this cycle num is too big because
it drop out receive cycle. It brings about the port unavailable.

So we will goto out when alloc skb fail to fix this bug.

Signed-off-by: Jun He <hjat2005@huawei.com>
Signed-off-by: Ding Tianhong <dingtianhong@huawei.com>
Signed-off-by: Yisen Zhuang <Yisen.Zhuang@huawei.com>
---
 drivers/net/ethernet/hisilicon/hns/hns_enet.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

Comments

Sergei Shtylyov June 21, 2016, 1:25 p.m. UTC | #1
Hello.

On 6/21/2016 6:56 AM, Yisen Zhuang wrote:

> From: Jun He <hjat2005@huawei.com>
>
> When hns_nic_poll_rx_skb alloc skb fail, it will break receive cycle and
> read new fbd_num to start new receive cycle. It recomputes cycle num is
> fbd_num minus clean_count, actually this cycle num is too big because
> it drop out receive cycle. It brings about the port unavailable.
>
> So we will goto out when alloc skb fail to fix this bug.
>
> Signed-off-by: Jun He <hjat2005@huawei.com>
> Signed-off-by: Ding Tianhong <dingtianhong@huawei.com>
> Signed-off-by: Yisen Zhuang <Yisen.Zhuang@huawei.com>
> ---
>  drivers/net/ethernet/hisilicon/hns/hns_enet.c | 5 +++--
>  1 file changed, 3 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/net/ethernet/hisilicon/hns/hns_enet.c b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
> index f49246d..c0ce37b 100644
> --- a/drivers/net/ethernet/hisilicon/hns/hns_enet.c
> +++ b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
> @@ -768,10 +768,10 @@ recv:
>  			clean_count = 0;
>  		}
>
> -		/* poll one pkg*/
> +		/* poll one pkt*/

    How about adding a space before */?

[...]

MBR, Sergei
Yisen.Zhuang(Zhuangyuzeng) June 22, 2016, 1:41 a.m. UTC | #2
在 2016/6/21 21:25, Sergei Shtylyov 写道:
> Hello.
> 
> On 6/21/2016 6:56 AM, Yisen Zhuang wrote:
> 
>> From: Jun He <hjat2005@huawei.com>
>>
>> When hns_nic_poll_rx_skb alloc skb fail, it will break receive cycle and
>> read new fbd_num to start new receive cycle. It recomputes cycle num is
>> fbd_num minus clean_count, actually this cycle num is too big because
>> it drop out receive cycle. It brings about the port unavailable.
>>
>> So we will goto out when alloc skb fail to fix this bug.
>>
>> Signed-off-by: Jun He <hjat2005@huawei.com>
>> Signed-off-by: Ding Tianhong <dingtianhong@huawei.com>
>> Signed-off-by: Yisen Zhuang <Yisen.Zhuang@huawei.com>
>> ---
>>  drivers/net/ethernet/hisilicon/hns/hns_enet.c | 5 +++--
>>  1 file changed, 3 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/net/ethernet/hisilicon/hns/hns_enet.c b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
>> index f49246d..c0ce37b 100644
>> --- a/drivers/net/ethernet/hisilicon/hns/hns_enet.c
>> +++ b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
>> @@ -768,10 +768,10 @@ recv:
>>              clean_count = 0;
>>          }
>>
>> -        /* poll one pkg*/
>> +        /* poll one pkt*/

I will fix it with a new patch.

Thanks,

Yisen

> 
>    How about adding a space before */?
> 
> [...]
> 
> MBR, Sergei
> 
> 
> .
>
diff mbox

Patch

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_enet.c b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
index f49246d..c0ce37b 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_enet.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
@@ -768,10 +768,10 @@  recv:
 			clean_count = 0;
 		}
 
-		/* poll one pkg*/
+		/* poll one pkt*/
 		err = hns_nic_poll_rx_skb(ring_data, &skb, &bnum);
 		if (unlikely(!skb)) /* this fault cannot be repaired */
-			break;
+			goto out;
 
 		recv_bds += bnum;
 		clean_count += bnum;
@@ -797,6 +797,7 @@  recv:
 		}
 	}
 
+out:
 	/* make all data has been write before submit */
 	if (clean_count > 0)
 		hns_nic_alloc_rx_buffers(ring_data, clean_count);