]> git.karo-electronics.de Git - linux-beck.git/commitdiff
net: hns: fix bug that alloc skb fail lead to port unavailable
authorJun He <hjat2005@huawei.com>
Tue, 21 Jun 2016 03:56:36 +0000 (11:56 +0800)
committerDavid S. Miller <davem@davemloft.net>
Tue, 21 Jun 2016 08:51:55 +0000 (04:51 -0400)
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>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/hisilicon/hns/hns_enet.c

index f49246dfa40c46e4412949a7c887be9474a7c9e2..c0ce37b1702cdb1388889df4f0cba259d0832124 100644 (file)
@@ -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);