From: David Woodhouse <dwmw@amazon.co.uk>
When the Xen guest asks to unplug *emulated* NICs, it's kind of unhelpful
also to unplug the peer of the *Xen* PV NIC.
Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
---
hw/i386/xen/xen_platform.c | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/hw/i386/xen/xen_platform.c b/hw/i386/xen/xen_platform.c
index 17457ff3de..e2dd1b536a 100644
--- a/hw/i386/xen/xen_platform.c
+++ b/hw/i386/xen/xen_platform.c
@@ -140,9 +140,14 @@ 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;
+ NetClientState *nc = qemu_get_queue(nic);
+ ObjectClass *klass = module_object_class_by_name(nc->model);
+
+ /* Only delete peers of PCI NICs that we're about to delete */
+ if (!klass || !object_class_dynamic_cast(klass, TYPE_PCI_DEVICE)) {
+ return;
+ }
- nc = qemu_get_queue(nic);
if (nc->peer)
qemu_del_net_client(nc->peer);
}
--
2.40.1
On 17/10/2023 19:25, David Woodhouse wrote:
> From: David Woodhouse <dwmw@amazon.co.uk>
>
> When the Xen guest asks to unplug *emulated* NICs, it's kind of unhelpful
> also to unplug the peer of the *Xen* PV NIC.
>
> Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
> ---
> hw/i386/xen/xen_platform.c | 9 +++++++--
> 1 file changed, 7 insertions(+), 2 deletions(-)
>
> diff --git a/hw/i386/xen/xen_platform.c b/hw/i386/xen/xen_platform.c
> index 17457ff3de..e2dd1b536a 100644
> --- a/hw/i386/xen/xen_platform.c
> +++ b/hw/i386/xen/xen_platform.c
> @@ -140,9 +140,14 @@ 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;
> + NetClientState *nc = qemu_get_queue(nic);
> + ObjectClass *klass = module_object_class_by_name(nc->model);
> +
> + /* Only delete peers of PCI NICs that we're about to delete */
> + if (!klass || !object_class_dynamic_cast(klass, TYPE_PCI_DEVICE)) {
Would it not be better to test for object_class_dynamic_cast(klass,
TYPE_XEN_DEVICE)?
Paul
> + return;
> + }
>
> - nc = qemu_get_queue(nic);
> if (nc->peer)
> qemu_del_net_client(nc->peer);
> }
On Tue, 2023-10-24 at 15:32 +0100, Paul Durrant wrote:
> On 17/10/2023 19:25, David Woodhouse wrote:
> > From: David Woodhouse <dwmw@amazon.co.uk>
> >
> > When the Xen guest asks to unplug *emulated* NICs, it's kind of unhelpful
> > also to unplug the peer of the *Xen* PV NIC.
> >
> > Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
> > ---
> > hw/i386/xen/xen_platform.c | 9 +++++++--
> > 1 file changed, 7 insertions(+), 2 deletions(-)
> >
> > diff --git a/hw/i386/xen/xen_platform.c b/hw/i386/xen/xen_platform.c
> > index 17457ff3de..e2dd1b536a 100644
> > --- a/hw/i386/xen/xen_platform.c
> > +++ b/hw/i386/xen/xen_platform.c
> > @@ -140,9 +140,14 @@ 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;
> > + NetClientState *nc = qemu_get_queue(nic);
> > + ObjectClass *klass = module_object_class_by_name(nc->model);
> > +
> > + /* Only delete peers of PCI NICs that we're about to delete */
> > + if (!klass || !object_class_dynamic_cast(klass, TYPE_PCI_DEVICE)) {
>
> Would it not be better to test for object_class_dynamic_cast(klass,
> TYPE_XEN_DEVICE)?
Only if we also change the actual unplug to destroy non-PCI devices too.
The only non-PCI device you could have here is an ISA NE2000, I think.
© 2016 - 2026 Red Hat, Inc.