From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp-outbound-1.vmware.com (smtp-outbound-1.vmware.com [208.91.2.12]) by dpdk.org (Postfix) with ESMTP id 3691F5A13 for ; Tue, 22 Dec 2015 20:51:37 +0100 (CET) Received: from sc9-mailhost3.vmware.com (sc9-mailhost3.vmware.com [10.113.161.73]) by smtp-outbound-1.vmware.com (Postfix) with ESMTP id CBBAE280E3; Tue, 22 Dec 2015 11:51:34 -0800 (PST) Received: from EX13-CAS-002.vmware.com (ex13-cas-002.vmware.com [10.113.191.52]) by sc9-mailhost3.vmware.com (Postfix) with ESMTP id 873B8403D0; Tue, 22 Dec 2015 11:51:35 -0800 (PST) Received: from EX13-MBX-026.vmware.com (10.113.191.46) by EX13-MBX-027.vmware.com (10.113.191.47) with Microsoft SMTP Server (TLS) id 15.0.1076.9; Tue, 22 Dec 2015 11:51:35 -0800 Received: from EX13-MBX-026.vmware.com ([fe80::858b:7f42:fd7c:703d]) by EX13-MBX-026.vmware.com ([fe80::858b:7f42:fd7c:703d%17]) with mapi id 15.00.1076.010; Tue, 22 Dec 2015 11:51:35 -0800 From: Yong Wang To: Stephen Hemminger Thread-Topic: [PATCH 1/3] vmxnet3: support mult-segment receive Thread-Index: AQHRLi/TMy3n2lz3mk+SU793x+5RwJ7Xh/OA Date: Tue, 22 Dec 2015 19:51:35 +0000 Message-ID: <005CE556-6BDC-485B-82A4-5466E57F8E67@vmware.com> References: <1449191107-14222-1-git-send-email-stephen@networkplumber.org> <1449191107-14222-2-git-send-email-stephen@networkplumber.org> In-Reply-To: <1449191107-14222-2-git-send-email-stephen@networkplumber.org> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-ms-exchange-transport-fromentityheader: Hosted x-originating-ip: [10.113.170.11] Content-Type: text/plain; charset="utf-8" Content-ID: <5CD8672F39236E41BFE6263A7178CC68@pa-exch1.vmware.com> Content-Transfer-Encoding: base64 MIME-Version: 1.0 Cc: "dev@dpdk.org" , Stephen Hemminger Subject: Re: [dpdk-dev] [PATCH 1/3] vmxnet3: support mult-segment receive X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 22 Dec 2015 19:51:37 -0000 T24gMTIvMy8xNSwgNTowNSBQTSwgIlN0ZXBoZW4gSGVtbWluZ2VyIiA8c3RlcGhlbkBuZXR3b3Jr cGx1bWJlci5vcmc+IHdyb3RlOg0KDQoNCg0KPkZyb206IFN0ZXBoZW4gSGVtbWluZ2VyIDxzaGVt bWluZ0Bicm9jYWRlLmNvbT4NCj4NCj5UaGUgdm14bmV0MyBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlv biBzdXBwb3J0cyBoYXZpbmcgbXVsdGlwbGUNCj5yZWNlaXZlIHJpbmdzLiBUaGUgZmlyc3Qgcmlu ZyBoYXMgYnVmZmVycyBvZiBCVFlQRV9IRUFEIHdoaWNoDQo+YXJlIHVzZWQgZm9yIHRoZSBzdGFy dCBvZiB0aGUgcGFja2V0LCB0aGUgc2Vjb25kIHJpbmcgaGFzIGJ1ZmZlcnMNCj5vZiB0eXBlIEJU WVBFX0JPRFkgd2hpY2ggYXJlIHVzZWQgb25seSBpZiB0aGUgcmVjZWl2ZWQgcGFja2V0DQo+ZXhj ZWVkcyB0aGUgYXZhaWxhYmxlIHNwYWNlIG9mIHRoZSBoZWFkIGJ1ZmZlci4gIFRoZXJlIGNhbg0K Pnplcm8gb3IgbW9yZSBib2R5IGJ1ZmZlcnMgZm9yIG9uZSBwYWNrZXQuDQo+DQo+V2hhdCB0aGUg ZHJpdmVyIGRvZXMgaXMgcG9zdCBtYnVmJ3MgdG8gYm90aCByaW5ncy4gSWYgYSBqdW1ibw0KPmZy YW1lIGlzIHJlY2VpdmVkOyB0aGVuIGEgbXVsdGktc2VnbWVudCBtYnVmIGlzIGNyZWF0ZWQgYW5k IHRoaXMNCj5pcyByZXR1cm5lZC4gVGhlIHByZXZpb3VzIHZlcnNpb24gb2YgdGhlIGRyaXZlciB3 YXMgZmlsbGluZyBib3RoDQo+cmluZ3MsIGJ1dCB0aGUgc2Vjb25kIHJpbmcgd2FzIG5ldmVyIHVz ZWQuIEl0IHdvdWxkIGVycm9yIG91dA0KPmlmIGl0IGV2ZXIgcmVjZWl2ZWQgYSBtdWx0aS1zZWdt ZW50IG1idWYuDQo+DQo+VGhlIGxvZ2ljIGlzIHZlcnkgc2ltaWxhciB0byBleGlzdGluZyBtZXRo b2RzIHVzZWQgaW4gb3RoZXINCj5PUydzLiBUaGlzIHBhdGNoIGhhcyBiZWVuIHVzZWQgaW50ZXJu YWxseSBieSBzZXZlcmFsIGNvbXBhbmllcw0KPmFuZCB1c2VycyBmb3Igc2V2ZXJhbCByZWxlYXNl cyBhbmQgdGVzdGVkIHdpdGggSnVtYm8gZnJhbWVzLg0KDQoNCkkgYW0gZmluZSB3aXRoIHRoaXMg Y2hhbmdlIGJ1dCBqdXN0IHdhbnQgdG8gcG9pbnQgaXQgb3V0IHRoYXQNCnRoZSBsb2dpYyBoZXJl IGRldmlhdGVzIGZyb20gdGhlIG90aGVyIE9TZXMgc29tZXdoYXQgYXMgdGhleQ0KcG9wdWxhdGUg dGhlIHR3byByaW5ncyBkaWZmZXJlbnRseToNCg0KVGhlIGZpcnN0IHJpbmcgaGFzIHR5cGUgKEhF QUQsIEJPRFksIEJPRFksIEhFQUQsIEJPRFksIEJPRFkpDQphc3N1bWluZyAzIGRlc2NyaXB0b3Jz IGFyZSBuZWVkZWQgdG8gaG9sZCBhIHBrdCBvZiBNVFUgc2l6ZS4gIA0KVGhlIDJuZCByaW5nIGlz IGFsbCBCT0RZIHR5cGUuICBPbmx5IGlmIEJPRFkgdHlwZSBmcm9tIDFzdCByaW5nDQpydW5zIG91 dCB3aWxsIHRoZSAybmQgcmluZyBiZSB1c2VkLg0KDQpIZXJlIHRoZSBmaXJzdCByaW5nIGlzIGV4 Y2x1c2l2ZWx5IG9mIEhFQUQgdHlwZSBhbmQgYW55IHBrdHMNCnRoYXQgY2Fubm90IGhvbGQgaW4g dGhlIEhFQUQgZGVzY3JpcHRvciB3aWxsIGdvIHRvIHRoZSAybmQNCnJpbmcuICBUaGlzIHdpbGwg d29yayBidXQgdGhlbiB0aGUgbnVtYmVyIG9mIGRlc2NyaXB0b3JzIHRoYXQNCmFjdHVhbGx5IGFy ZSBuZWVkZWQgZnJvbSB0aGUgZmlyc3QgcmluZyBpcyBzbWFsbGVyLiAgSWYgd2UNCnBvcHVsYXRl cyB0aGUgMXN0IHJpbmcgYmFzZWQgb24gTVRVIGFzIG90aGVyIE9TZXMgZG8sIHRoZW4NCndlIGp1 c3QgbmVlZCAxIHJpbmcgdG8gaGFuZGxlIGp1bWJvIGZyYW1lLCB3aGljaCBlbmRzIHVwIHdpdGgN CnNtYWxsZXIgd29ya2luZyBzZXQsIGV0Yy4NCg0KPg0KPlNpZ25lZC1vZmYtYnk6IFN0ZXBoZW4g SGVtbWluZ2VyIDxzaGVtbWluZ0Bicm9jYWRlLmNvbT4NCj4tLS0NCj4gZHJpdmVycy9uZXQvdm14 bmV0My92bXhuZXQzX3JpbmcuaCB8ICAyICsNCj4gZHJpdmVycy9uZXQvdm14bmV0My92bXhuZXQz X3J4dHguYyB8IDc4ICsrKysrKysrKysrKysrKysrKystLS0tLS0tLS0tLS0tLS0tLS0tDQo+IDIg ZmlsZXMgY2hhbmdlZCwgNDIgaW5zZXJ0aW9ucygrKSwgMzggZGVsZXRpb25zKC0pDQo+DQo+ZGlm ZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3ZteG5ldDMvdm14bmV0M19yaW5nLmggYi9kcml2ZXJzL25l dC92bXhuZXQzL3ZteG5ldDNfcmluZy5oDQo+aW5kZXggNjEyNDg3ZS4uNTVjZWFkZiAxMDA2NDQN Cj4tLS0gYS9kcml2ZXJzL25ldC92bXhuZXQzL3ZteG5ldDNfcmluZy5oDQo+KysrIGIvZHJpdmVy cy9uZXQvdm14bmV0My92bXhuZXQzX3JpbmcuaA0KPkBAIC0xNzEsNiArMTcxLDggQEAgdHlwZWRl ZiBzdHJ1Y3Qgdm14bmV0M19yeF9xdWV1ZSB7DQo+IAl1aW50MzJfdCAgICAgICAgICAgICAgICAg ICAgcWlkMTsNCj4gCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICBxaWQyOw0KPiAJVm14bmV0 M19SeFF1ZXVlRGVzYyAgICAgICAgICpzaGFyZWQ7DQo+KwlzdHJ1Y3QgcnRlX21idWYJCSAgICAq c3RhcnRfc2VnOw0KPisJc3RydWN0IHJ0ZV9tYnVmCQkgICAgKmxhc3Rfc2VnOw0KPiAJc3RydWN0 IHZteG5ldDNfcnhxX3N0YXRzICAgIHN0YXRzOw0KPiAJYm9vbCAgICAgICAgICAgICAgICAgICAg ICAgIHN0b3BwZWQ7DQo+IAl1aW50MTZfdCAgICAgICAgICAgICAgICAgICAgcXVldWVfaWQ7ICAg ICAgLyoqPCBEZXZpY2UgUlggcXVldWUgaW5kZXguICovDQo+ZGlmZiAtLWdpdCBhL2RyaXZlcnMv bmV0L3ZteG5ldDMvdm14bmV0M19yeHR4LmMgYi9kcml2ZXJzL25ldC92bXhuZXQzL3ZteG5ldDNf cnh0eC5jDQo+aW5kZXggNGRlNWQ4OS4uMDA5ODBhNSAxMDA2NDQNCj4tLS0gYS9kcml2ZXJzL25l dC92bXhuZXQzL3ZteG5ldDNfcnh0eC5jDQo+KysrIGIvZHJpdmVycy9uZXQvdm14bmV0My92bXhu ZXQzX3J4dHguYw0KPkBAIC01NzUsMzUgKzU3NSwxMSBAQCB2bXhuZXQzX3JlY3ZfcGt0cyh2b2lk ICpyeF9xdWV1ZSwgc3RydWN0IHJ0ZV9tYnVmICoqcnhfcGt0cywgdWludDE2X3QgbmJfcGt0cykN Cj4gCQlyeGQgPSAoVm14bmV0M19SeERlc2MgKilyeHEtPmNtZF9yaW5nW3JpbmdfaWR4XS5iYXNl ICsgaWR4Ow0KPiAJCXJiaSA9IHJ4cS0+Y21kX3JpbmdbcmluZ19pZHhdLmJ1Zl9pbmZvICsgaWR4 Ow0KPiANCj4tCQlpZiAodW5saWtlbHkocmNkLT5zb3AgIT0gMSB8fCByY2QtPmVvcCAhPSAxKSkg ew0KPi0JCQlydGVfcGt0bWJ1Zl9mcmVlX3NlZyhyYmktPm0pOw0KPi0JCQlQTURfUlhfTE9HKERF QlVHLCAiUGFja2V0IHNwcmVhZCBhY3Jvc3MgbXVsdGlwbGUgYnVmZmVyc1xuKSIpOw0KPi0JCQln b3RvIHJjZF9kb25lOw0KPi0JCX0NCj4tDQo+IAkJUE1EX1JYX0xPRyhERUJVRywgInJ4ZCBpZHg6 ICVkIHJpbmcgaWR4OiAlZC4iLCBpZHgsIHJpbmdfaWR4KTsNCj4gDQo+IAkJVk1YTkVUM19BU1NF UlQocmNkLT5sZW4gPD0gcnhkLT5sZW4pOw0KPiAJCVZNWE5FVDNfQVNTRVJUKHJiaS0+bSk7DQo+ IA0KPi0JCWlmICh1bmxpa2VseShyY2QtPmxlbiA9PSAwKSkgew0KPi0JCQlQTURfUlhfTE9HKERF QlVHLCAiUnggYnVmIHdhcyBza2lwcGVkLiByeHJpbmdbJWRdWyVkXVxuKSIsDQo+LQkJCQkgICBy aW5nX2lkeCwgaWR4KTsNCj4tCQkJVk1YTkVUM19BU1NFUlQocmNkLT5zb3AgJiYgcmNkLT5lb3Ap Ow0KPi0JCQlydGVfcGt0bWJ1Zl9mcmVlX3NlZyhyYmktPm0pOw0KPi0JCQlnb3RvIHJjZF9kb25l Ow0KPi0JCX0NCj4tDQo+LQkJLyogQXNzdW1pbmcgYSBwYWNrZXQgaXMgY29taW5nIGluIGEgc2lu Z2xlIHBhY2tldCBidWZmZXIgKi8NCj4tCQlpZiAodW5saWtlbHkocnhkLT5idHlwZSAhPSBWTVhO RVQzX1JYRF9CVFlQRV9IRUFEKSkgew0KPi0JCQlQTURfUlhfTE9HKERFQlVHLA0KPi0JCQkJICAg IkFsZXJ0IDogTWlzYmVoYXZpbmcgZGV2aWNlLCBpbmNvcnJlY3QgIg0KPi0JCQkJICAgIiBidWZm ZXIgdHlwZSB1c2VkLiBpUGFja2V0IGRyb3BwZWQuIik7DQo+LQkJCXJ0ZV9wa3RtYnVmX2ZyZWVf c2VnKHJiaS0+bSk7DQo+LQkJCWdvdG8gcmNkX2RvbmU7DQo+LQkJfQ0KPi0JCVZNWE5FVDNfQVNT RVJUKHJ4ZC0+YnR5cGUgPT0gVk1YTkVUM19SWERfQlRZUEVfSEVBRCk7DQo+LQ0KPiAJCS8qIEdl dCB0aGUgcGFja2V0IGJ1ZmZlciBwb2ludGVyIGZyb20gYnVmX2luZm8gKi8NCj4gCQlyeG0gPSBy YmktPm07DQo+IA0KPkBAIC02MTUsNyArNTkxLDcgQEAgdm14bmV0M19yZWN2X3BrdHModm9pZCAq cnhfcXVldWUsIHN0cnVjdCBydGVfbWJ1ZiAqKnJ4X3BrdHMsIHVpbnQxNl90IG5iX3BrdHMpDQo+ IAkJcnhxLT5jbWRfcmluZ1tyaW5nX2lkeF0ubmV4dDJjb21wID0gaWR4Ow0KPiANCj4gCQkvKiBG b3IgUkNEIHdpdGggRU9QIHNldCwgY2hlY2sgaWYgdGhlcmUgaXMgZnJhbWUgZXJyb3IgKi8NCj4t CQlpZiAodW5saWtlbHkocmNkLT5lcnIpKSB7DQo+KwkJaWYgKHVubGlrZWx5KHJjZC0+ZW9wICYm IHJjZC0+ZXJyKSkgew0KPiAJCQlyeHEtPnN0YXRzLmRyb3BfdG90YWwrKzsNCj4gCQkJcnhxLT5z dGF0cy5kcm9wX2VycisrOw0KPiANCj5AQCAtNjQxLDkgKzYxNyw0NSBAQCB2bXhuZXQzX3JlY3Zf cGt0cyh2b2lkICpyeF9xdWV1ZSwgc3RydWN0IHJ0ZV9tYnVmICoqcnhfcGt0cywgdWludDE2X3Qg bmJfcGt0cykNCj4gCQlyeG0tPm9sX2ZsYWdzID0gMDsNCj4gCQlyeG0tPnZsYW5fdGNpID0gMDsN Cj4gDQo+LQkJdm14bmV0M19yeF9vZmZsb2FkKHJjZCwgcnhtKTsNCj4rCQkvKg0KPisJCSAqIElm IHRoaXMgaXMgdGhlIGZpcnN0IGJ1ZmZlciBvZiB0aGUgcmVjZWl2ZWQgcGFja2V0LA0KPisJCSAq IHNldCB0aGUgcG9pbnRlciB0byB0aGUgZmlyc3QgbWJ1ZiBvZiB0aGUgcGFja2V0DQo+KwkJICog T3RoZXJ3aXNlLCB1cGRhdGUgdGhlIHRvdGFsIGxlbmd0aCBhbmQgdGhlIG51bWJlciBvZiBzZWdt ZW50cw0KPisJCSAqIG9mIHRoZSBjdXJyZW50IHNjYXR0ZXJlZCBwYWNrZXQsIGFuZCB1cGRhdGUg dGhlIHBvaW50ZXIgdG8NCj4rCQkgKiB0aGUgbGFzdCBtYnVmIG9mIHRoZSBjdXJyZW50IHBhY2tl dC4NCj4rCQkgKi8NCj4rCQlpZiAocmNkLT5zb3ApIHsNCj4rCQkJVk1YTkVUM19BU1NFUlQoIXJ4 cS0+c3RhcnRfc2VnKTsNCg0Kbml0OiBjaGFuZ2UgdGhpcyB0byBWTVhORVQzKHJ4cS0+c3RhcnRf c2VnID09IE5VTEwpIHRvIGJlIGNvbnNpc3RlbnQNCndpdGggdGhlIGNoZWNrIGZvciBzdGFydCAh PSBOVUxMIGluIHRoZSBlbHNlIGJsb2NrLg0KDQo+KwkJCVZNWE5FVDNfQVNTRVJUKHJ4ZC0+YnR5 cGUgPT0gVk1YTkVUM19SWERfQlRZUEVfSEVBRCk7DQo+Kw0KPisJCQlpZiAodW5saWtlbHkocmNk LT5sZW4gPT0gMCkpIHsNCj4rCQkJCVBNRF9SWF9MT0coREVCVUcsDQo+KwkJCQkJICAgIlJ4IGJ1 ZiB3YXMgc2tpcHBlZC4gcnhyaW5nWyVkXVslZF0pIiwNCj4rCQkJCQkgICByaW5nX2lkeCwgaWR4 KTsNCg0KQ2FuIHlvdSBhZGQgYmFjayB0aGUgYXNzZXJ0IFZNWE5FVDNfQVNTRVJUKHJjZC0+c29w ICYmIHJjZC0+dG9wKSBoZXJlLg0KDQo+KwkJCQlydGVfcGt0bWJ1Zl9mcmVlX3NlZyhyeG0pOw0K PisJCQkJZ290byByY2RfZG9uZTsNCj4rCQkJfQ0KPisNCj4rCQkJcnhxLT5zdGFydF9zZWcgPSBy eG07DQo+KwkJCXZteG5ldDNfcnhfb2ZmbG9hZChyY2QsIHJ4bSk7DQo+KwkJfSBlbHNlIHsNCj4r CQkJc3RydWN0IHJ0ZV9tYnVmICpzdGFydCA9IHJ4cS0+c3RhcnRfc2VnOw0KPisNCj4rCQkJVk1Y TkVUM19BU1NFUlQocnhkLT5idHlwZSA9PSBWTVhORVQzX1JYRF9CVFlQRV9CT0RZKTsNCj4rCQkJ Vk1YTkVUM19BU1NFUlQoc3RhcnQgIT0gTlVMTCk7DQo+Kw0KPisJCQlzdGFydC0+cGt0X2xlbiAr PSByeG0tPmRhdGFfbGVuOw0KPisJCQlzdGFydC0+bmJfc2VncysrOw0KPisNCj4rCQkJcnhxLT5s YXN0X3NlZy0+bmV4dCA9IHJ4bTsNCj4rCQl9DQo+KwkJcnhxLT5sYXN0X3NlZyA9IHJ4bTsNCj4r DQo+KwkJaWYgKHJjZC0+ZW9wKSB7DQo+KwkJCXJ4X3BrdHNbbmJfcngrK10gPSByeHEtPnN0YXJ0 X3NlZzsNCj4rCQkJcnhxLT5zdGFydF9zZWcgPSBOVUxMOw0KPisJCX0NCj4gDQo+LQkJcnhfcGt0 c1tuYl9yeCsrXSA9IHJ4bTsNCj4gcmNkX2RvbmU6DQo+IAkJcnhxLT5jbWRfcmluZ1tyaW5nX2lk eF0ubmV4dDJjb21wID0gaWR4Ow0KPiAJCVZNWE5FVDNfSU5DX1JJTkdfSURYX09OTFkocnhxLT5j bWRfcmluZ1tyaW5nX2lkeF0ubmV4dDJjb21wLCByeHEtPmNtZF9yaW5nW3JpbmdfaWR4XS5zaXpl KTsNCj5AQCAtODEyLDIwICs4MjQsOSBAQCB2bXhuZXQzX2Rldl9yeF9xdWV1ZV9zZXR1cChzdHJ1 Y3QgcnRlX2V0aF9kZXYgKmRldiwNCj4gCWludCBzaXplOw0KPiAJdWludDhfdCBpOw0KPiAJY2hh ciBtZW1fbmFtZVszMl07DQo+LQl1aW50MTZfdCBidWZfc2l6ZTsNCj4gDQo+IAlQTURfSU5JVF9G VU5DX1RSQUNFKCk7DQo+IA0KPi0JYnVmX3NpemUgPSBydGVfcGt0bWJ1Zl9kYXRhX3Jvb21fc2l6 ZShtcCkgLQ0KPi0JCVJURV9QS1RNQlVGX0hFQURST09NOw0KPi0NCj4tCWlmIChkZXYtPmRhdGEt PmRldl9jb25mLnJ4bW9kZS5tYXhfcnhfcGt0X2xlbiA+IGJ1Zl9zaXplKSB7DQo+LQkJUE1EX0lO SVRfTE9HKEVSUiwgImJ1Zl9zaXplID0gJXUsIG1heF9wa3RfbGVuID0gJXUsICINCj4tCQkJICAg ICAiVk1YTkVUMyBkb24ndCBzdXBwb3J0IHNjYXR0ZXIgcGFja2V0cyB5ZXQiLA0KPi0JCQkgICAg IGJ1Zl9zaXplLCBkZXYtPmRhdGEtPmRldl9jb25mLnJ4bW9kZS5tYXhfcnhfcGt0X2xlbik7DQo+ LQkJcmV0dXJuIC1FSU5WQUw7DQo+LQl9DQo+LQ0KPiAJcnhxID0gcnRlX3ptYWxsb2MoImV0aGRl dl9yeF9xdWV1ZSIsIHNpemVvZihzdHJ1Y3Qgdm14bmV0M19yeF9xdWV1ZSksIFJURV9DQUNIRV9M SU5FX1NJWkUpOw0KPiAJaWYgKHJ4cSA9PSBOVUxMKSB7DQo+IAkJUE1EX0lOSVRfTE9HKEVSUiwg IkNhbiBub3QgYWxsb2NhdGUgcnggcXVldWUgc3RydWN0dXJlIik7DQo+QEAgLTk0NCw2ICs5NDUs NyBAQCB2bXhuZXQzX2Rldl9yeHR4X2luaXQoc3RydWN0IHJ0ZV9ldGhfZGV2ICpkZXYpDQo+IAkJ CX0NCj4gCQl9DQo+IAkJcnhxLT5zdG9wcGVkID0gRkFMU0U7DQo+KwkJcnhxLT5zdGFydF9zZWcg PSBOVUxMOw0KPiAJfQ0KPiANCj4gCWZvciAoaSA9IDA7IGkgPCBkZXYtPmRhdGEtPm5iX3R4X3F1 ZXVlczsgaSsrKSB7DQo+LS0gDQo+Mi4xLjQNCj4NCg==