Message ID | 20231017182545.97973-2-dwmw2@infradead.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Update QEMU qnic driver to "new" XenDevice model | expand |
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.
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); }