* [Qemu-devel] [PATCH V3] E1000 RX ring management fix
@ 2012-10-19 5:56 Dmitry Fleytman
2012-10-19 5:56 ` [Qemu-devel] [PATCH V3] e1000: drop check_rxov, always treat RX ring with RDH == RDT as empty Dmitry Fleytman
0 siblings, 1 reply; 4+ messages in thread
From: Dmitry Fleytman @ 2012-10-19 5:56 UTC (permalink / raw)
To: qemu-devel; +Cc: Yan Vugenfirer, Dmitry Fleytman, Chris Webb, Richard Davies
Following patch fixes improper RX ring management E1000 code
Changes from version 2:
Commit message beautification
Changes from version 1:
1st patch changed so it drops check_rxov field because it is redundant and leads to race conditions
See commit description for details
2nd patch (live migration) dropped because corresponding field got deleted
Also I've made short experiment with an Intel adapter controlled by e1000e driver.
Indeed I saw no RX indication attempt when RX ring's RDH and RDT are equal.
Dmitry Fleytman (1):
e1000: drop check_rxov, always treat RX ring with RDH == RDT as empty
hw/e1000.c | 7 ++-----
1 file changed, 2 insertions(+), 5 deletions(-)
--
1.7.11.4
^ permalink raw reply [flat|nested] 4+ messages in thread
* [Qemu-devel] [PATCH V3] e1000: drop check_rxov, always treat RX ring with RDH == RDT as empty
2012-10-19 5:56 [Qemu-devel] [PATCH V3] E1000 RX ring management fix Dmitry Fleytman
@ 2012-10-19 5:56 ` Dmitry Fleytman
2012-10-19 7:52 ` Stefan Hajnoczi
0 siblings, 1 reply; 4+ messages in thread
From: Dmitry Fleytman @ 2012-10-19 5:56 UTC (permalink / raw)
To: qemu-devel; +Cc: Yan Vugenfirer, Dmitry Fleytman, Chris Webb, Richard Davies
Real HW always treats RX ring with RDH == RDT as empty.
Emulation is supposed to behave the same.
Reported-by: Chris Webb <chris.webb@elastichosts.com>
Reported-by: Richard Davies <richard.davies@elastichosts.com>
Signed-off-by: Dmitry Fleytman <dmitry@daynix.com>
---
hw/e1000.c | 7 ++-----
1 file changed, 2 insertions(+), 5 deletions(-)
diff --git a/hw/e1000.c b/hw/e1000.c
index 63fee10..ab39d47 100644
--- a/hw/e1000.c
+++ b/hw/e1000.c
@@ -92,7 +92,6 @@ typedef struct E1000State_st {
uint32_t rxbuf_size;
uint32_t rxbuf_min_shift;
- int check_rxov;
struct e1000_tx {
unsigned char header[256];
unsigned char vlan_header[4];
@@ -741,11 +740,11 @@ static bool e1000_has_rxbufs(E1000State *s, size_t total_size)
int bufs;
/* Fast-path short packets */
if (total_size <= s->rxbuf_size) {
- return s->mac_reg[RDH] != s->mac_reg[RDT] || !s->check_rxov;
+ return s->mac_reg[RDH] != s->mac_reg[RDT];
}
if (s->mac_reg[RDH] < s->mac_reg[RDT]) {
bufs = s->mac_reg[RDT] - s->mac_reg[RDH];
- } else if (s->mac_reg[RDH] > s->mac_reg[RDT] || !s->check_rxov) {
+ } else if (s->mac_reg[RDH] > s->mac_reg[RDT]) {
bufs = s->mac_reg[RDLEN] / sizeof(struct e1000_rx_desc) +
s->mac_reg[RDT] - s->mac_reg[RDH];
} else {
@@ -848,7 +847,6 @@ e1000_receive(NetClientState *nc, const uint8_t *buf, size_t size)
if (++s->mac_reg[RDH] * sizeof(desc) >= s->mac_reg[RDLEN])
s->mac_reg[RDH] = 0;
- s->check_rxov = 1;
/* see comment in start_xmit; same here */
if (s->mac_reg[RDH] == rdh_start) {
DBGOUT(RXERR, "RDH wraparound @%x, RDT %x, RDLEN %x\n",
@@ -925,7 +923,6 @@ mac_writereg(E1000State *s, int index, uint32_t val)
static void
set_rdt(E1000State *s, int index, uint32_t val)
{
- s->check_rxov = 0;
s->mac_reg[index] = val & 0xffff;
if (e1000_has_rxbufs(s, 1)) {
qemu_flush_queued_packets(&s->nic->nc);
--
1.7.11.4
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [Qemu-devel] [PATCH V3] e1000: drop check_rxov, always treat RX ring with RDH == RDT as empty
2012-10-19 5:56 ` [Qemu-devel] [PATCH V3] e1000: drop check_rxov, always treat RX ring with RDH == RDT as empty Dmitry Fleytman
@ 2012-10-19 7:52 ` Stefan Hajnoczi
2012-10-19 8:46 ` Dmitry Fleytman
0 siblings, 1 reply; 4+ messages in thread
From: Stefan Hajnoczi @ 2012-10-19 7:52 UTC (permalink / raw)
To: Dmitry Fleytman; +Cc: Yan Vugenfirer, Chris Webb, qemu-devel, Richard Davies
On Fri, Oct 19, 2012 at 07:56:55AM +0200, Dmitry Fleytman wrote:
> Real HW always treats RX ring with RDH == RDT as empty.
> Emulation is supposed to behave the same.
>
> Reported-by: Chris Webb <chris.webb@elastichosts.com>
> Reported-by: Richard Davies <richard.davies@elastichosts.com>
> Signed-off-by: Dmitry Fleytman <dmitry@daynix.com>
> ---
> hw/e1000.c | 7 ++-----
> 1 file changed, 2 insertions(+), 5 deletions(-)
Applied to the net tree:
http://github.com/stefanha/qemu/commits/net
Thanks for your efforts in squashing this bug! Glad it was possible to
drop check_rxov.
Stefan
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [Qemu-devel] [PATCH V3] e1000: drop check_rxov, always treat RX ring with RDH == RDT as empty
2012-10-19 7:52 ` Stefan Hajnoczi
@ 2012-10-19 8:46 ` Dmitry Fleytman
0 siblings, 0 replies; 4+ messages in thread
From: Dmitry Fleytman @ 2012-10-19 8:46 UTC (permalink / raw)
To: Stefan Hajnoczi; +Cc: Yan Vugenfirer, Chris Webb, qemu-devel, Richard Davies
Thanks Stefan,
It was my very first idea to drop check_rxov and solve the problem,
however for some reason I was sure that it required to emulate real HW behavior.
I'm glad we clarified this.
Regards,
Dmitry Fleytman
On Fri, Oct 19, 2012 at 9:52 AM, Stefan Hajnoczi <stefanha@gmail.com> wrote:
> On Fri, Oct 19, 2012 at 07:56:55AM +0200, Dmitry Fleytman wrote:
>> Real HW always treats RX ring with RDH == RDT as empty.
>> Emulation is supposed to behave the same.
>>
>> Reported-by: Chris Webb <chris.webb@elastichosts.com>
>> Reported-by: Richard Davies <richard.davies@elastichosts.com>
>> Signed-off-by: Dmitry Fleytman <dmitry@daynix.com>
>> ---
>> hw/e1000.c | 7 ++-----
>> 1 file changed, 2 insertions(+), 5 deletions(-)
>
> Applied to the net tree:
> http://github.com/stefanha/qemu/commits/net
>
> Thanks for your efforts in squashing this bug! Glad it was possible to
> drop check_rxov.
>
> Stefan
--
Dmitry Fleytman
Technology Expert and Consultant,
Daynix Computing Ltd.
Cell: +972-54-2819481
Skype: dmitry.fleytman
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2012-10-19 8:46 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-10-19 5:56 [Qemu-devel] [PATCH V3] E1000 RX ring management fix Dmitry Fleytman
2012-10-19 5:56 ` [Qemu-devel] [PATCH V3] e1000: drop check_rxov, always treat RX ring with RDH == RDT as empty Dmitry Fleytman
2012-10-19 7:52 ` Stefan Hajnoczi
2012-10-19 8:46 ` Dmitry Fleytman
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).