src/qemu/qemu_migration.c | 18 ++++++++++++++++-- src/util/virnetdevmacvlan.c | 17 +++++++++++------ 2 files changed, 27 insertions(+), 8 deletions(-)
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.
Signed-off-by: ZhiPeng Lu <lu.zhipeng@zte.com.cn>
---
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) {
--
1.8.3.1
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
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@zte.com.cn> > --- > 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@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
© 2016 - 2025 Red Hat, Inc.