diff mbox

[v2] xen-platform: Cleanup network infrastructure when emulated NICs are unplugged

Message ID 20170630125028.30265-1-ross.lagerwall@citrix.com (mailing list archive)
State New, archived
Headers show

Commit Message

Ross Lagerwall June 30, 2017, 12:50 p.m. UTC
When the guest unplugs the emulated NICs, cleanup the peer for each NIC
as it is not needed anymore. Most importantly, this allows the tap
interfaces which QEMU holds open to be closed and removed.

Signed-off-by: Ross Lagerwall <ross.lagerwall@citrix.com>
---

In v2: Don't call nic_cleanup(), just remove the peer of the NIC which
will cleanup up the tap devices. This means that QEMU doesn't segv
when shutting down.

 hw/i386/xen/xen_platform.c | 11 +++++++++++
 1 file changed, 11 insertions(+)

Comments

Anthony PERARD July 7, 2017, 3:33 p.m. UTC | #1
On Fri, Jun 30, 2017 at 01:50:28PM +0100, Ross Lagerwall wrote:
> When the guest unplugs the emulated NICs, cleanup the peer for each NIC
> as it is not needed anymore. Most importantly, this allows the tap
> interfaces which QEMU holds open to be closed and removed.
> 
> Signed-off-by: Ross Lagerwall <ross.lagerwall@citrix.com>
> ---
> 
> In v2: Don't call nic_cleanup(), just remove the peer of the NIC which
> will cleanup up the tap devices. This means that QEMU doesn't segv
> when shutting down.
> 
>  hw/i386/xen/xen_platform.c | 11 +++++++++++
>  1 file changed, 11 insertions(+)
> 
> diff --git a/hw/i386/xen/xen_platform.c b/hw/i386/xen/xen_platform.c
> index 1419fc9..f231558 100644
> --- a/hw/i386/xen/xen_platform.c
> +++ b/hw/i386/xen/xen_platform.c
> @@ -102,8 +102,19 @@ static void unplug_nic(PCIBus *b, PCIDevice *d, void *o)
>      }
>  }
>  
> +/* Remove the peer of the NIC device. Normally, this would be a tap device. */
> +static void del_nic_peer(NICState *nic, void *opaque)
> +{
> +    NetClientState *nc;
> +
> +    nc = qemu_get_queue(nic);
> +    if (nc->peer)
> +        qemu_del_net_client(nc->peer);
> +}
> +
>  static void pci_unplug_nics(PCIBus *bus)
>  {
> +    qemu_foreach_nic(del_nic_peer, NULL);
>      pci_for_each_device(bus, 0, unplug_nic, NULL);

I don't know if it a good idee to clean every NIC (using
qemu_foreach_nic) vs only clean NIC that have a PCI device (having
unplug_nic cleanup the peer). But I cannot think of a scenario with xen
where a nic is not also a pci device.

Anyway, this patch works:
Acked-by: Anthony PERARD <anthony.perard@citrix.com>
diff mbox

Patch

diff --git a/hw/i386/xen/xen_platform.c b/hw/i386/xen/xen_platform.c
index 1419fc9..f231558 100644
--- a/hw/i386/xen/xen_platform.c
+++ b/hw/i386/xen/xen_platform.c
@@ -102,8 +102,19 @@  static void unplug_nic(PCIBus *b, PCIDevice *d, void *o)
     }
 }
 
+/* Remove the peer of the NIC device. Normally, this would be a tap device. */
+static void del_nic_peer(NICState *nic, void *opaque)
+{
+    NetClientState *nc;
+
+    nc = qemu_get_queue(nic);
+    if (nc->peer)
+        qemu_del_net_client(nc->peer);
+}
+
 static void pci_unplug_nics(PCIBus *bus)
 {
+    qemu_foreach_nic(del_nic_peer, NULL);
     pci_for_each_device(bus, 0, unplug_nic, NULL);
 }