On 05/05/2014 12:33 PM, Matthew Rosato wrote: > On 05/05/2014 12:26 PM, Matthew Rosato wrote: >> When generating macvtaps via virNetDevMacVLanCreateWithVPortProfile, >> the macvtap device is unconditionally set to the up state. However, >> during migration, this results in a case where both the source and >> target system are simultaneously up with the same MAC address. This >> patch defers bringing the target macvtap up until later in the >> migration to shrink this window. >> >> Signed-off-by: Matthew Rosato <mjrosato@xxxxxxxxxxxxxxxxxx> > > Forgot to mention that this patch is associated with what Wangrui > reported here: > > http://www.redhat.com/archives/libvir-list/2014-March/msg01054.html > > and follows Viktor's suggested solution mentioned here: > > http://www.redhat.com/archives/libvir-list/2014-March/msg01654.html > > Ping. >> --- >> src/qemu/qemu_migration.c | 18 ++++++++++++++++++ >> src/util/virnetdevmacvlan.c | 11 ++++++++--- >> 2 files changed, 26 insertions(+), 3 deletions(-) >> >> diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c >> index a9f7fea..aee803a 100644 >> --- a/src/qemu/qemu_migration.c >> +++ b/src/qemu/qemu_migration.c >> @@ -56,6 +56,7 @@ >> #include "virhook.h" >> #include "virstring.h" >> #include "virtypedparam.h" >> +#include "virnetdev.h" >> >> #define VIR_FROM_THIS VIR_FROM_QEMU >> >> @@ -4468,6 +4469,8 @@ qemuMigrationFinish(virQEMUDriverPtr driver, >> virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); >> virCapsPtr caps = NULL; >> unsigned short port; >> + virDomainNetDefPtr net; >> + size_t i; >> >> VIR_DEBUG("driver=%p, dconn=%p, vm=%p, cookiein=%s, cookieinlen=%d, " >> "cookieout=%p, cookieoutlen=%p, flags=%lx, retcode=%d", >> @@ -4574,6 +4577,21 @@ qemuMigrationFinish(virQEMUDriverPtr driver, >> } >> >> if (!(flags & VIR_MIGRATE_PAUSED) && !(flags & VIR_MIGRATE_OFFLINE)) { >> + /* Macvtaps were previously left offline, bring them online now */ >> + for (i = 0; i < vm->def->nnets; i++) { >> + net = vm->def->nets[i]; >> + if (virDomainNetGetActualType(net) == VIR_DOMAIN_NET_TYPE_DIRECT) { >> + if (virNetDevSetOnline(net->ifname, true) < 0) { >> + ignore_value(virNetDevVPortProfileDisassociate(net->ifname, >> + virDomainNetGetActualVirtPortProfile(net), >> + &net->mac, >> + virDomainNetGetActualDirectDev(net), >> + -1, >> + VIR_NETDEV_VPORT_PROFILE_OP_MIGRATE_IN_FINISH)); >> + ignore_value(virNetDevMacVLanDelete(net->ifname)); >> + } >> + } >> + } >> /* run 'cont' on the destination, which allows migration on qemu >> * >= 0.10.6 to work properly. This isn't strictly necessary on >> * older qemu's, but it also doesn't hurt anything there >> diff --git a/src/util/virnetdevmacvlan.c b/src/util/virnetdevmacvlan.c >> index 7bbf540..3da845b 100644 >> --- a/src/util/virnetdevmacvlan.c >> +++ b/src/util/virnetdevmacvlan.c >> @@ -898,9 +898,14 @@ int virNetDevMacVLanCreateWithVPortProfile(const char *tgifname, >> goto link_del_exit; >> } >> >> - if (virNetDevSetOnline(cr_ifname, true) < 0) { >> - rc = -1; >> - goto disassociate_exit; >> + /* If this device is being created as part of an inbound >> + * migration, leave the device offline for now. >> + */ >> + if (vmOp != VIR_NETDEV_VPORT_PROFILE_OP_MIGRATE_IN_START) { >> + if (virNetDevSetOnline(cr_ifname, true) < 0) { >> + rc = -1; >> + goto disassociate_exit; >> + } >> } >> >> if (withTap) { >> > > -- > libvir-list mailing list > libvir-list@xxxxxxxxxx > https://www.redhat.com/mailman/listinfo/libvir-list > > > -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list