diff options
Diffstat (limited to 'hw/net')
-rw-r--r-- | hw/net/virtio-net.c | 55 |
1 files changed, 24 insertions, 31 deletions
diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c index 9203d81780..044ac95f6f 100644 --- a/hw/net/virtio-net.c +++ b/hw/net/virtio-net.c @@ -832,13 +832,31 @@ static char *failover_find_primary_device_id(VirtIONet *n) return fid.id; } +/** + * Find the primary device for this failover virtio-net + * + * @n: VirtIONet device + * @errp: returns an error if this function fails + */ +static DeviceState *failover_find_primary_device(VirtIONet *n) +{ + char *id = failover_find_primary_device_id(n); + + if (!id) { + return NULL; + } + + return qdev_find_recursive(sysbus_get_default(), id); +} + static void failover_add_primary(VirtIONet *n, Error **errp) { Error *err = NULL; QemuOpts *opts; char *id; + DeviceState *dev = failover_find_primary_device(n); - if (n->primary_dev) { + if (dev) { return; } @@ -848,7 +866,7 @@ static void failover_add_primary(VirtIONet *n, Error **errp) } opts = qemu_opts_find(qemu_find_opts("device"), id); if (opts) { - n->primary_dev = qdev_device_add(opts, &err); + dev = qdev_device_add(opts, &err); if (err) { qemu_opts_del(opts); } @@ -861,23 +879,6 @@ static void failover_add_primary(VirtIONet *n, Error **errp) error_propagate(errp, err); } -/** - * Find the primary device for this failover virtio-net - * - * @n: VirtIONet device - * @errp: returns an error if this function fails - */ -static DeviceState *failover_find_primary_device(VirtIONet *n) -{ - char *id = failover_find_primary_device_id(n); - - if (!id) { - return NULL; - } - - return qdev_find_recursive(sysbus_get_default(), id); -} - static void virtio_net_set_features(VirtIODevice *vdev, uint64_t features) { VirtIONet *n = VIRTIO_NET(vdev); @@ -933,19 +934,9 @@ static void virtio_net_set_features(VirtIODevice *vdev, uint64_t features) qatomic_set(&n->failover_primary_hidden, false); failover_add_primary(n, &err); if (err) { - n->primary_dev = failover_find_primary_device(n); - failover_add_primary(n, &err); - if (err) { - goto out_err; - } + warn_report_err(err); } } - return; - -out_err: - if (err) { - warn_report_err(err); - } } static int virtio_net_handle_rx_mode(VirtIONet *n, uint8_t cmd, @@ -3420,13 +3411,15 @@ static int virtio_net_pre_save(void *opaque) static bool primary_unplug_pending(void *opaque) { DeviceState *dev = opaque; + DeviceState *primary; VirtIODevice *vdev = VIRTIO_DEVICE(dev); VirtIONet *n = VIRTIO_NET(vdev); if (!virtio_vdev_has_feature(vdev, VIRTIO_NET_F_STANDBY)) { return false; } - return n->primary_dev ? n->primary_dev->pending_deleted_event : false; + primary = failover_find_primary_device(n); + return primary ? primary->pending_deleted_event : false; } static bool dev_unplug_pending(void *opaque) |