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>
--
Anthony PERARD