From 5fc51cc3ddcc7035313fc3e0ee6f351b5c083491 Mon Sep 17 00:00:00 2001 From: Jason Wang Date: Wed, 16 Sep 2015 11:05:30 +0800 Subject: [PATCH 1/4] MAINTAINERS: Stefan will not maintain net subsystem Talked with Stefan, he will not maintain net subsystem. Cc: Stefan Hajnoczi Cc: Michael S. Tsirkin Signed-off-by: Jason Wang Message-id: 1442372730-11360-1-git-send-email-jasowang@redhat.com Signed-off-by: Stefan Hajnoczi --- MAINTAINERS | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/MAINTAINERS b/MAINTAINERS index 688979bc10..2f4e8cf954 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -955,11 +955,10 @@ F: hmp-commands.hx T: git git://repo.or.cz/qemu/qmp-unstable.git queue/qmp Network device layer -M: Stefan Hajnoczi M: Jason Wang S: Maintained F: net/ -T: git git://github.com/stefanha/qemu.git net +T: git git://github.com/jasowang/qemu.git net Netmap network backend M: Luigi Rizzo From 8d06b149271cbd5b19bed5bde8da5ecef40ecbc6 Mon Sep 17 00:00:00 2001 From: Peter Crosthwaite Date: Thu, 10 Sep 2015 21:23:43 -0700 Subject: [PATCH 2/4] net: smc91c111: guard flush_queued_packets() on can_rx() Check that the core can once again receive packets before asking the net layer to do a flush. This will make it more convenient to flush packets when adding new conditions to can_receive. Add missing if braces while moving the can_receive() core code. Signed-off-by: Peter Crosthwaite Reviewed-by: Fam Zheng Tested-by: Richard Purdie Message-id: 92e15e12a6964274f4bc0eb71b61a7d94326f6c6.1441873621.git.crosthwaite.peter@gmail.com Signed-off-by: Stefan Hajnoczi --- hw/net/smc91c111.c | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/hw/net/smc91c111.c b/hw/net/smc91c111.c index 74e06e6c77..5774eff730 100644 --- a/hw/net/smc91c111.c +++ b/hw/net/smc91c111.c @@ -124,6 +124,24 @@ static void smc91c111_update(smc91c111_state *s) qemu_set_irq(s->irq, level); } +static int smc91c111_can_receive(smc91c111_state *s) +{ + if ((s->rcr & RCR_RXEN) == 0 || (s->rcr & RCR_SOFT_RST)) { + return 1; + } + if (s->allocated == (1 << NUM_PACKETS) - 1) { + return 0; + } + return 1; +} + +static inline void smc91c111_flush_queued_packets(smc91c111_state *s) +{ + if (smc91c111_can_receive(s)) { + qemu_flush_queued_packets(qemu_get_queue(s->nic)); + } +} + /* Try to allocate a packet. Returns 0x80 on failure. */ static int smc91c111_allocate_packet(smc91c111_state *s) { @@ -185,7 +203,7 @@ static void smc91c111_release_packet(smc91c111_state *s, int packet) s->allocated &= ~(1 << packet); if (s->tx_alloc == 0x80) smc91c111_tx_alloc(s); - qemu_flush_queued_packets(qemu_get_queue(s->nic)); + smc91c111_flush_queued_packets(s); } /* Flush the TX FIFO. */ @@ -636,15 +654,11 @@ static uint32_t smc91c111_readl(void *opaque, hwaddr offset) return val; } -static int smc91c111_can_receive(NetClientState *nc) +static int smc91c111_can_receive_nc(NetClientState *nc) { smc91c111_state *s = qemu_get_nic_opaque(nc); - if ((s->rcr & RCR_RXEN) == 0 || (s->rcr & RCR_SOFT_RST)) - return 1; - if (s->allocated == (1 << NUM_PACKETS) - 1) - return 0; - return 1; + return smc91c111_can_receive(s); } static ssize_t smc91c111_receive(NetClientState *nc, const uint8_t *buf, size_t size) @@ -739,7 +753,7 @@ static const MemoryRegionOps smc91c111_mem_ops = { static NetClientInfo net_smc91c111_info = { .type = NET_CLIENT_OPTIONS_KIND_NIC, .size = sizeof(NICState), - .can_receive = smc91c111_can_receive, + .can_receive = smc91c111_can_receive_nc, .receive = smc91c111_receive, }; From e62cb54cd5d08dc1c029f254b0d18faa138971b2 Mon Sep 17 00:00:00 2001 From: Peter Crosthwaite Date: Thu, 10 Sep 2015 21:23:57 -0700 Subject: [PATCH 3/4] net: smc91c111: gate can_receive() on rx FIFO having a slot Return false from can_receive() when the FIFO doesn't have a free RX slot. This fixes a bug in the current code where the allocated buffer is freed before the fifo pop, triggering a premature flush of queued RX packets. It also will handle a corner case, where the guest manually frees the allocated buffer before popping the rx FIFO (hence it is not enough to just delay the flush_queued_packets()). Reported-by: Richard Purdie Signed-off-by: Peter Crosthwaite Reviewed-by: Fam Zheng Tested-by: Richard Purdie Message-id: 97bfdfc5cbce0bd5e0cbbbff35ce7a1bf6f8603d.1441873621.git.crosthwaite.peter@gmail.com Signed-off-by: Stefan Hajnoczi --- hw/net/smc91c111.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/hw/net/smc91c111.c b/hw/net/smc91c111.c index 5774eff730..8fc3debcae 100644 --- a/hw/net/smc91c111.c +++ b/hw/net/smc91c111.c @@ -129,7 +129,8 @@ static int smc91c111_can_receive(smc91c111_state *s) if ((s->rcr & RCR_RXEN) == 0 || (s->rcr & RCR_SOFT_RST)) { return 1; } - if (s->allocated == (1 << NUM_PACKETS) - 1) { + if (s->allocated == (1 << NUM_PACKETS) - 1 || + s->rx_fifo_len == NUM_PACKETS) { return 0; } return 1; @@ -182,6 +183,7 @@ static void smc91c111_pop_rx_fifo(smc91c111_state *s) } else { s->int_level &= ~INT_RCV; } + smc91c111_flush_queued_packets(s); smc91c111_update(s); } From 271a234a2359975101396916f37f3c7d347c61b8 Mon Sep 17 00:00:00 2001 From: Peter Crosthwaite Date: Thu, 10 Sep 2015 21:24:12 -0700 Subject: [PATCH 4/4] net: smc91c111: flush packets on RCR register changes The SOFT_RST or RXEN in the control register can be used as a condition to unblock the net layer via can_receive(). So check for possible flushes on RCR changes. This will drop all pending packets on soft reset or disable which is the functional intent of the can_receive() logic. Signed-off-by: Peter Crosthwaite Reviewed-by: Fam Zheng Tested-by: Richard Purdie Message-id: b114d4c96f4afbdaa15f1361d9c07e3021755915.1441873621.git.crosthwaite.peter@gmail.com Signed-off-by: Stefan Hajnoczi --- hw/net/smc91c111.c | 1 + 1 file changed, 1 insertion(+) diff --git a/hw/net/smc91c111.c b/hw/net/smc91c111.c index 8fc3debcae..c19cdd14df 100644 --- a/hw/net/smc91c111.c +++ b/hw/net/smc91c111.c @@ -331,6 +331,7 @@ static void smc91c111_writeb(void *opaque, hwaddr offset, if (s->rcr & RCR_SOFT_RST) { smc91c111_reset(DEVICE(s)); } + smc91c111_flush_queued_packets(s); return; case 10: case 11: /* RPCR */ /* Ignored */