mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-07 17:53:56 -06:00
e1000e: Fix tx/rx counters
The bytes and packets counter registers are cleared on read. Copying the "total counter" registers to the "good counter" registers has side effects. If the "total" register is never read by the OS, it only gets incremented. This leads to exponential growth of the "good" register. This commit increments the counters individually to avoid this. Signed-off-by: Timothée Cocault <timothee.cocault@gmail.com> Signed-off-by: Jason Wang <jasowang@redhat.com>
This commit is contained in:
parent
886c0453cb
commit
8d689f6aae
4 changed files with 8 additions and 12 deletions
|
@ -637,9 +637,8 @@ xmit_seg(E1000State *s)
|
|||
|
||||
e1000x_inc_reg_if_not_full(s->mac_reg, TPT);
|
||||
e1000x_grow_8reg_if_not_full(s->mac_reg, TOTL, s->tx.size + 4);
|
||||
s->mac_reg[GPTC] = s->mac_reg[TPT];
|
||||
s->mac_reg[GOTCL] = s->mac_reg[TOTL];
|
||||
s->mac_reg[GOTCH] = s->mac_reg[TOTH];
|
||||
e1000x_inc_reg_if_not_full(s->mac_reg, GPTC);
|
||||
e1000x_grow_8reg_if_not_full(s->mac_reg, GOTCL, s->tx.size + 4);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
@ -711,9 +711,8 @@ e1000e_on_tx_done_update_stats(E1000ECore *core, struct NetTxPkt *tx_pkt)
|
|||
g_assert_not_reached();
|
||||
}
|
||||
|
||||
core->mac[GPTC] = core->mac[TPT];
|
||||
core->mac[GOTCL] = core->mac[TOTL];
|
||||
core->mac[GOTCH] = core->mac[TOTH];
|
||||
e1000x_inc_reg_if_not_full(core->mac, GPTC);
|
||||
e1000x_grow_8reg_if_not_full(core->mac, GOTCL, tot_len);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
@ -220,15 +220,14 @@ e1000x_update_rx_total_stats(uint32_t *mac,
|
|||
|
||||
e1000x_increase_size_stats(mac, PRCregs, data_fcs_size);
|
||||
e1000x_inc_reg_if_not_full(mac, TPR);
|
||||
mac[GPRC] = mac[TPR];
|
||||
e1000x_inc_reg_if_not_full(mac, GPRC);
|
||||
/* TOR - Total Octets Received:
|
||||
* This register includes bytes received in a packet from the <Destination
|
||||
* Address> field through the <CRC> field, inclusively.
|
||||
* Always include FCS length (4) in size.
|
||||
*/
|
||||
e1000x_grow_8reg_if_not_full(mac, TORL, data_size + 4);
|
||||
mac[GORCL] = mac[TORL];
|
||||
mac[GORCH] = mac[TORH];
|
||||
e1000x_grow_8reg_if_not_full(mac, GORCL, data_size + 4);
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
@ -538,9 +538,8 @@ igb_on_tx_done_update_stats(IGBCore *core, struct NetTxPkt *tx_pkt, int qn)
|
|||
g_assert_not_reached();
|
||||
}
|
||||
|
||||
core->mac[GPTC] = core->mac[TPT];
|
||||
core->mac[GOTCL] = core->mac[TOTL];
|
||||
core->mac[GOTCH] = core->mac[TOTH];
|
||||
e1000x_inc_reg_if_not_full(core->mac, GPTC);
|
||||
e1000x_grow_8reg_if_not_full(core->mac, GOTCL, tot_len);
|
||||
|
||||
if (core->mac[MRQC] & 1) {
|
||||
uint16_t pool = qn % IGB_NUM_VM_POOLS;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue