virtio-net.c (f5e1847ba50a8d1adf66c0cf312e53c162e52487) virtio-net.c (3abad4a221e050d43fa8540677b285057642baaf)
1/*
2 * Virtio Network Device
3 *
4 * Copyright IBM, Corp. 2007
5 *
6 * Authors:
7 * Anthony Liguori <aliguori@us.ibm.com>
8 *

--- 810 unchanged lines hidden (view full) ---

819 * @n: VirtIONet device
820 * @errp: returns an error if this function fails
821 */
822static char *failover_find_primary_device_id(VirtIONet *n)
823{
824 Error *err = NULL;
825 FailoverId fid;
826
1/*
2 * Virtio Network Device
3 *
4 * Copyright IBM, Corp. 2007
5 *
6 * Authors:
7 * Anthony Liguori <aliguori@us.ibm.com>
8 *

--- 810 unchanged lines hidden (view full) ---

819 * @n: VirtIONet device
820 * @errp: returns an error if this function fails
821 */
822static char *failover_find_primary_device_id(VirtIONet *n)
823{
824 Error *err = NULL;
825 FailoverId fid;
826
827 fid.n = n;
827 if (!qemu_opts_foreach(qemu_find_opts("device"),
828 failover_set_primary, &fid, &err)) {
829 return NULL;
830 }
831 return fid.id;
832}
833
834static void failover_add_primary(VirtIONet *n, Error **errp)
835{
836 Error *err = NULL;
837 QemuOpts *opts;
828 if (!qemu_opts_foreach(qemu_find_opts("device"),
829 failover_set_primary, &fid, &err)) {
830 return NULL;
831 }
832 return fid.id;
833}
834
835static void failover_add_primary(VirtIONet *n, Error **errp)
836{
837 Error *err = NULL;
838 QemuOpts *opts;
839 char *id;
838
839 if (n->primary_dev) {
840 return;
841 }
842
840
841 if (n->primary_dev) {
842 return;
843 }
844
843 opts = qemu_opts_find(qemu_find_opts("device"), n->primary_device_id);
845 id = failover_find_primary_device_id(n);
846 if (!id) {
847 return;
848 }
849 opts = qemu_opts_find(qemu_find_opts("device"), id);
844 if (opts) {
845 n->primary_dev = qdev_device_add(opts, &err);
846 if (err) {
847 qemu_opts_del(opts);
848 }
849 } else {
850 error_setg(errp, "Primary device not found");
851 error_append_hint(errp, "Virtio-net failover will not work. Make "

--- 11 unchanged lines hidden (view full) ---

863 */
864static DeviceState *failover_find_primary_device(VirtIONet *n)
865{
866 char *id = failover_find_primary_device_id(n);
867
868 if (!id) {
869 return NULL;
870 }
850 if (opts) {
851 n->primary_dev = qdev_device_add(opts, &err);
852 if (err) {
853 qemu_opts_del(opts);
854 }
855 } else {
856 error_setg(errp, "Primary device not found");
857 error_append_hint(errp, "Virtio-net failover will not work. Make "

--- 11 unchanged lines hidden (view full) ---

869 */
870static DeviceState *failover_find_primary_device(VirtIONet *n)
871{
872 char *id = failover_find_primary_device_id(n);
873
874 if (!id) {
875 return NULL;
876 }
871 n->primary_device_id = g_strdup(id);
872
877
873 return qdev_find_recursive(sysbus_get_default(), n->primary_device_id);
878 return qdev_find_recursive(sysbus_get_default(), id);
874}
875
876static void virtio_net_set_features(VirtIODevice *vdev, uint64_t features)
877{
878 VirtIONet *n = VIRTIO_NET(vdev);
879 Error *err = NULL;
880 int i;
881

--- 2273 unchanged lines hidden (view full) ---

3155 }
3156 }
3157
3158 if (migration_in_setup(s) && !should_be_hidden) {
3159 if (failover_unplug_primary(n)) {
3160 vmstate_unregister(VMSTATE_IF(n->primary_dev),
3161 qdev_get_vmsd(n->primary_dev),
3162 n->primary_dev);
879}
880
881static void virtio_net_set_features(VirtIODevice *vdev, uint64_t features)
882{
883 VirtIONet *n = VIRTIO_NET(vdev);
884 Error *err = NULL;
885 int i;
886

--- 2273 unchanged lines hidden (view full) ---

3160 }
3161 }
3162
3163 if (migration_in_setup(s) && !should_be_hidden) {
3164 if (failover_unplug_primary(n)) {
3165 vmstate_unregister(VMSTATE_IF(n->primary_dev),
3166 qdev_get_vmsd(n->primary_dev),
3167 n->primary_dev);
3163 qapi_event_send_unplug_primary(n->primary_device_id);
3168 qapi_event_send_unplug_primary(n->primary_dev->id);
3164 qatomic_set(&n->failover_primary_hidden, true);
3165 } else {
3166 warn_report("couldn't unplug primary device");
3167 }
3168 } else if (migration_has_failed(s)) {
3169 /* We already unplugged the device let's plug it back */
3170 if (!failover_replug_primary(n, &err)) {
3171 if (err) {

--- 9 unchanged lines hidden (view full) ---

3181 VirtIONet *n = container_of(notifier, VirtIONet, migration_state);
3182 virtio_net_handle_migration_primary(n, s);
3183}
3184
3185static bool failover_hide_primary_device(DeviceListener *listener,
3186 QemuOpts *device_opts)
3187{
3188 VirtIONet *n = container_of(listener, VirtIONet, primary_listener);
3169 qatomic_set(&n->failover_primary_hidden, true);
3170 } else {
3171 warn_report("couldn't unplug primary device");
3172 }
3173 } else if (migration_has_failed(s)) {
3174 /* We already unplugged the device let's plug it back */
3175 if (!failover_replug_primary(n, &err)) {
3176 if (err) {

--- 9 unchanged lines hidden (view full) ---

3186 VirtIONet *n = container_of(notifier, VirtIONet, migration_state);
3187 virtio_net_handle_migration_primary(n, s);
3188}
3189
3190static bool failover_hide_primary_device(DeviceListener *listener,
3191 QemuOpts *device_opts)
3192{
3193 VirtIONet *n = container_of(listener, VirtIONet, primary_listener);
3189 bool hide;
3190 const char *standby_id;
3191
3192 if (!device_opts) {
3193 return false;
3194 }
3195 standby_id = qemu_opt_get(device_opts, "failover_pair_id");
3196 if (g_strcmp0(standby_id, n->netclient_name) != 0) {
3197 return false;
3198 }
3199
3200 /* failover_primary_hidden is set during feature negotiation */
3194 const char *standby_id;
3195
3196 if (!device_opts) {
3197 return false;
3198 }
3199 standby_id = qemu_opt_get(device_opts, "failover_pair_id");
3200 if (g_strcmp0(standby_id, n->netclient_name) != 0) {
3201 return false;
3202 }
3203
3204 /* failover_primary_hidden is set during feature negotiation */
3201 hide = qatomic_read(&n->failover_primary_hidden);
3202 g_free(n->primary_device_id);
3203 n->primary_device_id = g_strdup(device_opts->id);
3204 return hide;
3205 return qatomic_read(&n->failover_primary_hidden);
3205}
3206
3207static void virtio_net_device_realize(DeviceState *dev, Error **errp)
3208{
3209 VirtIODevice *vdev = VIRTIO_DEVICE(dev);
3210 VirtIONet *n = VIRTIO_NET(dev);
3211 NetClientState *nc;
3212 int i;

--- 160 unchanged lines hidden (view full) ---

3373 g_free(n->netclient_type);
3374 n->netclient_type = NULL;
3375
3376 g_free(n->mac_table.macs);
3377 g_free(n->vlans);
3378
3379 if (n->failover) {
3380 device_listener_unregister(&n->primary_listener);
3206}
3207
3208static void virtio_net_device_realize(DeviceState *dev, Error **errp)
3209{
3210 VirtIODevice *vdev = VIRTIO_DEVICE(dev);
3211 VirtIONet *n = VIRTIO_NET(dev);
3212 NetClientState *nc;
3213 int i;

--- 160 unchanged lines hidden (view full) ---

3374 g_free(n->netclient_type);
3375 n->netclient_type = NULL;
3376
3377 g_free(n->mac_table.macs);
3378 g_free(n->vlans);
3379
3380 if (n->failover) {
3381 device_listener_unregister(&n->primary_listener);
3381 g_free(n->primary_device_id);
3382 }
3383
3384 max_queues = n->multiqueue ? n->max_queues : 1;
3385 for (i = 0; i < max_queues; i++) {
3386 virtio_net_del_queue(n, i);
3387 }
3388 /* delete also control vq */
3389 virtio_del_queue(vdev, max_queues * 2);

--- 172 unchanged lines hidden ---
3382 }
3383
3384 max_queues = n->multiqueue ? n->max_queues : 1;
3385 for (i = 0; i < max_queues; i++) {
3386 virtio_net_del_queue(n, i);
3387 }
3388 /* delete also control vq */
3389 virtio_del_queue(vdev, max_queues * 2);

--- 172 unchanged lines hidden ---