On 12/02/2021 14:52, Laurent Vivier wrote: > failover_add_primary() calls qdev_device_add() and doesn't unref > the device. Because of that, when the device is unplugged a reference > is remaining and prevents the cleanup of the object. > > This prevents to be able to plugin back the failover primary device, > with errors like: > > (qemu) device_add > vfio-pci,host=0000:41:00.0,id=hostdev0,bus=root.3,failover_pair_id=net0 > (qemu) device_del hostdev0 > > We can check with "info qtree" and "info pci" that the device has been > removed, and then: > > (qemu) device_add > vfio-pci,host=0000:41:00.0,id=hostdev1,bus=root.3,failover_pair_id=net0 > Error: vfio 0000:41:00.0: device is already attached > (qemu) device_add > vfio-pci,host=0000:41:00.0,id=hostdev0,bus=root.3,failover_pair_id=net0 > qemu-kvm: Duplicate ID 'hostdev0' for device > > Fixes: 21e8709b29cd ("failover: Remove primary_dev member") > Cc: quint...@redhat.com > Signed-off-by: Laurent Vivier <lviv...@redhat.com>
I forgot to copy from the first review: Reviewed-by: Jens Freimann <jfreim...@redhat.com> > --- > hw/net/virtio-net.c | 2 ++ > 1 file changed, 2 insertions(+) > > diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c > index 5150f295e8c5..1c5af08dc556 100644 > --- a/hw/net/virtio-net.c > +++ b/hw/net/virtio-net.c > @@ -862,6 +862,8 @@ static void failover_add_primary(VirtIONet *n, Error > **errp) > dev = qdev_device_add(opts, &err); > if (err) { > qemu_opts_del(opts); > + } else { > + object_unref(OBJECT(dev)); > } > } else { > error_setg(errp, "Primary device not found"); >