Commit 3a31b64e authored by Jun He's avatar Jun He Committed by David S. Miller

net: hns: fix bug that alloc skb fail lead to port unavailable

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: default avatarJun He <hjat2005@huawei.com>
Signed-off-by: default avatarDing Tianhong <dingtianhong@huawei.com>
Signed-off-by: default avatarYisen Zhuang <Yisen.Zhuang@huawei.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent d8a8371e
...@@ -768,10 +768,10 @@ static int hns_nic_rx_poll_one(struct hns_nic_ring_data *ring_data, ...@@ -768,10 +768,10 @@ static int hns_nic_rx_poll_one(struct hns_nic_ring_data *ring_data,
clean_count = 0; clean_count = 0;
} }
/* poll one pkg*/ /* poll one pkt*/
err = hns_nic_poll_rx_skb(ring_data, &skb, &bnum); err = hns_nic_poll_rx_skb(ring_data, &skb, &bnum);
if (unlikely(!skb)) /* this fault cannot be repaired */ if (unlikely(!skb)) /* this fault cannot be repaired */
break; goto out;
recv_bds += bnum; recv_bds += bnum;
clean_count += bnum; clean_count += bnum;
...@@ -797,6 +797,7 @@ static int hns_nic_rx_poll_one(struct hns_nic_ring_data *ring_data, ...@@ -797,6 +797,7 @@ static int hns_nic_rx_poll_one(struct hns_nic_ring_data *ring_data,
} }
} }
out:
/* make all data has been write before submit */ /* make all data has been write before submit */
if (clean_count > 0) if (clean_count > 0)
hns_nic_alloc_rx_buffers(ring_data, clean_count); hns_nic_alloc_rx_buffers(ring_data, clean_count);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment