Message ID | 20210210174518.2493928-3-lvivier@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | failover: trivial cleanup and fix | expand |
On 2021/2/11 上午1:45, 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: quintela@redhat.com > Signed-off-by: Laurent Vivier <lvivier@redhat.com> > Reviewed-by: Jens Freimann <jfreimann@redhat.com> Acked-by: Jason Wang <jasowang@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");
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");