116 lines
4.1 KiB
Diff
116 lines
4.1 KiB
Diff
From 5dd2f85c9e5862d0165495d716b78a00ebb533dd Mon Sep 17 00:00:00 2001
|
|
From: Yunsheng Lin <linyunsheng@huawei.com>
|
|
Date: Thu, 18 Nov 2021 20:44:39 +0800
|
|
Subject: [PATCH 141/283] net: hns3: schedule the polling again when allocation
|
|
fails
|
|
|
|
mainline inclusion
|
|
from mainline-v5.15-rc7
|
|
commit 68752b24f51a71d4f350a764d890b670f59062c5
|
|
category: bugfix
|
|
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMYT
|
|
CVE: NA
|
|
|
|
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=68752b24f51a71d4f350a764d890b670f59062c5
|
|
|
|
----------------------------------------------------------------------
|
|
|
|
Currently when there is a rx page allocation failure, it is
|
|
possible that polling may be stopped if there is no more packet
|
|
to be reveiced, which may cause queue stall problem under memory
|
|
pressure.
|
|
|
|
This patch makes sure polling is scheduled again when there is
|
|
any rx page allocation failure, and polling will try to allocate
|
|
receive buffers until it succeeds.
|
|
|
|
Now the allocation retry is added, it is unnecessary to do the rx
|
|
page allocation at the end of rx cleaning, so remove it. And reset
|
|
the unused_count to zero after calling hns3_nic_alloc_rx_buffers()
|
|
to avoid calling hns3_nic_alloc_rx_buffers() repeatedly under
|
|
memory pressure.
|
|
|
|
Fixes: 76ad4f0ee747 ("net: hns3: Add support of HNS3 Ethernet Driver for hip08 SoC")
|
|
Signed-off-by: Yunsheng Lin <linyunsheng@huawei.com>
|
|
Signed-off-by: Guangbin Huang <huangguangbin2@huawei.com>
|
|
Signed-off-by: David S. Miller <davem@davemloft.net>
|
|
Reviewed-by: Yongxin Li <liyongxin1@huawei.com>
|
|
Signed-off-by: Junxin Chen <chenjunxin1@huawei.com>
|
|
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
|
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
|
---
|
|
.../net/ethernet/hisilicon/hns3/hns3_enet.c | 22 ++++++++++---------
|
|
1 file changed, 12 insertions(+), 10 deletions(-)
|
|
|
|
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
|
index 9acb48ff8c6f..69170427c55d 100644
|
|
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
|
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
|
@@ -3158,7 +3158,8 @@ static int hns3_desc_unused(struct hns3_enet_ring *ring)
|
|
return ((ntc >= ntu) ? 0 : ring->desc_num) + ntc - ntu;
|
|
}
|
|
|
|
-static void hns3_nic_alloc_rx_buffers(struct hns3_enet_ring *ring,
|
|
+/* Return true if there is any allocation failure */
|
|
+static bool hns3_nic_alloc_rx_buffers(struct hns3_enet_ring *ring,
|
|
int cleand_count)
|
|
{
|
|
struct hns3_desc_cb *desc_cb;
|
|
@@ -3183,7 +3184,10 @@ static void hns3_nic_alloc_rx_buffers(struct hns3_enet_ring *ring,
|
|
hns3_rl_err(ring_to_netdev(ring),
|
|
"alloc rx buffer failed: %d\n",
|
|
ret);
|
|
- break;
|
|
+
|
|
+ writel(i, ring->tqp->io_base +
|
|
+ HNS3_RING_RX_RING_HEAD_REG);
|
|
+ return true;
|
|
}
|
|
hns3_replace_buffer(ring, ring->next_to_use, &res_cbs);
|
|
|
|
@@ -3196,6 +3200,7 @@ static void hns3_nic_alloc_rx_buffers(struct hns3_enet_ring *ring,
|
|
}
|
|
|
|
writel(i, ring->tqp->io_base + HNS3_RING_RX_RING_HEAD_REG);
|
|
+ return false;
|
|
}
|
|
|
|
static bool hns3_page_is_reusable(struct page *page)
|
|
@@ -3807,6 +3812,7 @@ int hns3_clean_rx_ring(struct hns3_enet_ring *ring, int budget,
|
|
{
|
|
#define RCB_NOF_ALLOC_RX_BUFF_ONCE 16
|
|
int unused_count = hns3_desc_unused(ring);
|
|
+ bool failure = false;
|
|
int recv_pkts = 0;
|
|
int err;
|
|
|
|
@@ -3815,9 +3821,9 @@ int hns3_clean_rx_ring(struct hns3_enet_ring *ring, int budget,
|
|
while (recv_pkts < budget) {
|
|
/* Reuse or realloc buffers */
|
|
if (unused_count >= RCB_NOF_ALLOC_RX_BUFF_ONCE) {
|
|
- hns3_nic_alloc_rx_buffers(ring, unused_count);
|
|
- unused_count = hns3_desc_unused(ring) -
|
|
- ring->pending_buf;
|
|
+ failure = failure ||
|
|
+ hns3_nic_alloc_rx_buffers(ring, unused_count);
|
|
+ unused_count = 0;
|
|
}
|
|
|
|
/* Poll one pkt */
|
|
@@ -3836,11 +3842,7 @@ int hns3_clean_rx_ring(struct hns3_enet_ring *ring, int budget,
|
|
}
|
|
|
|
out:
|
|
- /* Make all data has been write before submit */
|
|
- if (unused_count > 0)
|
|
- hns3_nic_alloc_rx_buffers(ring, unused_count);
|
|
-
|
|
- return recv_pkts;
|
|
+ return failure ? budget : recv_pkts;
|
|
}
|
|
|
|
static bool hns3_get_new_flow_lvl(struct hns3_enet_ring_group *ring_group)
|
|
--
|
|
2.34.1
|
|
|