[libvirt] [v2 RESEND PATCH] qemu: reduce packet loss rate for vm with macvtap passthrough mode in migration

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

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

T24gMDYvMTQvMjAxNyAwNDoyOSBBTSwgWmhpUGVuZyBMdSB3cm90ZTo+IEJlZm9yZSBsaWJ2aXJ0 IHRoYXQgY2FsbHMgdmlyTmV0RGV2TWFjVkxhbkNyZWF0ZVdpdGhWUG9ydFByb2ZpbGUgc2V0cyBt YWMgYWRkcmVzcz4gb3IgdmxhbiBvZiBhIFZpcnR1YWwgRnVuY3Rpb24oVkYpIGxpbmtlZCB0byBh IG1hY3Z0YXAgcGFzc3Rocm91Z2ggZGV2aWNlIG9mIG1pZ3JhdGlvbj4gZGVzdGluYXRpb24gaG9z dCBpbiBtaWdyYXRpb24gc3RhcnQgc3RlcC4gSWYgd2UgcGluZyB0aGUgbWlncmF0aW5nIHZtLD4g d2UgZ2V0IHRoZSBuZXR3b3JrIGRvZXMgbm90IHBhc3MuIEJlY2F1c2UgVkZzIG9mIG1pZ3JhdGlv biBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uPiBoYXZlIHRoZSBzYW1lIE1BQyBhZGRyZXNzLiBUaGUg cGF0Y2ggbGF0ZXIgY2FsbGluZyBxZW11TWlncmF0aW9uVlBBc3NvY2lhdGVQb3J0UHJvZmlsZXM+ IHNldHMgbWFjIGFkZHJlc3Mgb2YgVkYgaW4gbWlncmF0aW9uIGZpbmlzaCBzdGVwIGluc3RlYWQg b2Ygc3RhcnQgc3RlcC4+IFRoZSBwYXRjaCBhaW1zIHRvIHJlZHVjZSBwYWNrZXQgbG9zcyByYXRl Lj5JIG1pc3NlZCB0aGlzIHBhdGNoIHdoZW4geW91IGluaXRpYWxseSBzZW50IGl0LCBhbmQgc2Vl IHRoYXQgbm9ib2R5IGVsc2U+cmVzcG9uZGVkLi4uPldoYXQgeW91J3JlIGRvaW5nIGhlcmUgc2hv dWxkbid0IGJlIG5lZWRlZC4gRHVyaW5nIG1pZ3JhdGlvbiwgYSBtYWN2dGFwPmRldmljZSBzaG91 bGQgYmUgY3JlYXRlZCB3aXRoIH5JRkZfVVAsIGFuZCBub3QgYnJvdWdodCBvbmxpbmUgdW50aWw+ cWVtdUludGVyZmFjZVN0YXJ0RGV2aWNlKCkgaXMgY2FsbGVkIGp1c3QgcHJpb3IgdG8gc3RhcnRp bmcgdGhlIGd1ZXN0PkNQVXMgb24gdGhlIGRlc3RpbmF0aW9uIGJ5IHRoaXMgdGltZSB0aGUgZ3Vl c3QgQ1BVcyBvbiB0aGUgc291cmNlIGhhdmU+YWxyZWFkeSBiZWVuIHN0b3BwZWQgKGFuZCB0aGUg Z3Vlc3QncyBtYWN2dGFwIGludGVyZmFjZXMgb24gdGhlIHNvdXJjZT5oYXZlIGJlZW4gc2V0IG9m ZmxpbmUpLiBVbnRpbCBhIGRldmljZSBpcyBJRkZfVVAsIGl0IHNob3VsZG4ndCBzZW5kIG91dD5h bnkgdHJhZmZpYyB3aXRoIGl0cyBNQUMgYWRkcmVzcy4NCg0KLS0tLVByb2JhYmx5IG5vdCB1bmRl cnN0YW5kaW5nIHdoYXQgSSBtZWFuIHdoZW4gdGhlIG5ldHdvcmsgcGFja2V0IGxvc3MgaGFwcGVu cy4gDQoNClRoaXMgcGF0Y2ggZGVzY3JpYmVzICB0aGUgdGltZSBiZWZvcmUgdGhlIGd1ZXN0IENQ VSBvbiB0aGUgIHNvdXJjZSAgaGFzIGJlZW4gc3RvcHBlZCBhbmQgdGhlIG1hY3Z0YXAgZGV2aWNl IHdhcyBJRkZfVVAuDQoNCmlmIHdlIHNlbmQgbmV0d29yayBkYXRhIGZyb20gdGhlIGRlc3RpbmF0 aW9uLCB0aGUgbmV0d29yayBwYWNrZXQgbG9zcy4NCg0KDQoNCj5JZiB5b3UgbG9vayBhdCB0aGUg bWFjdnRhcCBkZXZpY2Ugb24gdGhlIGRlc3RpbmF0aW9uIGFuZCBpdCBoYXMgSUZGX1VQPnNldCBw cmlvciB0byB0aGUgY29tcGxldGlvbiBvZiBtaWdyYXRpb24sIHRoZW4gdGhlcmUgaXMgYSBidWcg aW4gbGlidmlydD50aGF0IHdlIG5lZWQgdG8gZml4LiBPdGhlcndpc2UsIEkgdGhpbmsgYW55IHBh Y2tldCBsb3NzIHlvdSdyZSBzZWVpbmcgaXM+Y29taW5nIGZyb20gc29tZXRoaW5nIGVsc2UuPj4g U2lnbmVkLW9mZi1ieTogWmhpUGVuZyBMdSA8bHUuemhpcGVuZ0B6dGUuY29tLmNuPj4gLS0tPiAg c3JjL3FlbXUvcWVtdV9taWdyYXRpb24uYyAgIHwgMTggKysrKysrKysrKysrKysrKy0tPiAgc3Jj L3V0aWwvdmlybmV0ZGV2bWFjdmxhbi5jIHwgMTcgKysrKysrKysrKystLS0tLS0+ICAyIGZpbGVz IGNoYW5nZWQsIDI3IGluc2VydGlvbnMoKyksIDggZGVsZXRpb25zKC0pPj4gZGlmZiAtLWdpdCBh L3NyYy9xZW11L3FlbXVfbWlncmF0aW9uLmMgYi9zcmMvcWVtdS9xZW11X21pZ3JhdGlvbi5jPiBp bmRleCAwOWFkYjA0Li43OTVlZDcxIDEwMDY0ND4gLS0tIGEvc3JjL3FlbXUvcWVtdV9taWdyYXRp b24uYz4gKysrIGIvc3JjL3FlbXUvcWVtdV9taWdyYXRpb24uYz4gQEAgLTUwMDQsNyArNTAwNCw3 IEBAIHFlbXVNaWdyYXRpb25QZXJmb3JtKHZpclFFTVVEcml2ZXJQdHIgZHJpdmVyLD4gIH0+ICA+ ICBzdGF0aWMgaW50PiAtcWVtdU1pZ3JhdGlvblZQQXNzb2NpYXRlUG9ydFByb2ZpbGVzKHZpckRv bWFpbkRlZlB0ciBkZWYpPiArcWVtdU1pZ3JhdGlvblZQQXNzb2NpYXRlUG9ydFByb2ZpbGVzKHZp ckRvbWFpbkRlZlB0ciBkZWYsIGNvbnN0IGNoYXIgKnN0YXRlRGlyKQ0KDQoNCg0KDQoNCg0KDQoN Cg0KDQoNCg0KDQoNCuiKpuW/l+aciyBsdXpoaXBlbmcNCg0KDQoNCg0KDQoNCklU5byA5Y+R5bel 56iL5biIIElUIERldmVsb3BtZW50CkVuZ2luZWVyDQrmk43kvZzns7vnu5/kuqflk4Hpg6gv5Lit 5b+D56CU56m26ZmiL+ezu+e7n+S6p+WTgSBPUyBQcm9kdWN0IERlcHQuL0NlbnRyYWwgUu+8hkQg SW5zdGl0dXRlL1N5c3RlbSBQcm9kdWN0DQoNCg0KDQoNCg0KDQoNCg0KDQrmt7HlnLPluILljZfl sbHljLrnp5HmioDljZfot681NeWPt+S4reWFtOmAmuiur+eglOWPkeWkp+alvDMz5qW8IA0KMzMv RiwgUiZEIEJ1aWxkaW5nLCBaVEUKQ29ycG9yYXRpb24gSGktdGVjaCBSb2FkIFNvdXRoLCANCkhp LXRlY2gKSW5kdXN0cmlhbCBQYXJrIE5hbnNoYW4gRGlzdHJpY3QsIFNoZW56aGVuLCBQLlIuQ2hp bmEsIDUxODA1NyANClQ6ICs4NiA3NTUgeHh4eHh4eHggRjorODYgNzU1IHh4eHh4eHh4IA0KTTog Kzg2IHh4eHh4eHh4eHh4IA0KRTogbHUuemhpcGVuZ0B6dGUuY29tLmNuIA0Kd3d3Lnp0ZS5jb20u Y24NCg0KDQoNCg0KDQoNCuWOn+Wni+mCruS7tg0KDQoNCg0K5Y+R5Lu25Lq677yaIDxsYWluZUBs YWluZS5vcmc+DQrmlLbku7bkurrvvJogPGxpYnZpci1saXN0QHJlZGhhdC5jb20+DQrmioTpgIHk urrvvJroiqblv5fmnIsxMDEwODI3Mg0K5pelIOacnyDvvJoyMDE35bm0MDfmnIgxN+aXpSAwNTow MQ0K5Li7IOmimCDvvJpSZTogW2xpYnZpcnRdIFt2MiBSRVNFTkQgUEFUQ0hdIHFlbXU6IHJlZHVj ZSBwYWNrZXQgbG9zcyByYXRlIGZvciB2bXdpdGggbWFjdnRhcCBwYXNzdGhyb3VnaCBtb2RlIGlu IG1pZ3JhdGlvbg0KDQoNCg0KDQoNCk9uIDA2LzE0LzIwMTcgMDQ6MjkgQU0sIFpoaVBlbmcgTHUg d3JvdGU6DQo+IEJlZm9yZSBsaWJ2aXJ0IHRoYXQgY2FsbHMgdmlyTmV0RGV2TWFjVkxhbkNyZWF0 ZVdpdGhWUG9ydFByb2ZpbGUgc2V0cyBtYWMgYWRkcmVzcw0KPiBvciB2bGFuIG9mIGEgVmlydHVh bCBGdW5jdGlvbihWRikgbGlua2VkIHRvIGEgbWFjdnRhcCBwYXNzdGhyb3VnaCBkZXZpY2Ugb2Yg bWlncmF0aW9uDQo+IGRlc3RpbmF0aW9uIGhvc3QgaW4gbWlncmF0aW9uIHN0YXJ0IHN0ZXAuIElm IHdlIHBpbmcgdGhlIG1pZ3JhdGluZyB2bSwNCj4gd2UgZ2V0IHRoZSBuZXR3b3JrIGRvZXMgbm90 IHBhc3MuIEJlY2F1c2UgVkZzIG9mIG1pZ3JhdGlvbiBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uDQo+ IGhhdmUgdGhlIHNhbWUgTUFDIGFkZHJlc3MuIFRoZSBwYXRjaCBsYXRlciBjYWxsaW5nIHFlbXVN aWdyYXRpb25WUEFzc29jaWF0ZVBvcnRQcm9maWxlcw0KPiBzZXRzIG1hYyBhZGRyZXNzIG9mIFZG IGluIG1pZ3JhdGlvbiBmaW5pc2ggc3RlcCBpbnN0ZWFkIG9mIHN0YXJ0IHN0ZXAuDQo+IFRoZSBw YXRjaCBhaW1zIHRvIHJlZHVjZSBwYWNrZXQgbG9zcyByYXRlLg0KDQpJIG1pc3NlZCB0aGlzIHBh dGNoIHdoZW4geW91IGluaXRpYWxseSBzZW50IGl0LCBhbmQgc2VlIHRoYXQgbm9ib2R5IGVsc2UN CnJlc3BvbmRlZC4uLg0KDQoNCldoYXQgeW91J3JlIGRvaW5nIGhlcmUgc2hvdWxkbid0IGJlIG5l ZWRlZC4gRHVyaW5nIG1pZ3JhdGlvbiwgYSBtYWN2dGFwDQpkZXZpY2Ugc2hvdWxkIGJlIGNyZWF0 ZWQgd2l0aCB+SUZGX1VQLCBhbmQgbm90IGJyb3VnaHQgb25saW5lIHVudGlsDQpxZW11SW50ZXJm YWNlU3RhcnREZXZpY2UoKSBpcyBjYWxsZWQganVzdCBwcmlvciB0byBzdGFydGluZyB0aGUgZ3Vl c3QNCkNQVXMgb24gdGhlIGRlc3RpbmF0aW9uIGJ5IHRoaXMgdGltZSB0aGUgZ3Vlc3QgQ1BVcyBv biB0aGUgc291cmNlIGhhdmUNCmFscmVhZHkgYmVlbiBzdG9wcGVkIChhbmQgdGhlIGd1ZXN0J3Mg bWFjdnRhcCBpbnRlcmZhY2VzIG9uIHRoZSBzb3VyY2UNCmhhdmUgYmVlbiBzZXQgb2ZmbGluZSku IFVudGlsIGEgZGV2aWNlIGlzIElGRl9VUCwgaXQgc2hvdWxkbid0IHNlbmQgb3V0DQphbnkgdHJh ZmZpYyB3aXRoIGl0cyBNQUMgYWRkcmVzcy4NCg0KSWYgeW91IGxvb2sgYXQgdGhlIG1hY3Z0YXAg ZGV2aWNlIG9uIHRoZSBkZXN0aW5hdGlvbiBhbmQgaXQgaGFzIElGRl9VUA0Kc2V0IHByaW9yIHRv IHRoZSBjb21wbGV0aW9uIG9mIG1pZ3JhdGlvbiwgdGhlbiB0aGVyZSBpcyBhIGJ1ZyBpbiBsaWJ2 aXJ0DQp0aGF0IHdlIG5lZWQgdG8gZml4LiBPdGhlcndpc2UsIEkgdGhpbmsgYW55IHBhY2tldCBs b3NzIHlvdSdyZSBzZWVpbmcgaXMNCmNvbWluZyBmcm9tIHNvbWV0aGluZyBlbHNlLg0KDQoNCj4N Cj4gU2lnbmVkLW9mZi1ieTogWmhpUGVuZyBMdSA8bHUuemhpcGVuZ0B6dGUuY29tLmNuPg0KPiAt LS0NCj4gIHNyYy9xZW11L3FlbXVfbWlncmF0aW9uLmMgICB8IDE4ICsrKysrKysrKysrKysrKyst LQ0KPiAgc3JjL3V0aWwvdmlybmV0ZGV2bWFjdmxhbi5jIHwgMTcgKysrKysrKysrKystLS0tLS0N Cj4gIDIgZmlsZXMgY2hhbmdlZCwgMjcgaW5zZXJ0aW9ucygrKSwgOCBkZWxldGlvbnMoLSkNCj4N Cj4gZGlmZiAtLWdpdCBhL3NyYy9xZW11L3FlbXVfbWlncmF0aW9uLmMgYi9zcmMvcWVtdS9xZW11 X21pZ3JhdGlvbi5jDQo+IGluZGV4IDA5YWRiMDQuLjc5NWVkNzEgMTAwNjQ0DQo+IC0tLSBhL3Ny Yy9xZW11L3FlbXVfbWlncmF0aW9uLmMNCj4gKysrIGIvc3JjL3FlbXUvcWVtdV9taWdyYXRpb24u Yw0KPiBAQCAtNTAwNCw3ICs1MDA0LDcgQEAgcWVtdU1pZ3JhdGlvblBlcmZvcm0odmlyUUVNVURy aXZlclB0ciBkcml2ZXIsDQo+ICB9DQo+ICANCj4gIHN0YXRpYyBpbnQNCj4gLXFlbXVNaWdyYXRp b25WUEFzc29jaWF0ZVBvcnRQcm9maWxlcyh2aXJEb21haW5EZWZQdHIgZGVmKQ0KPiArcWVtdU1p Z3JhdGlvblZQQXNzb2NpYXRlUG9ydFByb2ZpbGVzKHZpckRvbWFpbkRlZlB0ciBkZWYsIGNvbnN0 IGNoYXIgKnN0YXRlRGlyKQ0KPiAgew0KPiAgICAgIHNpemVfdCBpDQo+ICAgICAgaW50IGxhc3Rf Z29vZF9uZXQgPSAtMQ0KPiBAQCAtNTAxMyw2ICs1MDEzLDIwIEBAIHFlbXVNaWdyYXRpb25WUEFz c29jaWF0ZVBvcnRQcm9maWxlcyh2aXJEb21haW5EZWZQdHIgZGVmKQ0KPiAgICAgIGZvciAoaSA9 IDAgaSA8IGRlZi0+bm5ldHMgaSsrKSB7DQo+ICAgICAgICAgIG5ldCA9IGRlZi0+bmV0c1tpXQ0K PiAgICAgICAgICBpZiAodmlyRG9tYWluTmV0R2V0QWN0dWFsVHlwZShuZXQpID09IFZJUl9ET01B SU5fTkVUX1RZUEVfRElSRUNUKSB7DQo+ICsgICAgICAgICAgICBpZiAoKCF2aXJEb21haW5OZXRH ZXRBY3R1YWxWaXJ0UG9ydFByb2ZpbGUobmV0KSB8fCAodmlyRG9tYWluTmV0R2V0QWN0dWFsVmly dFBvcnRQcm9maWxlKG5ldCkgJiYNCj4gKyAgICAgICAgICAgICAgICAgdmlyRG9tYWluTmV0R2V0 QWN0dWFsVmlydFBvcnRQcm9maWxlKG5ldCktPnZpcnRQb3J0VHlwZSAhPSBWSVJfTkVUREVWX1ZQ T1JUX1BST0ZJTEVfODAyMVFCRyAmJg0KPiArICAgICAgICAgICAgICAgIHZpckRvbWFpbk5ldEdl dEFjdHVhbFZpcnRQb3J0UHJvZmlsZShuZXQpLT52aXJ0UG9ydFR5cGUgIT0gVklSX05FVERFVl9W UE9SVF9QUk9GSUxFXzgwMjFRQkgpKSAmJg0KPiArICAgICAgICAgICAgICAgIHZpckRvbWFpbk5l dEdldEFjdHVhbERpcmVjdE1vZGUobmV0KSA9PQ0KPiArICAgICAgICAgICAgICAgICBWSVJfTkVU REVWX01BQ1ZMQU5fTU9ERV9QQVNTVEhSVSkgew0KPiArICAgICAgICAgICAgICAgIGlmICh2aXJO ZXREZXZTYXZlTmV0Q29uZmlnKHZpckRvbWFpbk5ldEdldEFjdHVhbERpcmVjdERldihuZXQpLA0K PiArICAgICAgICAgICAgICAgICAgICAtMSwgc3RhdGVEaXIsIGZhbHNlKSA8IDApIHsNCj4gKyAg ICAgICAgICAgICAgICAgICAgZ290byBlcnJfZXhpdA0KPiArICAgICAgICAgICAgICAgIH0NCj4g KyAgICAgICAgICAgICAgICBpZiAodmlyTmV0RGV2U2V0TmV0Q29uZmlnKHZpckRvbWFpbk5ldEdl dEFjdHVhbERpcmVjdERldihuZXQpLA0KPiArICAgICAgICAgICAgICAgICAgICAtMSwgTlVMTCwg dmlyRG9tYWluTmV0R2V0QWN0dWFsVmxhbihuZXQpLCAmbmV0LT5tYWMsIGZhbHNlKSA8IDApIHsN Cj4gKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnJfZXhpdA0KPiArICAgICAgICAgICAgICAg IH0NCj4gKyAgICAgICAgICAgIH0NCj4gICAgICAgICAgICAgIGlmICh2aXJOZXREZXZWUG9ydFBy b2ZpbGVBc3NvY2lhdGUobmV0LT5pZm5hbWUsDQo+ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHZpckRvbWFpbk5ldEdldEFjdHVhbFZpcnRQb3J0UHJvZmls ZShuZXQpLA0KPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAmbmV0LT5tYWMsDQo+IEBAIC01MTg3LDcgKzUyMDEsNyBAQCBxZW11TWlncmF0aW9uRmluaXNo KHZpclFFTVVEcml2ZXJQdHIgZHJpdmVyLA0KPiAgICAgICAgICBnb3RvIGVuZGpvYg0KPiAgICAg IH0NCj4gIA0KPiAtICAgIGlmIChxZW11TWlncmF0aW9uVlBBc3NvY2lhdGVQb3J0UHJvZmlsZXMo dm0tPmRlZikgPCAwKQ0KPiArICAgIGlmIChxZW11TWlncmF0aW9uVlBBc3NvY2lhdGVQb3J0UHJv ZmlsZXModm0tPmRlZiwgY2ZnLT5zdGF0ZURpcikgPCAwKQ0KPiAgICAgICAgICBnb3RvIGVuZGpv Yg0KPiAgDQo+ICAgICAgaWYgKG1pZy0+bmV0d29yayAmJiBxZW11RG9tYWluTWlncmF0ZU9QRFJl bG9jYXRlKGRyaXZlciwgdm0sIG1pZykgPCAwKQ0KPiBkaWZmIC0tZ2l0IGEvc3JjL3V0aWwvdmly bmV0ZGV2bWFjdmxhbi5jIGIvc3JjL3V0aWwvdmlybmV0ZGV2bWFjdmxhbi5jDQo+IGluZGV4IDcy MjJiMGYuLjY4MmRjZDEgMTAwNjQ0DQo+IC0tLSBhL3NyYy91dGlsL3Zpcm5ldGRldm1hY3ZsYW4u Yw0KPiArKysgYi9zcmMvdXRpbC92aXJuZXRkZXZtYWN2bGFuLmMNCj4gQEAgLTEwMjAsMTIgKzEw MjAsMTcgQEAgdmlyTmV0RGV2TWFjVkxhbkNyZWF0ZVdpdGhWUG9ydFByb2ZpbGUoY29uc3QgY2hh ciAqaWZuYW1lUmVxdWVzdGVkLA0KPiAgICAgICAgICAgICAgICovDQo+ICAgICAgICAgICAgICBz ZXRWbGFuID0gZmFsc2UNCj4gICAgICAgICAgfQ0KPiAtDQo+IC0gICAgICAgIGlmICh2aXJOZXRE ZXZTYXZlTmV0Q29uZmlnKGxpbmtkZXYsIC0xLCBzdGF0ZURpciwgc2V0VmxhbikgPCAwKQ0KPiAt ICAgICAgICAgICByZXR1cm4gLTENCj4gLQ0KPiAtICAgICAgICBpZiAodmlyTmV0RGV2U2V0TmV0 Q29uZmlnKGxpbmtkZXYsIC0xLCBOVUxMLCB2bGFuLCBtYWNhZGRyZXNzLCBzZXRWbGFuKSA8IDAp DQo+IC0gICAgICAgICAgIHJldHVybiAtMQ0KPiArICAgICAgICBpZiAodm1PcCAhPSBWSVJfTkVU REVWX1ZQT1JUX1BST0ZJTEVfT1BfTUlHUkFURV9JTl9TVEFSVCAmJg0KPiArICAgICAgICAgICAg dmlydFBvcnRQcm9maWxlICYmICh2aXJ0UG9ydFByb2ZpbGUtPnZpcnRQb3J0VHlwZSA9PSBWSVJf TkVUREVWX1ZQT1JUX1BST0ZJTEVfODAyMVFCSCB8fA0KPiArICAgICAgICAgICAgdmlydFBvcnRQ cm9maWxlLT52aXJ0UG9ydFR5cGUgPT0gVklSX05FVERFVl9WUE9SVF9QUk9GSUxFXzgwMjFRQkcp KSB7DQo+ICsgICAgICAgICAgICBpZiAodmlyTmV0RGV2U2F2ZU5ldENvbmZpZyhsaW5rZGV2LCAt MSwgc3RhdGVEaXIsIHNldFZsYW4pIDwgMCkgew0KPiArICAgICAgICAgICAgICAgIHJldHVybiAt MQ0KPiArICAgICAgICAgICAgfQ0KPiArICAgICAgICAgICAgaWYgKHZpck5ldERldlNldE5ldENv bmZpZyhsaW5rZGV2LCAtMSwgTlVMTCwgdmxhbiwgbWFjYWRkcmVzcywNCj4gKyAgICAgICAgICAg ICAgICBzZXRWbGFuKSA8IDApIHsNCj4gKyAgICAgICAgICAgICAgICByZXR1cm4gLTENCj4gKyAg ICAgICAgICAgIH0NCj4gKyAgICAgICAgfQ0KPiAgICAgIH0NCj4gIA0KPiAgICAgIGlmIChpZm5h bWVSZXF1ZXN0ZWQpIHs=
participants (3)
-
Laine Stump
-
lu.zhipeng@zte.com.cn
-
ZhiPeng Lu