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 --- |