Skip to content

Commit ed4adc0

Browse files
pbrkrkuba-moo
authored andcommitted
net: ravb: Count packets instead of descriptors in GbEth RX path
The units of "work done" in the RX path should be packets instead of descriptors, as large packets can be spread over multiple descriptors. Fixes: 1c59eb6 ("ravb: Fillup ravb_rx_gbeth() stub") Signed-off-by: Paul Barker <paul.barker.ct@bp.renesas.com> Reviewed-by: Sergey Shtylyov <s.shtylyov@omp.ru> Link: https://lore.kernel.org/r/20240214151204.2976-1-paul.barker.ct@bp.renesas.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
1 parent dc34ebd commit ed4adc0

File tree

1 file changed

+9
-13
lines changed

1 file changed

+9
-13
lines changed

drivers/net/ethernet/renesas/ravb_main.c

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -772,29 +772,25 @@ static bool ravb_rx_gbeth(struct net_device *ndev, int *quota, int q)
772772
struct ravb_rx_desc *desc;
773773
struct sk_buff *skb;
774774
dma_addr_t dma_addr;
775+
int rx_packets = 0;
775776
u8 desc_status;
776-
int boguscnt;
777777
u16 pkt_len;
778778
u8 die_dt;
779779
int entry;
780780
int limit;
781+
int i;
781782

782783
entry = priv->cur_rx[q] % priv->num_rx_ring[q];
783-
boguscnt = priv->dirty_rx[q] + priv->num_rx_ring[q] - priv->cur_rx[q];
784+
limit = priv->dirty_rx[q] + priv->num_rx_ring[q] - priv->cur_rx[q];
784785
stats = &priv->stats[q];
785786

786-
boguscnt = min(boguscnt, *quota);
787-
limit = boguscnt;
788787
desc = &priv->gbeth_rx_ring[entry];
789-
while (desc->die_dt != DT_FEMPTY) {
788+
for (i = 0; i < limit && rx_packets < *quota && desc->die_dt != DT_FEMPTY; i++) {
790789
/* Descriptor type must be checked before all other reads */
791790
dma_rmb();
792791
desc_status = desc->msc;
793792
pkt_len = le16_to_cpu(desc->ds_cc) & RX_DS;
794793

795-
if (--boguscnt < 0)
796-
break;
797-
798794
/* We use 0-byte descriptors to mark the DMA mapping errors */
799795
if (!pkt_len)
800796
continue;
@@ -820,7 +816,7 @@ static bool ravb_rx_gbeth(struct net_device *ndev, int *quota, int q)
820816
skb_put(skb, pkt_len);
821817
skb->protocol = eth_type_trans(skb, ndev);
822818
napi_gro_receive(&priv->napi[q], skb);
823-
stats->rx_packets++;
819+
rx_packets++;
824820
stats->rx_bytes += pkt_len;
825821
break;
826822
case DT_FSTART:
@@ -848,7 +844,7 @@ static bool ravb_rx_gbeth(struct net_device *ndev, int *quota, int q)
848844
eth_type_trans(priv->rx_1st_skb, ndev);
849845
napi_gro_receive(&priv->napi[q],
850846
priv->rx_1st_skb);
851-
stats->rx_packets++;
847+
rx_packets++;
852848
stats->rx_bytes += pkt_len;
853849
break;
854850
}
@@ -887,9 +883,9 @@ static bool ravb_rx_gbeth(struct net_device *ndev, int *quota, int q)
887883
desc->die_dt = DT_FEMPTY;
888884
}
889885

890-
*quota -= limit - (++boguscnt);
891-
892-
return boguscnt <= 0;
886+
stats->rx_packets += rx_packets;
887+
*quota -= rx_packets;
888+
return *quota == 0;
893889
}
894890

895891
/* Packet receive function for Ethernet AVB */

0 commit comments

Comments
 (0)