Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e56bd641 authored by Jiangfeng Xiao's avatar Jiangfeng Xiao Committed by David S. Miller
Browse files

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: default avatarJiangfeng Xiao <xiaojiangfeng@huawei.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent e19868ef
Loading
Loading
Loading
Loading
+9 −6
Original line number Diff line number Diff line
@@ -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 @@ static int hip04_rx_poll(struct napi_struct *napi, int budget)
		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);