On 06/14/2017 04:29 AM, ZhiPeng Lu wrote: > Before libvirt that calls virNetDevMacVLanCreateWithVPortProfile sets mac address > or vlan of a Virtual Function(VF) linked to a macvtap passthrough device of migration > destination host in migration start step. If we ping the migrating vm, > we get the network does not pass. Because VFs of migration source and destination > have the same MAC address. The patch later calling qemuMigrationVPAssociatePortProfiles > sets mac address of VF in migration finish step instead of start step. > The patch aims to reduce packet loss rate. I missed this patch when you initially sent it, and see that nobody else responded... What you're doing here shouldn't be needed. During migration, a macvtap device should be created with ~IFF_UP, and not brought online until qemuInterfaceStartDevice() is called just prior to starting the guest CPUs on the destination; by this time the guest CPUs on the source have already been stopped (and the guest's macvtap interfaces on the source have been set offline). Until a device is IFF_UP, it shouldn't send out any traffic with its MAC address. If you look at the macvtap device on the destination and it has IFF_UP set prior to the completion of migration, then there is a bug in libvirt that we need to fix. Otherwise, I think any packet loss you're seeing is coming from something else. > > Signed-off-by: ZhiPeng Lu <lu.zhipeng@xxxxxxxxxx> > --- > src/qemu/qemu_migration.c | 18 ++++++++++++++++-- > src/util/virnetdevmacvlan.c | 17 +++++++++++------ > 2 files changed, 27 insertions(+), 8 deletions(-) > > diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c > index 09adb04..795ed71 100644 > --- a/src/qemu/qemu_migration.c > +++ b/src/qemu/qemu_migration.c > @@ -5004,7 +5004,7 @@ qemuMigrationPerform(virQEMUDriverPtr driver, > } > > static int > -qemuMigrationVPAssociatePortProfiles(virDomainDefPtr def) > +qemuMigrationVPAssociatePortProfiles(virDomainDefPtr def, const char *stateDir) > { > size_t i; > int last_good_net = -1; > @@ -5013,6 +5013,20 @@ qemuMigrationVPAssociatePortProfiles(virDomainDefPtr def) > for (i = 0; i < def->nnets; i++) { > net = def->nets[i]; > if (virDomainNetGetActualType(net) == VIR_DOMAIN_NET_TYPE_DIRECT) { > + if ((!virDomainNetGetActualVirtPortProfile(net) || (virDomainNetGetActualVirtPortProfile(net) && > + virDomainNetGetActualVirtPortProfile(net)->virtPortType != VIR_NETDEV_VPORT_PROFILE_8021QBG && > + virDomainNetGetActualVirtPortProfile(net)->virtPortType != VIR_NETDEV_VPORT_PROFILE_8021QBH)) && > + virDomainNetGetActualDirectMode(net) == > + VIR_NETDEV_MACVLAN_MODE_PASSTHRU) { > + if (virNetDevSaveNetConfig(virDomainNetGetActualDirectDev(net), > + -1, stateDir, false) < 0) { > + goto err_exit; > + } > + if (virNetDevSetNetConfig(virDomainNetGetActualDirectDev(net), > + -1, NULL, virDomainNetGetActualVlan(net), &net->mac, false) < 0) { > + goto err_exit; > + } > + } > if (virNetDevVPortProfileAssociate(net->ifname, > virDomainNetGetActualVirtPortProfile(net), > &net->mac, > @@ -5187,7 +5201,7 @@ qemuMigrationFinish(virQEMUDriverPtr driver, > goto endjob; > } > > - if (qemuMigrationVPAssociatePortProfiles(vm->def) < 0) > + if (qemuMigrationVPAssociatePortProfiles(vm->def, cfg->stateDir) < 0) > goto endjob; > > if (mig->network && qemuDomainMigrateOPDRelocate(driver, vm, mig) < 0) > diff --git a/src/util/virnetdevmacvlan.c b/src/util/virnetdevmacvlan.c > index 7222b0f..682dcd1 100644 > --- a/src/util/virnetdevmacvlan.c > +++ b/src/util/virnetdevmacvlan.c > @@ -1020,12 +1020,17 @@ virNetDevMacVLanCreateWithVPortProfile(const char *ifnameRequested, > */ > setVlan = false; > } > - > - if (virNetDevSaveNetConfig(linkdev, -1, stateDir, setVlan) < 0) > - return -1; > - > - if (virNetDevSetNetConfig(linkdev, -1, NULL, vlan, macaddress, setVlan) < 0) > - return -1; > + if (vmOp != VIR_NETDEV_VPORT_PROFILE_OP_MIGRATE_IN_START && > + virtPortProfile && (virtPortProfile->virtPortType == VIR_NETDEV_VPORT_PROFILE_8021QBH || > + virtPortProfile->virtPortType == VIR_NETDEV_VPORT_PROFILE_8021QBG)) { > + if (virNetDevSaveNetConfig(linkdev, -1, stateDir, setVlan) < 0) { > + return -1; > + } > + if (virNetDevSetNetConfig(linkdev, -1, NULL, vlan, macaddress, > + setVlan) < 0) { > + return -1; > + } > + } > } > > if (ifnameRequested) { -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list