Skip to content

Commit

Permalink
net: ravb: Count packets instead of descriptors in GbEth RX path
Browse files Browse the repository at this point in the history
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 <[email protected]>
Reviewed-by: Sergey Shtylyov <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Jakub Kicinski <[email protected]>
  • Loading branch information
pbrkr authored and kuba-moo committed Feb 15, 2024
1 parent dc34ebd commit ed4adc0
Showing 1 changed file with 9 additions and 13 deletions.
22 changes: 9 additions & 13 deletions drivers/net/ethernet/renesas/ravb_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -772,29 +772,25 @@ static bool ravb_rx_gbeth(struct net_device *ndev, int *quota, int q)
struct ravb_rx_desc *desc;
struct sk_buff *skb;
dma_addr_t dma_addr;
int rx_packets = 0;
u8 desc_status;
int boguscnt;
u16 pkt_len;
u8 die_dt;
int entry;
int limit;
int i;

entry = priv->cur_rx[q] % priv->num_rx_ring[q];
boguscnt = priv->dirty_rx[q] + priv->num_rx_ring[q] - priv->cur_rx[q];
limit = priv->dirty_rx[q] + priv->num_rx_ring[q] - priv->cur_rx[q];
stats = &priv->stats[q];

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

if (--boguscnt < 0)
break;

/* We use 0-byte descriptors to mark the DMA mapping errors */
if (!pkt_len)
continue;
Expand All @@ -820,7 +816,7 @@ static bool ravb_rx_gbeth(struct net_device *ndev, int *quota, int q)
skb_put(skb, pkt_len);
skb->protocol = eth_type_trans(skb, ndev);
napi_gro_receive(&priv->napi[q], skb);
stats->rx_packets++;
rx_packets++;
stats->rx_bytes += pkt_len;
break;
case DT_FSTART:
Expand Down Expand Up @@ -848,7 +844,7 @@ static bool ravb_rx_gbeth(struct net_device *ndev, int *quota, int q)
eth_type_trans(priv->rx_1st_skb, ndev);
napi_gro_receive(&priv->napi[q],
priv->rx_1st_skb);
stats->rx_packets++;
rx_packets++;
stats->rx_bytes += pkt_len;
break;
}
Expand Down Expand Up @@ -887,9 +883,9 @@ static bool ravb_rx_gbeth(struct net_device *ndev, int *quota, int q)
desc->die_dt = DT_FEMPTY;
}

*quota -= limit - (++boguscnt);

return boguscnt <= 0;
stats->rx_packets += rx_packets;
*quota -= rx_packets;
return *quota == 0;
}

/* Packet receive function for Ethernet AVB */
Expand Down

0 comments on commit ed4adc0

Please sign in to comment.