Commit 5155dc36 authored by Uwe Kleine-König's avatar Uwe Kleine-König Committed by Kamal Mostafa

net: fec: only clear a queue's work bit if the queue was emptied

commit 1c021bb7 upstream.

In the receive path a queue's work bit was cleared unconditionally even
if fec_enet_rx_queue only read out a part of the available packets from
the hardware. This resulted in not reading any packets in the next napi
turn and so packets were delayed or lost.

The obvious fix is to only clear a queue's bit when the queue was
emptied.

Fixes: 4d494cdc ("net: fec: change data structure to support multiqueue")
Signed-off-by: default avatarUwe Kleine-König <u.kleine-koenig@pengutronix.de>
Reviewed-by: default avatarLucas Stach <l.stach@pengutronix.de>
Tested-by: default avatarFugang Duan <fugang.duan@nxp.com>
Acked-by: default avatarFugang Duan <fugang.duan@nxp.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
Signed-off-by: default avatarKamal Mostafa <kamal@canonical.com>
parent de449547
...@@ -1523,9 +1523,15 @@ fec_enet_rx(struct net_device *ndev, int budget) ...@@ -1523,9 +1523,15 @@ fec_enet_rx(struct net_device *ndev, int budget)
struct fec_enet_private *fep = netdev_priv(ndev); struct fec_enet_private *fep = netdev_priv(ndev);
for_each_set_bit(queue_id, &fep->work_rx, FEC_ENET_MAX_RX_QS) { for_each_set_bit(queue_id, &fep->work_rx, FEC_ENET_MAX_RX_QS) {
clear_bit(queue_id, &fep->work_rx); int ret;
pkt_received += fec_enet_rx_queue(ndev,
ret = fec_enet_rx_queue(ndev,
budget - pkt_received, queue_id); budget - pkt_received, queue_id);
if (ret < budget - pkt_received)
clear_bit(queue_id, &fep->work_rx);
pkt_received += ret;
} }
return pkt_received; return pkt_received;
} }
......
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