| From 69060e147a0af1c5bac77ea1e66321ea37870dcc Mon Sep 17 00:00:00 2001 |
| From: Yunsheng Lin <linyunsheng@huawei.com> |
| Date: Thu, 25 Apr 2019 20:42:46 +0800 |
| Subject: net: hns3: fix for TX clean num when cleaning TX BD |
| |
| [ Upstream commit 63380a1ae4ced8aef67659ff9547c69ef8b9613a ] |
| |
| hns3_desc_unused() returns how many BD have been cleaned, but new |
| buffer has not been attached to them. The register of |
| HNS3_RING_RX_RING_FBDNUM_REG returns how many BD need allocating new |
| buffer to or need to cleaned. So the remaining BD need to be clean |
| is HNS3_RING_RX_RING_FBDNUM_REG - hns3_desc_unused(). |
| |
| Also, new buffer can not attach to the pending BD when the last BD is |
| not handled, because memcpy has not been done on the first pending BD. |
| |
| This patch fixes by subtracting the pending BD num from unused_count |
| after 'HNS3_RING_RX_RING_FBDNUM_REG - unused_count' is used to calculate |
| the BD bum need to be clean. |
| |
| Fixes: e55970950556 ("net: hns3: Add handling of GRO Pkts not fully RX'ed in NAPI poll") |
| Signed-off-by: Yunsheng Lin <linyunsheng@huawei.com> |
| Signed-off-by: Peng Li <lipeng321@huawei.com> |
| Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/ethernet/hisilicon/hns3/hns3_enet.c | 3 ++- |
| 1 file changed, 2 insertions(+), 1 deletion(-) |
| |
| diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c |
| index 162cb9afa0e70..0208efe282775 100644 |
| --- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c |
| +++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c |
| @@ -2705,7 +2705,7 @@ int hns3_clean_rx_ring( |
| #define RCB_NOF_ALLOC_RX_BUFF_ONCE 16 |
| struct net_device *netdev = ring->tqp->handle->kinfo.netdev; |
| int recv_pkts, recv_bds, clean_count, err; |
| - int unused_count = hns3_desc_unused(ring) - ring->pending_buf; |
| + int unused_count = hns3_desc_unused(ring); |
| struct sk_buff *skb = ring->skb; |
| int num; |
| |
| @@ -2714,6 +2714,7 @@ int hns3_clean_rx_ring( |
| |
| recv_pkts = 0, recv_bds = 0, clean_count = 0; |
| num -= unused_count; |
| + unused_count -= ring->pending_buf; |
| |
| while (recv_pkts < budget && recv_bds < num) { |
| /* Reuse or realloc buffers */ |
| -- |
| 2.20.1 |
| |