Patchwork spapr_llan: fix device reenabling

login
register
mail settings
Submitter Alexey Kardashevskiy
Date May 3, 2013, 6:22 a.m.
Message ID <1367562123-1686-1-git-send-email-aik@ozlabs.ru>
Download mbox | patch
Permalink /patch/241150/
State New
Headers show

Comments

Alexey Kardashevskiy - May 3, 2013, 6:22 a.m.
Normally, the "tap" device is polled by QEMU if a guest NIC can
receive packets. If a guest NIC is stopped during transfer (rmmod or
ifdown), it may still have packets in a queue which have to be send
to the guest before QEMU enables polling of a "tap" interface via
tap_update_fd_handler().

However the spapr_llan device was missing the qemu_flush_queued_packets()
call so the tap_send_completed() callback was never called and therefore
"tap" interface polling was not enabled ever.

The patch fixes this problem.

Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
---
 hw/net/spapr_llan.c |    2 ++
 1 file changed, 2 insertions(+)
Alexander Graf - May 6, 2013, 3:16 p.m.
On 05/03/2013 08:22 AM, Alexey Kardashevskiy wrote:
> Normally, the "tap" device is polled by QEMU if a guest NIC can
> receive packets. If a guest NIC is stopped during transfer (rmmod or
> ifdown), it may still have packets in a queue which have to be send
> to the guest before QEMU enables polling of a "tap" interface via
> tap_update_fd_handler().
>
> However the spapr_llan device was missing the qemu_flush_queued_packets()
> call so the tap_send_completed() callback was never called and therefore
> "tap" interface polling was not enabled ever.
>
> The patch fixes this problem.
>
> Signed-off-by: Alexey Kardashevskiy<aik@ozlabs.ru>

Thanks, applied to ppc-next.

Alex

> ---
>   hw/net/spapr_llan.c |    2 ++
>   1 file changed, 2 insertions(+)
>
> diff --git a/hw/net/spapr_llan.c b/hw/net/spapr_llan.c
> index cca3d1a..46f7d5f 100644
> --- a/hw/net/spapr_llan.c
> +++ b/hw/net/spapr_llan.c
> @@ -336,6 +336,8 @@ static target_ulong h_register_logical_lan(PowerPCCPU *cpu,
>       spapr_vio_dma_set(sdev, VLAN_BD_ADDR(rec_queue), 0, VLAN_BD_LEN(rec_queue));
>
>       dev->isopen = 1;
> +    qemu_flush_queued_packets(qemu_get_queue(dev->nic));
> +
>       return H_SUCCESS;
>   }
>

Patch

diff --git a/hw/net/spapr_llan.c b/hw/net/spapr_llan.c
index cca3d1a..46f7d5f 100644
--- a/hw/net/spapr_llan.c
+++ b/hw/net/spapr_llan.c
@@ -336,6 +336,8 @@  static target_ulong h_register_logical_lan(PowerPCCPU *cpu,
     spapr_vio_dma_set(sdev, VLAN_BD_ADDR(rec_queue), 0, VLAN_BD_LEN(rec_queue));
 
     dev->isopen = 1;
+    qemu_flush_queued_packets(qemu_get_queue(dev->nic));
+
     return H_SUCCESS;
 }