Skip to content

Commit

Permalink
amd-xgbe: Fix napi Rx budget accounting
Browse files Browse the repository at this point in the history
Currently the amd-xgbe driver increments the packets processed counter
each time a descriptor is processed.  Since a packet can be represented
by more than one descriptor incrementing the counter in this way is not
appropriate.  Also, since multiple descriptors cause the budget check
to be short circuited, sometimes the returned value from the poll
function would be larger than the budget value resulting in a WARN_ONCE
being triggered.

Update the polling logic to properly account for the number of packets
processed and exit when the budget value is reached.

Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Lendacky, Thomas authored and David S. Miller committed Oct 22, 2014
1 parent 386f1c9 commit 55ca6bc
Showing 1 changed file with 12 additions and 8 deletions.
20 changes: 12 additions & 8 deletions drivers/net/ethernet/amd/xgbe/xgbe-drv.c
Original file line number Diff line number Diff line change
Expand Up @@ -1598,7 +1598,8 @@ static int xgbe_rx_poll(struct xgbe_channel *channel, int budget)
struct skb_shared_hwtstamps *hwtstamps;
unsigned int incomplete, error, context_next, context;
unsigned int len, put_len, max_len;
int received = 0;
unsigned int received = 0;
int packet_count = 0;

DBGPR("-->xgbe_rx_poll: budget=%d\n", budget);

Expand All @@ -1608,7 +1609,7 @@ static int xgbe_rx_poll(struct xgbe_channel *channel, int budget)

rdata = XGBE_GET_DESC_DATA(ring, ring->cur);
packet = &ring->packet_data;
while (received < budget) {
while (packet_count < budget) {
DBGPR(" cur = %d\n", ring->cur);

/* First time in loop see if we need to restore state */
Expand Down Expand Up @@ -1662,7 +1663,7 @@ static int xgbe_rx_poll(struct xgbe_channel *channel, int budget)
if (packet->errors)
DBGPR("Error in received packet\n");
dev_kfree_skb(skb);
continue;
goto next_packet;
}

if (!context) {
Expand All @@ -1677,7 +1678,7 @@ static int xgbe_rx_poll(struct xgbe_channel *channel, int budget)
}

dev_kfree_skb(skb);
continue;
goto next_packet;
}
memcpy(skb_tail_pointer(skb), rdata->skb->data,
put_len);
Expand All @@ -1694,7 +1695,7 @@ static int xgbe_rx_poll(struct xgbe_channel *channel, int budget)

/* Stray Context Descriptor? */
if (!skb)
continue;
goto next_packet;

/* Be sure we don't exceed the configured MTU */
max_len = netdev->mtu + ETH_HLEN;
Expand All @@ -1705,7 +1706,7 @@ static int xgbe_rx_poll(struct xgbe_channel *channel, int budget)
if (skb->len > max_len) {
DBGPR("packet length exceeds configured MTU\n");
dev_kfree_skb(skb);
continue;
goto next_packet;
}

#ifdef XGMAC_ENABLE_RX_PKT_DUMP
Expand Down Expand Up @@ -1739,6 +1740,9 @@ static int xgbe_rx_poll(struct xgbe_channel *channel, int budget)

netdev->last_rx = jiffies;
napi_gro_receive(&pdata->napi, skb);

next_packet:
packet_count++;
}

/* Check if we need to save state before leaving */
Expand All @@ -1752,9 +1756,9 @@ static int xgbe_rx_poll(struct xgbe_channel *channel, int budget)
rdata->state.error = error;
}

DBGPR("<--xgbe_rx_poll: received = %d\n", received);
DBGPR("<--xgbe_rx_poll: packet_count = %d\n", packet_count);

return received;
return packet_count;
}

static int xgbe_poll(struct napi_struct *napi, int budget)
Expand Down

0 comments on commit 55ca6bc

Please sign in to comment.