mirror of https://gitee.com/openkylin/qemu.git
e1000: flush queue whenever can_receive can go from false to true
When the guests replenish the receive ring buffer, the network device should flush its queue of pending packets. This is done with qemu_flush_queued_packets. e1000's can_receive can go from false to true when RCTL or RDT are modified. Reported-by: Luigi Rizzo <rizzo@iet.unipi.it> Cc: Stefan Hajnoczi <stefanha@linux.vnet.ibm.com> Cc: Jan Kiszka <jan.kiszka@siemens.de> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Reviewed-by: Amos Kong <akong@redhat.com> Signed-off-by: Stefan Hajnoczi <stefanha@linux.vnet.ibm.com>
This commit is contained in:
parent
987a9b4800
commit
e8b4c680b4
|
@ -295,6 +295,7 @@ set_rx_control(E1000State *s, int index, uint32_t val)
|
||||||
s->rxbuf_min_shift = ((val / E1000_RCTL_RDMTS_QUAT) & 3) + 1;
|
s->rxbuf_min_shift = ((val / E1000_RCTL_RDMTS_QUAT) & 3) + 1;
|
||||||
DBGOUT(RX, "RCTL: %d, mac_reg[RCTL] = 0x%x\n", s->mac_reg[RDT],
|
DBGOUT(RX, "RCTL: %d, mac_reg[RCTL] = 0x%x\n", s->mac_reg[RDT],
|
||||||
s->mac_reg[RCTL]);
|
s->mac_reg[RCTL]);
|
||||||
|
qemu_flush_queued_packets(&s->nic->nc);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -926,6 +927,9 @@ set_rdt(E1000State *s, int index, uint32_t val)
|
||||||
{
|
{
|
||||||
s->check_rxov = 0;
|
s->check_rxov = 0;
|
||||||
s->mac_reg[index] = val & 0xffff;
|
s->mac_reg[index] = val & 0xffff;
|
||||||
|
if (e1000_has_rxbufs(s, 1)) {
|
||||||
|
qemu_flush_queued_packets(&s->nic->nc);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
Loading…
Reference in New Issue