From 1c775d65d4bff3a5a9876e398b2e689bc45aa1f7 Mon Sep 17 00:00:00 2001 From: Juan Quintela Date: Wed, 18 Nov 2020 09:37:23 +0100 Subject: failover: fix indentantion Once there, remove not needed cast. Signed-off-by: Juan Quintela Message-Id: <20201118083748.1328-3-quintela@redhat.com> Reviewed-by: Michael S. Tsirkin Signed-off-by: Michael S. Tsirkin --- hw/net/virtio-net.c | 33 +++++++++++++++------------------ 1 file changed, 15 insertions(+), 18 deletions(-) (limited to 'hw/net') diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c index 9179013..1011a52 100644 --- a/hw/net/virtio-net.c +++ b/hw/net/virtio-net.c @@ -797,7 +797,7 @@ static void failover_add_primary(VirtIONet *n, Error **errp) } n->primary_device_opts = qemu_opts_find(qemu_find_opts("device"), - n->primary_device_id); + n->primary_device_id); if (n->primary_device_opts) { n->primary_dev = qdev_device_add(n->primary_device_opts, &err); if (err) { @@ -814,9 +814,9 @@ static void failover_add_primary(VirtIONet *n, Error **errp) } else { error_setg(errp, "Primary device not found"); error_append_hint(errp, "Virtio-net failover will not work. Make " - "sure primary device has parameter" - " failover_pair_id=\n"); -} + "sure primary device has parameter" + " failover_pair_id=\n"); + } error_propagate(errp, err); } @@ -824,7 +824,6 @@ static int is_my_primary(void *opaque, QemuOpts *opts, Error **errp) { VirtIONet *n = opaque; int ret = 0; - const char *standby_id = qemu_opt_get(opts, "failover_pair_id"); if (standby_id != NULL && (g_strcmp0(standby_id, n->netclient_name) == 0)) { @@ -841,14 +840,14 @@ static DeviceState *virtio_net_find_primary(VirtIONet *n, Error **errp) Error *err = NULL; if (qemu_opts_foreach(qemu_find_opts("device"), - is_my_primary, n, &err)) { + is_my_primary, n, &err)) { if (err) { error_propagate(errp, err); return NULL; } if (n->primary_device_id) { dev = qdev_find_recursive(sysbus_get_default(), - n->primary_device_id); + n->primary_device_id); } else { error_setg(errp, "Primary device id not found"); return NULL; @@ -857,8 +856,6 @@ static DeviceState *virtio_net_find_primary(VirtIONet *n, Error **errp) return dev; } - - static DeviceState *virtio_connect_failover_devices(VirtIONet *n, DeviceState *dev, Error **errp) @@ -3126,9 +3123,9 @@ static bool failover_replug_primary(VirtIONet *n, Error **errp) return true; } if (!n->primary_device_opts) { - n->primary_device_opts = qemu_opts_from_qdict( - qemu_find_opts("device"), - n->primary_device_dict, errp); + n->primary_device_opts = qemu_opts_from_qdict(qemu_find_opts("device"), + n->primary_device_dict, + errp); if (!n->primary_device_opts) { return false; } @@ -3176,8 +3173,8 @@ static void virtio_net_handle_migration_primary(VirtIONet *n, if (migration_in_setup(s) && !should_be_hidden) { if (failover_unplug_primary(n)) { vmstate_unregister(VMSTATE_IF(n->primary_dev), - qdev_get_vmsd(n->primary_dev), - n->primary_dev); + qdev_get_vmsd(n->primary_dev), + n->primary_dev); qapi_event_send_unplug_primary(n->primary_device_id); qatomic_set(&n->primary_should_be_hidden, true); } else { @@ -3201,7 +3198,7 @@ static void virtio_net_migration_state_notifier(Notifier *notifier, void *data) } static int virtio_net_primary_should_be_hidden(DeviceListener *listener, - QemuOpts *device_opts) + QemuOpts *device_opts) { VirtIONet *n = container_of(listener, VirtIONet, primary_listener); bool match_found = false; @@ -3211,11 +3208,11 @@ static int virtio_net_primary_should_be_hidden(DeviceListener *listener, return -1; } n->primary_device_dict = qemu_opts_to_qdict(device_opts, - n->primary_device_dict); + n->primary_device_dict); if (n->primary_device_dict) { g_free(n->standby_id); n->standby_id = g_strdup(qdict_get_try_str(n->primary_device_dict, - "failover_pair_id")); + "failover_pair_id")); } if (g_strcmp0(n->standby_id, n->netclient_name) == 0) { match_found = true; @@ -3235,7 +3232,7 @@ static int virtio_net_primary_should_be_hidden(DeviceListener *listener, if (n->primary_device_dict) { g_free(n->primary_device_id); n->primary_device_id = g_strdup(qdict_get_try_str( - n->primary_device_dict, "id")); + n->primary_device_dict, "id")); if (!n->primary_device_id) { warn_report("primary_device_id not set"); } -- cgit v1.1 From 587f2fcb93eddf69736e00731a2da018a0e0a726 Mon Sep 17 00:00:00 2001 From: Juan Quintela Date: Wed, 18 Nov 2020 09:37:24 +0100 Subject: failover: Use always atomics for primary_should_be_hidden Signed-off-by: Juan Quintela Message-Id: <20201118083748.1328-4-quintela@redhat.com> Reviewed-by: Michael S. Tsirkin Signed-off-by: Michael S. Tsirkin --- hw/net/virtio-net.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'hw/net') diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c index 1011a52..a0fa63e 100644 --- a/hw/net/virtio-net.c +++ b/hw/net/virtio-net.c @@ -3136,7 +3136,7 @@ static bool failover_replug_primary(VirtIONet *n, Error **errp) return false; } qdev_set_parent_bus(n->primary_dev, n->primary_bus, &error_abort); - n->primary_should_be_hidden = false; + qatomic_set(&n->primary_should_be_hidden, false); if (!qemu_opt_set_bool(n->primary_device_opts, "partially_hotplugged", true, errp)) { return false; -- cgit v1.1 From 78274682b79d48e8de76c817c67c3cfbb76dc2ee Mon Sep 17 00:00:00 2001 From: Juan Quintela Date: Wed, 18 Nov 2020 09:37:25 +0100 Subject: failover: primary bus is only used once, and where it is set Just remove the struct member. Signed-off-by: Juan Quintela Message-Id: <20201118083748.1328-5-quintela@redhat.com> Reviewed-by: Michael S. Tsirkin Signed-off-by: Michael S. Tsirkin --- hw/net/virtio-net.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'hw/net') diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c index a0fa63e..786d313 100644 --- a/hw/net/virtio-net.c +++ b/hw/net/virtio-net.c @@ -804,7 +804,6 @@ static void failover_add_primary(VirtIONet *n, Error **errp) qemu_opts_del(n->primary_device_opts); } if (n->primary_dev) { - n->primary_bus = n->primary_dev->parent_bus; if (err) { qdev_unplug(n->primary_dev, &err); qdev_set_id(n->primary_dev, ""); @@ -3118,6 +3117,7 @@ static bool failover_replug_primary(VirtIONet *n, Error **errp) Error *err = NULL; HotplugHandler *hotplug_ctrl; PCIDevice *pdev = PCI_DEVICE(n->primary_dev); + BusState *primary_bus; if (!pdev->partially_hotplugged) { return true; @@ -3130,12 +3130,12 @@ static bool failover_replug_primary(VirtIONet *n, Error **errp) return false; } } - n->primary_bus = n->primary_dev->parent_bus; - if (!n->primary_bus) { + primary_bus = n->primary_dev->parent_bus; + if (!primary_bus) { error_setg(errp, "virtio_net: couldn't find primary bus"); return false; } - qdev_set_parent_bus(n->primary_dev, n->primary_bus, &error_abort); + qdev_set_parent_bus(n->primary_dev, primary_bus, &error_abort); qatomic_set(&n->primary_should_be_hidden, false); if (!qemu_opt_set_bool(n->primary_device_opts, "partially_hotplugged", true, errp)) { -- cgit v1.1 From 82ceb65799855efb0db965a6ef86d81ae1c8bcd7 Mon Sep 17 00:00:00 2001 From: Juan Quintela Date: Wed, 18 Nov 2020 09:37:26 +0100 Subject: failover: Remove unused parameter Signed-off-by: Juan Quintela Message-Id: <20201118083748.1328-6-quintela@redhat.com> Reviewed-by: Michael S. Tsirkin Signed-off-by: Michael S. Tsirkin --- hw/net/virtio-net.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) (limited to 'hw/net') diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c index 786d313..3f658d6 100644 --- a/hw/net/virtio-net.c +++ b/hw/net/virtio-net.c @@ -855,9 +855,7 @@ static DeviceState *virtio_net_find_primary(VirtIONet *n, Error **errp) return dev; } -static DeviceState *virtio_connect_failover_devices(VirtIONet *n, - DeviceState *dev, - Error **errp) +static DeviceState *virtio_connect_failover_devices(VirtIONet *n, Error **errp) { DeviceState *prim_dev = NULL; Error *err = NULL; @@ -928,7 +926,7 @@ static void virtio_net_set_features(VirtIODevice *vdev, uint64_t features) qatomic_set(&n->primary_should_be_hidden, false); failover_add_primary(n, &err); if (err) { - n->primary_dev = virtio_connect_failover_devices(n, n->qdev, &err); + n->primary_dev = virtio_connect_failover_devices(n, &err); if (err) { goto out_err; } @@ -3164,7 +3162,7 @@ static void virtio_net_handle_migration_primary(VirtIONet *n, should_be_hidden = qatomic_read(&n->primary_should_be_hidden); if (!n->primary_dev) { - n->primary_dev = virtio_connect_failover_devices(n, n->qdev, &err); + n->primary_dev = virtio_connect_failover_devices(n, &err); if (!n->primary_dev) { return; } -- cgit v1.1 From 594d308b9314b446ed2ccc42de7b4d57ba1b7118 Mon Sep 17 00:00:00 2001 From: Juan Quintela Date: Wed, 18 Nov 2020 09:37:27 +0100 Subject: failover: Remove external partially_hotplugged property It was only set "once", and with the wrong value. As far as I can see, libvirt still don't use it. Signed-off-by: Juan Quintela Message-Id: <20201118083748.1328-7-quintela@redhat.com> Reviewed-by: Michael S. Tsirkin Signed-off-by: Michael S. Tsirkin --- hw/net/virtio-net.c | 4 ---- 1 file changed, 4 deletions(-) (limited to 'hw/net') diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c index 3f658d6..6ca8562 100644 --- a/hw/net/virtio-net.c +++ b/hw/net/virtio-net.c @@ -3135,10 +3135,6 @@ static bool failover_replug_primary(VirtIONet *n, Error **errp) } qdev_set_parent_bus(n->primary_dev, primary_bus, &error_abort); qatomic_set(&n->primary_should_be_hidden, false); - if (!qemu_opt_set_bool(n->primary_device_opts, - "partially_hotplugged", true, errp)) { - return false; - } hotplug_ctrl = qdev_get_hotplug_handler(n->primary_dev); if (hotplug_ctrl) { hotplug_handler_pre_plug(hotplug_ctrl, n->primary_dev, &err); -- cgit v1.1 From 3d1c7a9782d19052505aabc8f2c134ccd6f3f3fb Mon Sep 17 00:00:00 2001 From: Juan Quintela Date: Wed, 18 Nov 2020 09:37:28 +0100 Subject: failover: qdev_device_add() returns err or dev set Never both. Signed-off-by: Juan Quintela Message-Id: <20201118083748.1328-8-quintela@redhat.com> Reviewed-by: Michael S. Tsirkin Signed-off-by: Michael S. Tsirkin --- hw/net/virtio-net.c | 7 ------- 1 file changed, 7 deletions(-) (limited to 'hw/net') diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c index 6ca8562..3e82108 100644 --- a/hw/net/virtio-net.c +++ b/hw/net/virtio-net.c @@ -803,13 +803,6 @@ static void failover_add_primary(VirtIONet *n, Error **errp) if (err) { qemu_opts_del(n->primary_device_opts); } - if (n->primary_dev) { - if (err) { - qdev_unplug(n->primary_dev, &err); - qdev_set_id(n->primary_dev, ""); - - } - } } else { error_setg(errp, "Primary device not found"); error_append_hint(errp, "Virtio-net failover will not work. Make " -- cgit v1.1 From e2bde83e23d3cfc1d90911c74500fd2e3b0b04fa Mon Sep 17 00:00:00 2001 From: Juan Quintela Date: Wed, 18 Nov 2020 09:37:29 +0100 Subject: failover: Rename bool to failover_primary_hidden You should not use passive naming variables. And once there, be able to search for them. Signed-off-by: Juan Quintela Message-Id: <20201118083748.1328-9-quintela@redhat.com> Reviewed-by: Michael S. Tsirkin Signed-off-by: Michael S. Tsirkin --- hw/net/virtio-net.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'hw/net') diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c index 3e82108..c221671 100644 --- a/hw/net/virtio-net.c +++ b/hw/net/virtio-net.c @@ -916,7 +916,7 @@ static void virtio_net_set_features(VirtIODevice *vdev, uint64_t features) if (virtio_has_feature(features, VIRTIO_NET_F_STANDBY)) { qapi_event_send_failover_negotiated(n->netclient_name); - qatomic_set(&n->primary_should_be_hidden, false); + qatomic_set(&n->failover_primary_hidden, false); failover_add_primary(n, &err); if (err) { n->primary_dev = virtio_connect_failover_devices(n, &err); @@ -3127,7 +3127,7 @@ static bool failover_replug_primary(VirtIONet *n, Error **errp) return false; } qdev_set_parent_bus(n->primary_dev, primary_bus, &error_abort); - qatomic_set(&n->primary_should_be_hidden, false); + qatomic_set(&n->failover_primary_hidden, false); hotplug_ctrl = qdev_get_hotplug_handler(n->primary_dev); if (hotplug_ctrl) { hotplug_handler_pre_plug(hotplug_ctrl, n->primary_dev, &err); @@ -3148,7 +3148,7 @@ static void virtio_net_handle_migration_primary(VirtIONet *n, bool should_be_hidden; Error *err = NULL; - should_be_hidden = qatomic_read(&n->primary_should_be_hidden); + should_be_hidden = qatomic_read(&n->failover_primary_hidden); if (!n->primary_dev) { n->primary_dev = virtio_connect_failover_devices(n, &err); @@ -3163,7 +3163,7 @@ static void virtio_net_handle_migration_primary(VirtIONet *n, qdev_get_vmsd(n->primary_dev), n->primary_dev); qapi_event_send_unplug_primary(n->primary_device_id); - qatomic_set(&n->primary_should_be_hidden, true); + qatomic_set(&n->failover_primary_hidden, true); } else { warn_report("couldn't unplug primary device"); } @@ -3213,8 +3213,8 @@ static int virtio_net_primary_should_be_hidden(DeviceListener *listener, n->primary_device_opts = device_opts; - /* primary_should_be_hidden is set during feature negotiation */ - hide = qatomic_read(&n->primary_should_be_hidden); + /* failover_primary_hidden is set during feature negotiation */ + hide = qatomic_read(&n->failover_primary_hidden); if (n->primary_device_dict) { g_free(n->primary_device_id); @@ -3271,7 +3271,7 @@ static void virtio_net_device_realize(DeviceState *dev, Error **errp) if (n->failover) { n->primary_listener.should_be_hidden = virtio_net_primary_should_be_hidden; - qatomic_set(&n->primary_should_be_hidden, true); + qatomic_set(&n->failover_primary_hidden, true); device_listener_register(&n->primary_listener); n->migration_state.notify = virtio_net_migration_state_notifier; add_migration_state_change_notifier(&n->migration_state); -- cgit v1.1 From 518eda9fda49da910d47f5baf66a1c0d1d30cebd Mon Sep 17 00:00:00 2001 From: Juan Quintela Date: Wed, 18 Nov 2020 09:37:30 +0100 Subject: failover: g_strcmp0() knows how to handle NULL Signed-off-by: Juan Quintela Message-Id: <20201118083748.1328-10-quintela@redhat.com> Reviewed-by: Michael S. Tsirkin Signed-off-by: Michael S. Tsirkin --- hw/net/virtio-net.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'hw/net') diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c index c221671..e334f05 100644 --- a/hw/net/virtio-net.c +++ b/hw/net/virtio-net.c @@ -818,7 +818,7 @@ static int is_my_primary(void *opaque, QemuOpts *opts, Error **errp) int ret = 0; const char *standby_id = qemu_opt_get(opts, "failover_pair_id"); - if (standby_id != NULL && (g_strcmp0(standby_id, n->netclient_name) == 0)) { + if (g_strcmp0(standby_id, n->netclient_name) == 0) { n->primary_device_id = g_strdup(opts->id); ret = 1; } -- cgit v1.1 From 19e49bc2e984bd065719fc3595f35368b3ae87cd Mon Sep 17 00:00:00 2001 From: Juan Quintela Date: Wed, 18 Nov 2020 09:37:31 +0100 Subject: failover: Remove primary_device_opts It was really only used once, in failover_add_primary(). Just search for it on global opts when it is needed. Signed-off-by: Juan Quintela Message-Id: <20201118083748.1328-11-quintela@redhat.com> Reviewed-by: Michael S. Tsirkin Signed-off-by: Michael S. Tsirkin --- hw/net/virtio-net.c | 21 +++++---------------- 1 file changed, 5 insertions(+), 16 deletions(-) (limited to 'hw/net') diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c index e334f05..2a99b0e 100644 --- a/hw/net/virtio-net.c +++ b/hw/net/virtio-net.c @@ -791,17 +791,17 @@ static inline uint64_t virtio_net_supported_guest_offloads(VirtIONet *n) static void failover_add_primary(VirtIONet *n, Error **errp) { Error *err = NULL; + QemuOpts *opts; if (n->primary_dev) { return; } - n->primary_device_opts = qemu_opts_find(qemu_find_opts("device"), - n->primary_device_id); - if (n->primary_device_opts) { - n->primary_dev = qdev_device_add(n->primary_device_opts, &err); + opts = qemu_opts_find(qemu_find_opts("device"), n->primary_device_id); + if (opts) { + n->primary_dev = qdev_device_add(opts, &err); if (err) { - qemu_opts_del(n->primary_device_opts); + qemu_opts_del(opts); } } else { error_setg(errp, "Primary device not found"); @@ -856,7 +856,6 @@ static DeviceState *virtio_connect_failover_devices(VirtIONet *n, Error **errp) prim_dev = virtio_net_find_primary(n, &err); if (prim_dev) { n->primary_device_id = g_strdup(prim_dev->id); - n->primary_device_opts = prim_dev->opts; } else { error_propagate(errp, err); } @@ -3113,14 +3112,6 @@ static bool failover_replug_primary(VirtIONet *n, Error **errp) if (!pdev->partially_hotplugged) { return true; } - if (!n->primary_device_opts) { - n->primary_device_opts = qemu_opts_from_qdict(qemu_find_opts("device"), - n->primary_device_dict, - errp); - if (!n->primary_device_opts) { - return false; - } - } primary_bus = n->primary_dev->parent_bus; if (!primary_bus) { error_setg(errp, "virtio_net: couldn't find primary bus"); @@ -3211,8 +3202,6 @@ static int virtio_net_primary_should_be_hidden(DeviceListener *listener, goto out; } - n->primary_device_opts = device_opts; - /* failover_primary_hidden is set during feature negotiation */ hide = qatomic_read(&n->failover_primary_hidden); -- cgit v1.1 From 4f0303aed87f83715055e558176046a8a3d9b987 Mon Sep 17 00:00:00 2001 From: Juan Quintela Date: Wed, 18 Nov 2020 09:37:32 +0100 Subject: failover: remove standby_id variable We can calculate it, and we only use it once anyways. Signed-off-by: Juan Quintela Message-Id: <20201118083748.1328-12-quintela@redhat.com> Reviewed-by: Michael S. Tsirkin Signed-off-by: Michael S. Tsirkin --- hw/net/virtio-net.c | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) (limited to 'hw/net') diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c index 2a99b0e..953d5c2 100644 --- a/hw/net/virtio-net.c +++ b/hw/net/virtio-net.c @@ -3181,23 +3181,19 @@ static int virtio_net_primary_should_be_hidden(DeviceListener *listener, VirtIONet *n = container_of(listener, VirtIONet, primary_listener); bool match_found = false; bool hide = false; + const char *standby_id; if (!device_opts) { return -1; } n->primary_device_dict = qemu_opts_to_qdict(device_opts, n->primary_device_dict); - if (n->primary_device_dict) { - g_free(n->standby_id); - n->standby_id = g_strdup(qdict_get_try_str(n->primary_device_dict, - "failover_pair_id")); - } - if (g_strcmp0(n->standby_id, n->netclient_name) == 0) { + standby_id = qemu_opt_get(device_opts, "failover_pair_id"); + if (g_strcmp0(standby_id, n->netclient_name) == 0) { match_found = true; } else { match_found = false; hide = false; - g_free(n->standby_id); n->primary_device_dict = NULL; goto out; } @@ -3400,7 +3396,6 @@ static void virtio_net_device_unrealize(DeviceState *dev) if (n->failover) { device_listener_unregister(&n->primary_listener); g_free(n->primary_device_id); - g_free(n->standby_id); qobject_unref(n->primary_device_dict); n->primary_device_dict = NULL; } -- cgit v1.1 From 9673a88e97d1eb428872bd261dbf56a0f3c2fd71 Mon Sep 17 00:00:00 2001 From: Juan Quintela Date: Wed, 18 Nov 2020 09:37:33 +0100 Subject: failover: Remove primary_device_dict It was only used once. And we have there opts->id, so no need for it. Signed-off-by: Juan Quintela Message-Id: <20201118083748.1328-13-quintela@redhat.com> Reviewed-by: Michael S. Tsirkin Signed-off-by: Michael S. Tsirkin --- hw/net/virtio-net.c | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) (limited to 'hw/net') diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c index 953d5c2..6e5a56a 100644 --- a/hw/net/virtio-net.c +++ b/hw/net/virtio-net.c @@ -3186,28 +3186,21 @@ static int virtio_net_primary_should_be_hidden(DeviceListener *listener, if (!device_opts) { return -1; } - n->primary_device_dict = qemu_opts_to_qdict(device_opts, - n->primary_device_dict); standby_id = qemu_opt_get(device_opts, "failover_pair_id"); if (g_strcmp0(standby_id, n->netclient_name) == 0) { match_found = true; } else { match_found = false; hide = false; - n->primary_device_dict = NULL; goto out; } /* failover_primary_hidden is set during feature negotiation */ hide = qatomic_read(&n->failover_primary_hidden); - - if (n->primary_device_dict) { - g_free(n->primary_device_id); - n->primary_device_id = g_strdup(qdict_get_try_str( - n->primary_device_dict, "id")); - if (!n->primary_device_id) { - warn_report("primary_device_id not set"); - } + g_free(n->primary_device_id); + n->primary_device_id = g_strdup(device_opts->id); + if (!n->primary_device_id) { + warn_report("primary_device_id not set"); } out: @@ -3396,8 +3389,6 @@ static void virtio_net_device_unrealize(DeviceState *dev) if (n->failover) { device_listener_unregister(&n->primary_listener); g_free(n->primary_device_id); - qobject_unref(n->primary_device_dict); - n->primary_device_dict = NULL; } max_queues = n->multiqueue ? n->max_queues : 1; -- cgit v1.1 From 7b3dc2f8c0b817bbe78ba347130b3c99fe2c4470 Mon Sep 17 00:00:00 2001 From: Juan Quintela Date: Wed, 18 Nov 2020 09:37:34 +0100 Subject: failover: Remove memory leak Two things, at this point: * n->primary_device_id has to be set, otherwise virtio_net_find_primary don't work. So we have a leak here. * it has to be exactly the same that prim_dev->id because what qdev_find_recursive() does is just compare this two values. So remove the unneeded assignment and leaky bits. Signed-off-by: Juan Quintela Message-Id: <20201118083748.1328-14-quintela@redhat.com> Reviewed-by: Michael S. Tsirkin Signed-off-by: Michael S. Tsirkin --- hw/net/virtio-net.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) (limited to 'hw/net') diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c index 6e5a56a..70fa372 100644 --- a/hw/net/virtio-net.c +++ b/hw/net/virtio-net.c @@ -854,9 +854,7 @@ static DeviceState *virtio_connect_failover_devices(VirtIONet *n, Error **errp) Error *err = NULL; prim_dev = virtio_net_find_primary(n, &err); - if (prim_dev) { - n->primary_device_id = g_strdup(prim_dev->id); - } else { + if (!prim_dev) { error_propagate(errp, err); } -- cgit v1.1 From 7cf05b7ed8e84e89b873701e3dfcd56aa81b2d13 Mon Sep 17 00:00:00 2001 From: Juan Quintela Date: Wed, 18 Nov 2020 09:37:35 +0100 Subject: failover: simplify virtio_net_find_primary() a - is_my_primary() never sets one error b - If we return 1, primary_device_id is always set Signed-off-by: Juan Quintela Message-Id: <20201118083748.1328-15-quintela@redhat.com> Reviewed-by: Michael S. Tsirkin Signed-off-by: Michael S. Tsirkin --- hw/net/virtio-net.c | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) (limited to 'hw/net') diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c index 70fa372..881907d 100644 --- a/hw/net/virtio-net.c +++ b/hw/net/virtio-net.c @@ -828,24 +828,12 @@ static int is_my_primary(void *opaque, QemuOpts *opts, Error **errp) static DeviceState *virtio_net_find_primary(VirtIONet *n, Error **errp) { - DeviceState *dev = NULL; Error *err = NULL; - if (qemu_opts_foreach(qemu_find_opts("device"), - is_my_primary, n, &err)) { - if (err) { - error_propagate(errp, err); - return NULL; - } - if (n->primary_device_id) { - dev = qdev_find_recursive(sysbus_get_default(), - n->primary_device_id); - } else { - error_setg(errp, "Primary device id not found"); - return NULL; - } + if (!qemu_opts_foreach(qemu_find_opts("device"), is_my_primary, n, &err)) { + return NULL; } - return dev; + return qdev_find_recursive(sysbus_get_default(), n->primary_device_id); } static DeviceState *virtio_connect_failover_devices(VirtIONet *n, Error **errp) -- cgit v1.1 From 89631fed27bd76b0292d8b2a78291ea96185c87d Mon Sep 17 00:00:00 2001 From: Juan Quintela Date: Wed, 18 Nov 2020 09:37:36 +0100 Subject: failover: should_be_hidden() should take a bool We didn't use at all the -1 value, and we don't really care. It was only used for the cases when this is not the device that we are searching for. And in that case we should not hide the device. Once there, simplify virtio-Snet_primary_should_be_hidden. Signed-off-by: Juan Quintela Message-Id: <20201118083748.1328-16-quintela@redhat.com> Reviewed-by: Michael S. Tsirkin Signed-off-by: Michael S. Tsirkin --- hw/net/virtio-net.c | 27 +++++++-------------------- 1 file changed, 7 insertions(+), 20 deletions(-) (limited to 'hw/net') diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c index 881907d..9f12d33 100644 --- a/hw/net/virtio-net.c +++ b/hw/net/virtio-net.c @@ -3161,24 +3161,19 @@ static void virtio_net_migration_state_notifier(Notifier *notifier, void *data) virtio_net_handle_migration_primary(n, s); } -static int virtio_net_primary_should_be_hidden(DeviceListener *listener, - QemuOpts *device_opts) +static bool virtio_net_primary_should_be_hidden(DeviceListener *listener, + QemuOpts *device_opts) { VirtIONet *n = container_of(listener, VirtIONet, primary_listener); - bool match_found = false; - bool hide = false; + bool hide; const char *standby_id; if (!device_opts) { - return -1; + return false; } standby_id = qemu_opt_get(device_opts, "failover_pair_id"); - if (g_strcmp0(standby_id, n->netclient_name) == 0) { - match_found = true; - } else { - match_found = false; - hide = false; - goto out; + if (g_strcmp0(standby_id, n->netclient_name) != 0) { + return false; } /* failover_primary_hidden is set during feature negotiation */ @@ -3188,15 +3183,7 @@ static int virtio_net_primary_should_be_hidden(DeviceListener *listener, if (!n->primary_device_id) { warn_report("primary_device_id not set"); } - -out: - if (match_found && hide) { - return 1; - } else if (match_found && !hide) { - return 0; - } else { - return -1; - } + return hide; } static void virtio_net_device_realize(DeviceState *dev, Error **errp) -- cgit v1.1 From b91ad981b867e15171234efc3f2ab4074d377cef Mon Sep 17 00:00:00 2001 From: Juan Quintela Date: Wed, 18 Nov 2020 09:37:37 +0100 Subject: failover: Rename function to hide_device() You should not use pasive. Signed-off-by: Juan Quintela Message-Id: <20201118083748.1328-17-quintela@redhat.com> Reviewed-by: Michael S. Tsirkin Signed-off-by: Michael S. Tsirkin --- hw/net/virtio-net.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) (limited to 'hw/net') diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c index 9f12d33..747614f 100644 --- a/hw/net/virtio-net.c +++ b/hw/net/virtio-net.c @@ -3161,8 +3161,8 @@ static void virtio_net_migration_state_notifier(Notifier *notifier, void *data) virtio_net_handle_migration_primary(n, s); } -static bool virtio_net_primary_should_be_hidden(DeviceListener *listener, - QemuOpts *device_opts) +static bool failover_hide_primary_device(DeviceListener *listener, + QemuOpts *device_opts) { VirtIONet *n = container_of(listener, VirtIONet, primary_listener); bool hide; @@ -3220,8 +3220,7 @@ static void virtio_net_device_realize(DeviceState *dev, Error **errp) } if (n->failover) { - n->primary_listener.should_be_hidden = - virtio_net_primary_should_be_hidden; + n->primary_listener.hide_device = failover_hide_primary_device; qatomic_set(&n->failover_primary_hidden, true); device_listener_register(&n->primary_listener); n->migration_state.notify = virtio_net_migration_state_notifier; -- cgit v1.1 From 0763db4f2df3a92336d78e8b68a665f7d1a1bc66 Mon Sep 17 00:00:00 2001 From: Juan Quintela Date: Wed, 18 Nov 2020 09:37:38 +0100 Subject: failover: virtio_net_connect_failover_devices() does nothing It just calls virtio_net_find_primary(), so just update the callers. Signed-off-by: Juan Quintela Message-Id: <20201118083748.1328-18-quintela@redhat.com> Reviewed-by: Michael S. Tsirkin Signed-off-by: Michael S. Tsirkin --- hw/net/virtio-net.c | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) (limited to 'hw/net') diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c index 747614f..c6200b9 100644 --- a/hw/net/virtio-net.c +++ b/hw/net/virtio-net.c @@ -836,19 +836,6 @@ static DeviceState *virtio_net_find_primary(VirtIONet *n, Error **errp) return qdev_find_recursive(sysbus_get_default(), n->primary_device_id); } -static DeviceState *virtio_connect_failover_devices(VirtIONet *n, Error **errp) -{ - DeviceState *prim_dev = NULL; - Error *err = NULL; - - prim_dev = virtio_net_find_primary(n, &err); - if (!prim_dev) { - error_propagate(errp, err); - } - - return prim_dev; -} - static void virtio_net_set_features(VirtIODevice *vdev, uint64_t features) { VirtIONet *n = VIRTIO_NET(vdev); @@ -904,7 +891,7 @@ 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 = virtio_connect_failover_devices(n, &err); + n->primary_dev = virtio_net_find_primary(n, &err); if (err) { goto out_err; } @@ -3128,7 +3115,7 @@ static void virtio_net_handle_migration_primary(VirtIONet *n, should_be_hidden = qatomic_read(&n->failover_primary_hidden); if (!n->primary_dev) { - n->primary_dev = virtio_connect_failover_devices(n, &err); + n->primary_dev = virtio_net_find_primary(n, &err); if (!n->primary_dev) { return; } -- cgit v1.1 From 85d3b93196e43c4493c118aa9e3a82fe657636b5 Mon Sep 17 00:00:00 2001 From: Juan Quintela Date: Wed, 18 Nov 2020 09:37:39 +0100 Subject: failover: Rename to failover_find_primary_device() This commit: * Rename them to failover_find_primary_devices() so - it starts with failover_ - it don't connect anything, just find the primary device * Create documentation for the function Signed-off-by: Juan Quintela Message-Id: <20201118083748.1328-19-quintela@redhat.com> Reviewed-by: Michael S. Tsirkin Signed-off-by: Michael S. Tsirkin --- hw/net/virtio-net.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'hw/net') diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c index c6200b9..ff82f10 100644 --- a/hw/net/virtio-net.c +++ b/hw/net/virtio-net.c @@ -826,7 +826,13 @@ static int is_my_primary(void *opaque, QemuOpts *opts, Error **errp) return ret; } -static DeviceState *virtio_net_find_primary(VirtIONet *n, Error **errp) +/** + * 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, Error **errp) { Error *err = NULL; @@ -891,7 +897,7 @@ 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 = virtio_net_find_primary(n, &err); + n->primary_dev = failover_find_primary_device(n, &err); if (err) { goto out_err; } @@ -3115,7 +3121,7 @@ static void virtio_net_handle_migration_primary(VirtIONet *n, should_be_hidden = qatomic_read(&n->failover_primary_hidden); if (!n->primary_dev) { - n->primary_dev = virtio_net_find_primary(n, &err); + n->primary_dev = failover_find_primary_device(n, &err); if (!n->primary_dev) { return; } -- cgit v1.1 From fec037c1e2da0a7ea54eabce65cc14d461fdc5eb Mon Sep 17 00:00:00 2001 From: Juan Quintela Date: Wed, 18 Nov 2020 09:37:42 +0100 Subject: failover: make sure that id always exist We check that it exist at device creation time, so we don't have to check anywhere else. Signed-off-by: Juan Quintela Message-Id: <20201118083748.1328-22-quintela@redhat.com> Reviewed-by: Michael S. Tsirkin Signed-off-by: Michael S. Tsirkin --- hw/net/virtio-net.c | 3 --- 1 file changed, 3 deletions(-) (limited to 'hw/net') diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c index ff82f10..c708c03 100644 --- a/hw/net/virtio-net.c +++ b/hw/net/virtio-net.c @@ -3173,9 +3173,6 @@ static bool failover_hide_primary_device(DeviceListener *listener, hide = qatomic_read(&n->failover_primary_hidden); g_free(n->primary_device_id); n->primary_device_id = g_strdup(device_opts->id); - if (!n->primary_device_id) { - warn_report("primary_device_id not set"); - } return hide; } -- cgit v1.1 From 0a0a27d66bcb275e5b984d8758880a7eff75464e Mon Sep 17 00:00:00 2001 From: Juan Quintela Date: Wed, 18 Nov 2020 09:37:43 +0100 Subject: failover: remove failover_find_primary_device() error parameter It can never give one error. Signed-off-by: Juan Quintela Message-Id: <20201118083748.1328-23-quintela@redhat.com> Reviewed-by: Michael S. Tsirkin Signed-off-by: Michael S. Tsirkin --- hw/net/virtio-net.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) (limited to 'hw/net') diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c index c708c03..b994796 100644 --- a/hw/net/virtio-net.c +++ b/hw/net/virtio-net.c @@ -832,7 +832,7 @@ static int is_my_primary(void *opaque, QemuOpts *opts, Error **errp) * @n: VirtIONet device * @errp: returns an error if this function fails */ -static DeviceState *failover_find_primary_device(VirtIONet *n, Error **errp) +static DeviceState *failover_find_primary_device(VirtIONet *n) { Error *err = NULL; @@ -897,10 +897,7 @@ 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, &err); - if (err) { - goto out_err; - } + n->primary_dev = failover_find_primary_device(n); failover_add_primary(n, &err); if (err) { goto out_err; @@ -3121,7 +3118,7 @@ static void virtio_net_handle_migration_primary(VirtIONet *n, should_be_hidden = qatomic_read(&n->failover_primary_hidden); if (!n->primary_dev) { - n->primary_dev = failover_find_primary_device(n, &err); + n->primary_dev = failover_find_primary_device(n); if (!n->primary_dev) { return; } -- cgit v1.1 From f5e1847ba50a8d1adf66c0cf312e53c162e52487 Mon Sep 17 00:00:00 2001 From: Juan Quintela Date: Wed, 18 Nov 2020 09:37:44 +0100 Subject: failover: split failover_find_primary_device_id() So we can calculate the device id when we need it. Signed-off-by: Juan Quintela Message-Id: <20201118083748.1328-24-quintela@redhat.com> Reviewed-by: Michael S. Tsirkin Signed-off-by: Michael S. Tsirkin --- hw/net/virtio-net.c | 63 +++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 47 insertions(+), 16 deletions(-) (limited to 'hw/net') diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c index b994796..2c502c1 100644 --- a/hw/net/virtio-net.c +++ b/hw/net/virtio-net.c @@ -788,6 +788,49 @@ static inline uint64_t virtio_net_supported_guest_offloads(VirtIONet *n) return virtio_net_guest_offloads_by_features(vdev->guest_features); } +typedef struct { + VirtIONet *n; + char *id; +} FailoverId; + +/** + * Set the id of the failover primary device + * + * @opaque: FailoverId to setup + * @opts: opts for device we are handling + * @errp: returns an error if this function fails + */ +static int failover_set_primary(void *opaque, QemuOpts *opts, Error **errp) +{ + FailoverId *fid = opaque; + const char *standby_id = qemu_opt_get(opts, "failover_pair_id"); + + if (g_strcmp0(standby_id, fid->n->netclient_name) == 0) { + fid->id = g_strdup(opts->id); + return 1; + } + + return 0; +} + +/** + * Find the primary device id for this failover virtio-net + * + * @n: VirtIONet device + * @errp: returns an error if this function fails + */ +static char *failover_find_primary_device_id(VirtIONet *n) +{ + Error *err = NULL; + FailoverId fid; + + if (!qemu_opts_foreach(qemu_find_opts("device"), + failover_set_primary, &fid, &err)) { + return NULL; + } + return fid.id; +} + static void failover_add_primary(VirtIONet *n, Error **errp) { Error *err = NULL; @@ -812,20 +855,6 @@ static void failover_add_primary(VirtIONet *n, Error **errp) error_propagate(errp, err); } -static int is_my_primary(void *opaque, QemuOpts *opts, Error **errp) -{ - VirtIONet *n = opaque; - int ret = 0; - const char *standby_id = qemu_opt_get(opts, "failover_pair_id"); - - if (g_strcmp0(standby_id, n->netclient_name) == 0) { - n->primary_device_id = g_strdup(opts->id); - ret = 1; - } - - return ret; -} - /** * Find the primary device for this failover virtio-net * @@ -834,11 +863,13 @@ static int is_my_primary(void *opaque, QemuOpts *opts, Error **errp) */ static DeviceState *failover_find_primary_device(VirtIONet *n) { - Error *err = NULL; + char *id = failover_find_primary_device_id(n); - if (!qemu_opts_foreach(qemu_find_opts("device"), is_my_primary, n, &err)) { + if (!id) { return NULL; } + n->primary_device_id = g_strdup(id); + return qdev_find_recursive(sysbus_get_default(), n->primary_device_id); } -- cgit v1.1 From 3abad4a221e050d43fa8540677b285057642baaf Mon Sep 17 00:00:00 2001 From: Juan Quintela Date: Wed, 18 Nov 2020 09:37:45 +0100 Subject: failover: We don't need to cache primary_device_id anymore Signed-off-by: Juan Quintela Message-Id: <20201118083748.1328-25-quintela@redhat.com> Reviewed-by: Michael S. Tsirkin Signed-off-by: Michael S. Tsirkin --- hw/net/virtio-net.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) (limited to 'hw/net') diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c index 2c502c1..746ed3f 100644 --- a/hw/net/virtio-net.c +++ b/hw/net/virtio-net.c @@ -824,6 +824,7 @@ static char *failover_find_primary_device_id(VirtIONet *n) Error *err = NULL; FailoverId fid; + fid.n = n; if (!qemu_opts_foreach(qemu_find_opts("device"), failover_set_primary, &fid, &err)) { return NULL; @@ -835,12 +836,17 @@ static void failover_add_primary(VirtIONet *n, Error **errp) { Error *err = NULL; QemuOpts *opts; + char *id; if (n->primary_dev) { return; } - opts = qemu_opts_find(qemu_find_opts("device"), n->primary_device_id); + id = failover_find_primary_device_id(n); + if (!id) { + return; + } + opts = qemu_opts_find(qemu_find_opts("device"), id); if (opts) { n->primary_dev = qdev_device_add(opts, &err); if (err) { @@ -868,9 +874,8 @@ static DeviceState *failover_find_primary_device(VirtIONet *n) if (!id) { return NULL; } - n->primary_device_id = g_strdup(id); - return qdev_find_recursive(sysbus_get_default(), n->primary_device_id); + return qdev_find_recursive(sysbus_get_default(), id); } static void virtio_net_set_features(VirtIODevice *vdev, uint64_t features) @@ -3160,7 +3165,7 @@ static void virtio_net_handle_migration_primary(VirtIONet *n, vmstate_unregister(VMSTATE_IF(n->primary_dev), qdev_get_vmsd(n->primary_dev), n->primary_dev); - qapi_event_send_unplug_primary(n->primary_device_id); + qapi_event_send_unplug_primary(n->primary_dev->id); qatomic_set(&n->failover_primary_hidden, true); } else { warn_report("couldn't unplug primary device"); @@ -3186,7 +3191,6 @@ static bool failover_hide_primary_device(DeviceListener *listener, QemuOpts *device_opts) { VirtIONet *n = container_of(listener, VirtIONet, primary_listener); - bool hide; const char *standby_id; if (!device_opts) { @@ -3198,10 +3202,7 @@ static bool failover_hide_primary_device(DeviceListener *listener, } /* failover_primary_hidden is set during feature negotiation */ - hide = qatomic_read(&n->failover_primary_hidden); - g_free(n->primary_device_id); - n->primary_device_id = g_strdup(device_opts->id); - return hide; + return qatomic_read(&n->failover_primary_hidden); } static void virtio_net_device_realize(DeviceState *dev, Error **errp) @@ -3378,7 +3379,6 @@ static void virtio_net_device_unrealize(DeviceState *dev) if (n->failover) { device_listener_unregister(&n->primary_listener); - g_free(n->primary_device_id); } max_queues = n->multiqueue ? n->max_queues : 1; -- cgit v1.1 From 0e9a65c5b168b993b845ec2acb2568328c2353da Mon Sep 17 00:00:00 2001 From: Juan Quintela Date: Wed, 18 Nov 2020 09:37:46 +0100 Subject: failover: Caller of this two functions already have primary_dev Pass it as an argument. Signed-off-by: Juan Quintela Message-Id: <20201118083748.1328-26-quintela@redhat.com> Reviewed-by: Michael S. Tsirkin Signed-off-by: Michael S. Tsirkin --- hw/net/virtio-net.c | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) (limited to 'hw/net') diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c index 746ed3f..b37e9cd 100644 --- a/hw/net/virtio-net.c +++ b/hw/net/virtio-net.c @@ -3093,17 +3093,17 @@ void virtio_net_set_netclient_name(VirtIONet *n, const char *name, n->netclient_type = g_strdup(type); } -static bool failover_unplug_primary(VirtIONet *n) +static bool failover_unplug_primary(VirtIONet *n, DeviceState *dev) { HotplugHandler *hotplug_ctrl; PCIDevice *pci_dev; Error *err = NULL; - hotplug_ctrl = qdev_get_hotplug_handler(n->primary_dev); + hotplug_ctrl = qdev_get_hotplug_handler(dev); if (hotplug_ctrl) { - pci_dev = PCI_DEVICE(n->primary_dev); + pci_dev = PCI_DEVICE(dev); pci_dev->partially_hotplugged = true; - hotplug_handler_unplug_request(hotplug_ctrl, n->primary_dev, &err); + hotplug_handler_unplug_request(hotplug_ctrl, dev, &err); if (err) { error_report_err(err); return false; @@ -3114,30 +3114,31 @@ static bool failover_unplug_primary(VirtIONet *n) return true; } -static bool failover_replug_primary(VirtIONet *n, Error **errp) +static bool failover_replug_primary(VirtIONet *n, DeviceState *dev, + Error **errp) { Error *err = NULL; HotplugHandler *hotplug_ctrl; - PCIDevice *pdev = PCI_DEVICE(n->primary_dev); + PCIDevice *pdev = PCI_DEVICE(dev); BusState *primary_bus; if (!pdev->partially_hotplugged) { return true; } - primary_bus = n->primary_dev->parent_bus; + primary_bus = dev->parent_bus; if (!primary_bus) { error_setg(errp, "virtio_net: couldn't find primary bus"); return false; } - qdev_set_parent_bus(n->primary_dev, primary_bus, &error_abort); + qdev_set_parent_bus(dev, primary_bus, &error_abort); qatomic_set(&n->failover_primary_hidden, false); - hotplug_ctrl = qdev_get_hotplug_handler(n->primary_dev); + hotplug_ctrl = qdev_get_hotplug_handler(dev); if (hotplug_ctrl) { - hotplug_handler_pre_plug(hotplug_ctrl, n->primary_dev, &err); + hotplug_handler_pre_plug(hotplug_ctrl, dev, &err); if (err) { goto out; } - hotplug_handler_plug(hotplug_ctrl, n->primary_dev, &err); + hotplug_handler_plug(hotplug_ctrl, dev, &err); } out: @@ -3161,7 +3162,7 @@ static void virtio_net_handle_migration_primary(VirtIONet *n, } if (migration_in_setup(s) && !should_be_hidden) { - if (failover_unplug_primary(n)) { + if (failover_unplug_primary(n, n->primary_dev)) { vmstate_unregister(VMSTATE_IF(n->primary_dev), qdev_get_vmsd(n->primary_dev), n->primary_dev); @@ -3172,7 +3173,7 @@ static void virtio_net_handle_migration_primary(VirtIONet *n, } } else if (migration_has_failed(s)) { /* We already unplugged the device let's plug it back */ - if (!failover_replug_primary(n, &err)) { + if (!failover_replug_primary(n, n->primary_dev, &err)) { if (err) { error_report_err(err); } -- cgit v1.1 From 07a5d816d50f5f876d5fcd43724a6ff17cf59a4f Mon Sep 17 00:00:00 2001 From: Juan Quintela Date: Wed, 18 Nov 2020 09:37:47 +0100 Subject: failover: simplify failover_unplug_primary We can calculate device just once. Signed-off-by: Juan Quintela Message-Id: <20201118083748.1328-27-quintela@redhat.com> Reviewed-by: Michael S. Tsirkin Signed-off-by: Michael S. Tsirkin --- hw/net/virtio-net.c | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) (limited to 'hw/net') diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c index b37e9cd..9203d81 100644 --- a/hw/net/virtio-net.c +++ b/hw/net/virtio-net.c @@ -3146,34 +3146,29 @@ out: return !err; } -static void virtio_net_handle_migration_primary(VirtIONet *n, - MigrationState *s) +static void virtio_net_handle_migration_primary(VirtIONet *n, MigrationState *s) { bool should_be_hidden; Error *err = NULL; + DeviceState *dev = failover_find_primary_device(n); - should_be_hidden = qatomic_read(&n->failover_primary_hidden); - - if (!n->primary_dev) { - n->primary_dev = failover_find_primary_device(n); - if (!n->primary_dev) { - return; - } + if (!dev) { + return; } + should_be_hidden = qatomic_read(&n->failover_primary_hidden); + if (migration_in_setup(s) && !should_be_hidden) { - if (failover_unplug_primary(n, n->primary_dev)) { - vmstate_unregister(VMSTATE_IF(n->primary_dev), - qdev_get_vmsd(n->primary_dev), - n->primary_dev); - qapi_event_send_unplug_primary(n->primary_dev->id); + if (failover_unplug_primary(n, dev)) { + vmstate_unregister(VMSTATE_IF(dev), qdev_get_vmsd(dev), dev); + qapi_event_send_unplug_primary(dev->id); qatomic_set(&n->failover_primary_hidden, true); } else { warn_report("couldn't unplug primary device"); } } else if (migration_has_failed(s)) { /* We already unplugged the device let's plug it back */ - if (!failover_replug_primary(n, n->primary_dev, &err)) { + if (!failover_replug_primary(n, dev, &err)) { if (err) { error_report_err(err); } -- cgit v1.1 From 21e8709b29cd981c74565e75276ed476c954cbbf Mon Sep 17 00:00:00 2001 From: Juan Quintela Date: Wed, 18 Nov 2020 09:37:48 +0100 Subject: failover: Remove primary_dev member Only three uses remained, and we can remove them on that case. Signed-off-by: Juan Quintela Message-Id: <20201118083748.1328-28-quintela@redhat.com> Reviewed-by: Michael S. Tsirkin Signed-off-by: Michael S. Tsirkin --- hw/net/virtio-net.c | 55 +++++++++++++++++++++++------------------------------ 1 file changed, 24 insertions(+), 31 deletions(-) (limited to 'hw/net') diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c index 9203d81..044ac95 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) -- cgit v1.1