forked from Minki/linux
net: hisilicon: Fix ping latency when deal with high throughput
This is due to error in over budget processing. When dealing with high throughput, the used buffers that exceeds the budget is not cleaned up. In addition, it takes a lot of cycles to clean up the used buffer, and then the buffer where the valid data is located can take effect. Signed-off-by: Jiangfeng Xiao <xiaojiangfeng@huawei.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
e19868efea
commit
e56bd641ca
@ -237,6 +237,7 @@ struct hip04_priv {
|
||||
dma_addr_t rx_phys[RX_DESC_NUM];
|
||||
unsigned int rx_head;
|
||||
unsigned int rx_buf_size;
|
||||
unsigned int rx_cnt_remaining;
|
||||
|
||||
struct device_node *phy_node;
|
||||
struct phy_device *phy;
|
||||
@ -575,7 +576,6 @@ static int hip04_rx_poll(struct napi_struct *napi, int budget)
|
||||
struct hip04_priv *priv = container_of(napi, struct hip04_priv, napi);
|
||||
struct net_device *ndev = priv->ndev;
|
||||
struct net_device_stats *stats = &ndev->stats;
|
||||
unsigned int cnt = hip04_recv_cnt(priv);
|
||||
struct rx_desc *desc;
|
||||
struct sk_buff *skb;
|
||||
unsigned char *buf;
|
||||
@ -588,8 +588,8 @@ static int hip04_rx_poll(struct napi_struct *napi, int budget)
|
||||
|
||||
/* clean up tx descriptors */
|
||||
tx_remaining = hip04_tx_reclaim(ndev, false);
|
||||
|
||||
while (cnt && !last) {
|
||||
priv->rx_cnt_remaining += hip04_recv_cnt(priv);
|
||||
while (priv->rx_cnt_remaining && !last) {
|
||||
buf = priv->rx_buf[priv->rx_head];
|
||||
skb = build_skb(buf, priv->rx_buf_size);
|
||||
if (unlikely(!skb)) {
|
||||
@ -635,11 +635,13 @@ refill:
|
||||
hip04_set_recv_desc(priv, phys);
|
||||
|
||||
priv->rx_head = RX_NEXT(priv->rx_head);
|
||||
if (rx >= budget)
|
||||
if (rx >= budget) {
|
||||
--priv->rx_cnt_remaining;
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (--cnt == 0)
|
||||
cnt = hip04_recv_cnt(priv);
|
||||
if (--priv->rx_cnt_remaining == 0)
|
||||
priv->rx_cnt_remaining += hip04_recv_cnt(priv);
|
||||
}
|
||||
|
||||
if (!(priv->reg_inten & RCV_INT)) {
|
||||
@ -724,6 +726,7 @@ static int hip04_mac_open(struct net_device *ndev)
|
||||
int i;
|
||||
|
||||
priv->rx_head = 0;
|
||||
priv->rx_cnt_remaining = 0;
|
||||
priv->tx_head = 0;
|
||||
priv->tx_tail = 0;
|
||||
hip04_reset_ppe(priv);
|
||||
|
Loading…
Reference in New Issue
Block a user