igc: Fix some issues in igc_neweitr()

The justification is the same as in commit
fb876eef219e ("e1000: Fix some issues in em_newitr()").

Reviewed by:	kbowling
MFC after:	2 weeks
Differential Revision:	https://reviews.freebsd.org/D50548
This commit is contained in:
Mark Johnston 2025-05-28 13:31:44 +00:00
parent d6a9f49185
commit ef062029ce

View file

@ -909,14 +909,16 @@ igc_neweitr(struct igc_softc *sc, struct igc_rx_queue *que,
struct tx_ring *txr, struct rx_ring *rxr)
{
struct igc_hw *hw = &sc->hw;
unsigned long bytes, bytes_per_packet, packets;
unsigned long rxbytes, rxpackets, txbytes, txpackets;
u32 neweitr;
u32 bytes;
u32 bytes_packets;
u32 packets;
u8 nextlatency;
rxbytes = atomic_load_long(&rxr->rx_bytes);
txbytes = atomic_load_long(&txr->tx_bytes);
/* Idle, do nothing */
if ((txr->tx_bytes == 0) && (rxr->rx_bytes == 0))
if (txbytes == 0 && rxbytes == 0)
return;
neweitr = 0;
@ -936,18 +938,20 @@ igc_neweitr(struct igc_softc *sc, struct igc_rx_queue *que,
goto igc_set_next_eitr;
}
bytes = bytes_packets = 0;
bytes = bytes_per_packet = 0;
/* Get largest values from the associated tx and rx ring */
if (txr->tx_bytes && txr->tx_packets) {
bytes = txr->tx_bytes;
bytes_packets = txr->tx_bytes/txr->tx_packets;
packets = txr->tx_packets;
txpackets = atomic_load_long(&txr->tx_packets);
if (txpackets != 0) {
bytes = txbytes;
bytes_per_packet = txbytes / txpackets;
packets = txpackets;
}
if (rxr->rx_bytes && rxr->rx_packets) {
bytes = max(bytes, rxr->rx_bytes);
bytes_packets = max(bytes_packets,
rxr->rx_bytes/rxr->rx_packets);
packets = max(packets, rxr->rx_packets);
rxpackets = atomic_load_long(&rxr->rx_packets);
if (rxpackets != 0) {
bytes = lmax(bytes, rxbytes);
bytes_per_packet =
lmax(bytes_per_packet, rxbytes / rxpackets);
packets = lmax(packets, rxpackets);
}
/* Latency state machine */
@ -957,7 +961,7 @@ igc_neweitr(struct igc_softc *sc, struct igc_rx_queue *que,
break;
case eitr_latency_lowest: /* 70k ints/s */
/* TSO and jumbo frames */
if (bytes_packets > 8000)
if (bytes_per_packet > 8000)
nextlatency = eitr_latency_bulk;
else if ((packets < 5) && (bytes > 512))
nextlatency = eitr_latency_low;
@ -965,14 +969,14 @@ igc_neweitr(struct igc_softc *sc, struct igc_rx_queue *que,
case eitr_latency_low: /* 20k ints/s */
if (bytes > 10000) {
/* Handle TSO */
if (bytes_packets > 8000)
if (bytes_per_packet > 8000)
nextlatency = eitr_latency_bulk;
else if ((packets < 10) ||
(bytes_packets > 1200))
(bytes_per_packet > 1200))
nextlatency = eitr_latency_bulk;
else if (packets > 35)
nextlatency = eitr_latency_lowest;
} else if (bytes_packets > 2000) {
} else if (bytes_per_packet > 2000) {
nextlatency = eitr_latency_bulk;
} else if (packets < 3 && bytes < 512) {
nextlatency = eitr_latency_lowest;