From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-it1-f198.google.com (mail-it1-f198.google.com [209.85.166.198]) by kanga.kvack.org (Postfix) with ESMTP id BC71F6B0007 for ; Wed, 31 Oct 2018 11:40:06 -0400 (EDT) Received: by mail-it1-f198.google.com with SMTP id d10so17563172itk.3 for ; Wed, 31 Oct 2018 08:40:06 -0700 (PDT) Received: from NAM04-BN3-obe.outbound.protection.outlook.com (mail-eopbgr680107.outbound.protection.outlook.com. [40.107.68.107]) by mx.google.com with ESMTPS id l1-v6si2729272iom.161.2018.10.31.08.40.04 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 31 Oct 2018 08:40:04 -0700 (PDT) From: Pasha Tatashin Subject: Re: [mm PATCH v4 3/6] mm: Use memblock/zone specific iterator for handling deferred page init Date: Wed, 31 Oct 2018 15:40:02 +0000 Message-ID: <5b937f29-a6e1-6622-b035-246229021d3e@microsoft.com> References: <20181017235043.17213.92459.stgit@localhost.localdomain> <20181017235419.17213.68425.stgit@localhost.localdomain> In-Reply-To: <20181017235419.17213.68425.stgit@localhost.localdomain> Content-Language: en-US Content-Type: text/plain; charset="utf-8" Content-ID: <0CBB0709521B0046948BA091DCB31062@namprd21.prod.outlook.com> Content-Transfer-Encoding: base64 MIME-Version: 1.0 Sender: owner-linux-mm@kvack.org List-ID: To: Alexander Duyck , "linux-mm@kvack.org" , "akpm@linux-foundation.org" Cc: Pasha Tatashin , "mhocko@suse.com" , "dave.jiang@intel.com" , "linux-kernel@vger.kernel.org" , "willy@infradead.org" , "davem@davemloft.net" , "yi.z.zhang@linux.intel.com" , "khalid.aziz@oracle.com" , "rppt@linux.vnet.ibm.com" , "vbabka@suse.cz" , "sparclinux@vger.kernel.org" , "dan.j.williams@intel.com" , "ldufour@linux.vnet.ibm.com" , "mgorman@techsingularity.net" , "mingo@kernel.org" , "kirill.shutemov@linux.intel.com" DQoNCk9uIDEwLzE3LzE4IDc6NTQgUE0sIEFsZXhhbmRlciBEdXljayB3cm90ZToNCj4gVGhpcyBw YXRjaCBpbnRyb2R1Y2VzIGEgbmV3IGl0ZXJhdG9yIGZvcl9lYWNoX2ZyZWVfbWVtX3Bmbl9yYW5n ZV9pbl96b25lLg0KPiANCj4gVGhpcyBpdGVyYXRvciB3aWxsIHRha2UgY2FyZSBvZiBtYWtpbmcg c3VyZSBhIGdpdmVuIG1lbW9yeSByYW5nZSBwcm92aWRlZA0KPiBpcyBpbiBmYWN0IGNvbnRhaW5l ZCB3aXRoaW4gYSB6b25lLiBJdCB0YWtlcyBhcmUgb2YgYWxsIHRoZSBib3VuZHMgY2hlY2tpbmcN Cj4gd2Ugd2VyZSBkb2luZyBpbiBkZWZlcnJlZF9ncm93X3pvbmUsIGFuZCBkZWZlcnJlZF9pbml0 X21lbW1hcC4gSW4gYWRkaXRpb24NCj4gaXQgc2hvdWxkIGhlbHAgdG8gc3BlZWQgdXAgdGhlIHNl YXJjaCBhIGJpdCBieSBpdGVyYXRpbmcgdW50aWwgdGhlIGVuZCBvZiBhDQo+IHJhbmdlIGlzIGdy ZWF0ZXIgdGhhbiB0aGUgc3RhcnQgb2YgdGhlIHpvbmUgcGZuIHJhbmdlLCBhbmQgd2lsbCBleGl0 DQo+IGNvbXBsZXRlbHkgaWYgdGhlIHN0YXJ0IGlzIGJleW9uZCB0aGUgZW5kIG9mIHRoZSB6b25l Lg0KPiANCj4gVGhpcyBwYXRjaCBhZGRzIHlldCBhbm90aGVyIGl0ZXJhdG9yIGNhbGxlZA0KPiBm b3JfZWFjaF9mcmVlX21lbV9yYW5nZV9pbl96b25lX2Zyb20gYW5kIHRoZW4gdXNlcyBpdCB0byBz dXBwb3J0DQo+IGluaXRpYWxpemluZyBhbmQgZnJlZWluZyBwYWdlcyBpbiBncm91cHMgbm8gbGFy Z2VyIHRoYW4gTUFYX09SREVSX05SX1BBR0VTLg0KPiBCeSBkb2luZyB0aGlzIHdlIGNhbiBncmVh dGx5IGltcHJvdmUgdGhlIGNhY2hlIGxvY2FsaXR5IG9mIHRoZSBwYWdlcyB3aGlsZQ0KPiB3ZSBk byBzZXZlcmFsIGxvb3BzIG92ZXIgdGhlbSBpbiB0aGUgaW5pdCBhbmQgZnJlZWluZyBwcm9jZXNz Lg0KPiANCj4gV2UgYXJlIGFibGUgdG8gdGlnaHRlbiB0aGUgbG9vcHMgYXMgYSByZXN1bHQgc2lu Y2Ugd2Ugb25seSByZWFsbHkgbmVlZCB0aGUNCj4gY2hlY2tzIGZvciBmaXJzdF9pbml0X3BmbiBp biBvdXIgZmlyc3QgaXRlcmF0aW9uIGFuZCBhZnRlciB0aGF0IHdlIGNhbg0KPiBhc3N1bWUgdGhh dCBhbGwgZnV0dXJlIHZhbHVlcyB3aWxsIGJlIGdyZWF0ZXIgdGhhbiB0aGlzLiBTbyBJIGhhdmUg YWRkZWQgYQ0KPiBmdW5jdGlvbiBjYWxsZWQgZGVmZXJyZWRfaW5pdF9tZW1fcGZuX3JhbmdlX2lu X3pvbmUgdGhhdCBwcmltZXMgdGhlDQo+IGl0ZXJhdG9ycyBhbmQgaWYgaXQgZmFpbHMgd2UgY2Fu IGp1c3QgZXhpdC4NCj4gDQo+IE9uIG15IHg4Nl82NCB0ZXN0IHN5c3RlbSB3aXRoIDM4NEdCIG9m IG1lbW9yeSBwZXIgbm9kZSBJIHNhdyBhIHJlZHVjdGlvbiBpbg0KPiBpbml0aWFsaXphdGlvbiB0 aW1lIGZyb20gMS44NXMgdG8gMS4zOHMgYXMgYSByZXN1bHQgb2YgdGhpcyBwYXRjaC4NCj4gDQo+ IFNpZ25lZC1vZmYtYnk6IEFsZXhhbmRlciBEdXljayA8YWxleGFuZGVyLmguZHV5Y2tAbGludXgu aW50ZWwuY29tPg0KDQpIaSBBbGV4LA0KDQpDb3VsZCB5b3UgcGxlYXNlIHNwbGl0IHRoaXMgcGF0 Y2ggaW50byB0d28gcGFydHM6DQoNCjEuIEFkZCBkZWZlcnJlZF9pbml0X21heG9yZGVyKCkNCjIu IEFkZCBtZW1ibG9jayBpdGVyYXRvcj8NCg0KVGhpcyB3b3VsZCBhbGxvdyBhIGJldHRlciBiaXNl Y3RpbmcgaW4gY2FzZSBvZiBwcm9ibGVtcy4gQ2hhbmluZyB0d28NCmxvb3BzIGludG8gZGVmZXJy ZWRfaW5pdF9tYXhvcmRlcigpIHdoaWxlIGEgZ29vZCBpZGVhLCBpcyBzdGlsbA0Kbm9uLXRyaXZp YWwgYW5kIG1pZ2h0IGxlYWQgdG8gYnVncy4NCg0KVGhhbmsgeW91LA0KUGF2ZWwNCg0KPiAtLS0N Cj4gIGluY2x1ZGUvbGludXgvbWVtYmxvY2suaCB8ICAgNTggKysrKysrKysrKysrKysrDQo+ICBt bS9tZW1ibG9jay5jICAgICAgICAgICAgfCAgIDYzICsrKysrKysrKysrKysrKysNCj4gIG1tL3Bh Z2VfYWxsb2MuYyAgICAgICAgICB8ICAxNzYgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KystLS0tLS0tLS0tLS0tLQ0KPiAgMyBmaWxlcyBjaGFuZ2VkLCAyNDIgaW5zZXJ0aW9ucygrKSwg NTUgZGVsZXRpb25zKC0pDQo+IA0KPiBkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZW1ibG9j ay5oIGIvaW5jbHVkZS9saW51eC9tZW1ibG9jay5oDQo+IGluZGV4IGFlZTI5OWE2YWE3Ni4uMmRk ZDFiYWZkZDAzIDEwMDY0NA0KPiAtLS0gYS9pbmNsdWRlL2xpbnV4L21lbWJsb2NrLmgNCj4gKysr IGIvaW5jbHVkZS9saW51eC9tZW1ibG9jay5oDQo+IEBAIC0xNzgsNiArMTc4LDI1IEBAIHZvaWQg X19uZXh0X3Jlc2VydmVkX21lbV9yZWdpb24odTY0ICppZHgsIHBoeXNfYWRkcl90ICpvdXRfc3Rh cnQsDQo+ICAJCQkgICAgICBwX3N0YXJ0LCBwX2VuZCwgcF9uaWQpKQ0KPiAgDQo+ICAvKioNCj4g KyAqIGZvcl9lYWNoX21lbV9yYW5nZV9mcm9tIC0gaXRlcmF0ZSB0aHJvdWdoIG1lbWJsb2NrIGFy ZWFzIGZyb20gdHlwZV9hIGFuZCBub3QNCj4gKyAqIGluY2x1ZGVkIGluIHR5cGVfYi4gT3IganVz dCB0eXBlX2EgaWYgdHlwZV9iIGlzIE5VTEwuDQo+ICsgKiBAaTogdTY0IHVzZWQgYXMgbG9vcCB2 YXJpYWJsZQ0KPiArICogQHR5cGVfYTogcHRyIHRvIG1lbWJsb2NrX3R5cGUgdG8gaXRlcmF0ZQ0K PiArICogQHR5cGVfYjogcHRyIHRvIG1lbWJsb2NrX3R5cGUgd2hpY2ggZXhjbHVkZXMgZnJvbSB0 aGUgaXRlcmF0aW9uDQo+ICsgKiBAbmlkOiBub2RlIHNlbGVjdG9yLCAlTlVNQV9OT19OT0RFIGZv ciBhbGwgbm9kZXMNCj4gKyAqIEBmbGFnczogcGljayBmcm9tIGJsb2NrcyBiYXNlZCBvbiBtZW1v cnkgYXR0cmlidXRlcw0KPiArICogQHBfc3RhcnQ6IHB0ciB0byBwaHlzX2FkZHJfdCBmb3Igc3Rh cnQgYWRkcmVzcyBvZiB0aGUgcmFuZ2UsIGNhbiBiZSAlTlVMTA0KPiArICogQHBfZW5kOiBwdHIg dG8gcGh5c19hZGRyX3QgZm9yIGVuZCBhZGRyZXNzIG9mIHRoZSByYW5nZSwgY2FuIGJlICVOVUxM DQo+ICsgKiBAcF9uaWQ6IHB0ciB0byBpbnQgZm9yIG5pZCBvZiB0aGUgcmFuZ2UsIGNhbiBiZSAl TlVMTA0KPiArICovDQo+ICsjZGVmaW5lIGZvcl9lYWNoX21lbV9yYW5nZV9mcm9tKGksIHR5cGVf YSwgdHlwZV9iLCBuaWQsIGZsYWdzLAkJXA0KPiArCQkJICAgcF9zdGFydCwgcF9lbmQsIHBfbmlk KQkJCVwNCj4gKwlmb3IgKGkgPSAwLCBfX25leHRfbWVtX3JhbmdlKCZpLCBuaWQsIGZsYWdzLCB0 eXBlX2EsIHR5cGVfYiwJXA0KPiArCQkJCSAgICAgcF9zdGFydCwgcF9lbmQsIHBfbmlkKTsJCVwN Cj4gKwkgICAgIGkgIT0gKHU2NClVTExPTkdfTUFYOwkJCQkJXA0KPiArCSAgICAgX19uZXh0X21l bV9yYW5nZSgmaSwgbmlkLCBmbGFncywgdHlwZV9hLCB0eXBlX2IsCQlcDQo+ICsJCQkgICAgICBw X3N0YXJ0LCBwX2VuZCwgcF9uaWQpKQ0KPiArLyoqDQo+ICAgKiBmb3JfZWFjaF9tZW1fcmFuZ2Vf cmV2IC0gcmV2ZXJzZSBpdGVyYXRlIHRocm91Z2ggbWVtYmxvY2sgYXJlYXMgZnJvbQ0KPiAgICog dHlwZV9hIGFuZCBub3QgaW5jbHVkZWQgaW4gdHlwZV9iLiBPciBqdXN0IHR5cGVfYSBpZiB0eXBl X2IgaXMgTlVMTC4NCj4gICAqIEBpOiB1NjQgdXNlZCBhcyBsb29wIHZhcmlhYmxlDQo+IEBAIC0y NDgsNiArMjY3LDQ1IEBAIHZvaWQgX19uZXh0X21lbV9wZm5fcmFuZ2UoaW50ICppZHgsIGludCBu aWQsIHVuc2lnbmVkIGxvbmcgKm91dF9zdGFydF9wZm4sDQo+ICAJICAgICBpID49IDA7IF9fbmV4 dF9tZW1fcGZuX3JhbmdlKCZpLCBuaWQsIHBfc3RhcnQsIHBfZW5kLCBwX25pZCkpDQo+ICAjZW5k aWYgLyogQ09ORklHX0hBVkVfTUVNQkxPQ0tfTk9ERV9NQVAgKi8NCj4gIA0KPiArI2lmZGVmIENP TkZJR19ERUZFUlJFRF9TVFJVQ1RfUEFHRV9JTklUDQo+ICt2b2lkIF9fbmV4dF9tZW1fcGZuX3Jh bmdlX2luX3pvbmUodTY0ICppZHgsIHN0cnVjdCB6b25lICp6b25lLA0KPiArCQkJCSAgdW5zaWdu ZWQgbG9uZyAqb3V0X3NwZm4sDQo+ICsJCQkJICB1bnNpZ25lZCBsb25nICpvdXRfZXBmbik7DQo+ ICsvKioNCj4gKyAqIGZvcl9lYWNoX2ZyZWVfbWVtX3JhbmdlX2luX3pvbmUgLSBpdGVyYXRlIHRo cm91Z2ggem9uZSBzcGVjaWZpYyBmcmVlDQo+ICsgKiBtZW1ibG9jayBhcmVhcw0KPiArICogQGk6 IHU2NCB1c2VkIGFzIGxvb3AgdmFyaWFibGUNCj4gKyAqIEB6b25lOiB6b25lIGluIHdoaWNoIGFs bCBvZiB0aGUgbWVtb3J5IGJsb2NrcyByZXNpZGUNCj4gKyAqIEBwX3N0YXJ0OiBwdHIgdG8gcGh5 c19hZGRyX3QgZm9yIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIHJhbmdlLCBjYW4gYmUgJU5VTEwNCj4g KyAqIEBwX2VuZDogcHRyIHRvIHBoeXNfYWRkcl90IGZvciBlbmQgYWRkcmVzcyBvZiB0aGUgcmFu Z2UsIGNhbiBiZSAlTlVMTA0KPiArICoNCj4gKyAqIFdhbGtzIG92ZXIgZnJlZSAobWVtb3J5ICYm ICFyZXNlcnZlZCkgYXJlYXMgb2YgbWVtYmxvY2sgaW4gYSBzcGVjaWZpYw0KPiArICogem9uZS4g QXZhaWxhYmxlIGFzIHNvb24gYXMgbWVtYmxvY2sgaXMgaW5pdGlhbGl6ZWQuDQo+ICsgKi8NCj4g KyNkZWZpbmUgZm9yX2VhY2hfZnJlZV9tZW1fcGZuX3JhbmdlX2luX3pvbmUoaSwgem9uZSwgcF9z dGFydCwgcF9lbmQpCVwNCj4gKwlmb3IgKGkgPSAwLAkJCQkJCQlcDQo+ICsJICAgICBfX25leHRf bWVtX3Bmbl9yYW5nZV9pbl96b25lKCZpLCB6b25lLCBwX3N0YXJ0LCBwX2VuZCk7CVwNCj4gKwkg ICAgIGkgIT0gKHU2NClVTExPTkdfTUFYOwkJCQkJXA0KPiArCSAgICAgX19uZXh0X21lbV9wZm5f cmFuZ2VfaW5fem9uZSgmaSwgem9uZSwgcF9zdGFydCwgcF9lbmQpKQ0KPiArDQo+ICsvKioNCj4g KyAqIGZvcl9lYWNoX2ZyZWVfbWVtX3JhbmdlX2luX3pvbmVfZnJvbSAtIGl0ZXJhdGUgdGhyb3Vn aCB6b25lIHNwZWNpZmljDQo+ICsgKiBmcmVlIG1lbWJsb2NrIGFyZWFzIGZyb20gYSBnaXZlbiBw b2ludA0KPiArICogQGk6IHU2NCB1c2VkIGFzIGxvb3AgdmFyaWFibGUNCj4gKyAqIEB6b25lOiB6 b25lIGluIHdoaWNoIGFsbCBvZiB0aGUgbWVtb3J5IGJsb2NrcyByZXNpZGUNCj4gKyAqIEBwX3N0 YXJ0OiBwdHIgdG8gcGh5c19hZGRyX3QgZm9yIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIHJhbmdlLCBj YW4gYmUgJU5VTEwNCj4gKyAqIEBwX2VuZDogcHRyIHRvIHBoeXNfYWRkcl90IGZvciBlbmQgYWRk cmVzcyBvZiB0aGUgcmFuZ2UsIGNhbiBiZSAlTlVMTA0KPiArICoNCj4gKyAqIFdhbGtzIG92ZXIg ZnJlZSAobWVtb3J5ICYmICFyZXNlcnZlZCkgYXJlYXMgb2YgbWVtYmxvY2sgaW4gYSBzcGVjaWZp Yw0KPiArICogem9uZSwgY29udGludWluZyBmcm9tIGN1cnJlbnQgcG9zaXRpb24uIEF2YWlsYWJs ZSBhcyBzb29uIGFzIG1lbWJsb2NrIGlzDQo+ICsgKiBpbml0aWFsaXplZC4NCj4gKyAqLw0KPiAr I2RlZmluZSBmb3JfZWFjaF9mcmVlX21lbV9wZm5fcmFuZ2VfaW5fem9uZV9mcm9tKGksIHpvbmUs IHBfc3RhcnQsIHBfZW5kKSBcDQo+ICsJZm9yICg7IGkgIT0gKHU2NClVTExPTkdfTUFYOwkJCQkJ ICBcDQo+ICsJICAgICBfX25leHRfbWVtX3Bmbl9yYW5nZV9pbl96b25lKCZpLCB6b25lLCBwX3N0 YXJ0LCBwX2VuZCkpDQo+ICsNCj4gKyNlbmRpZiAvKiBDT05GSUdfREVGRVJSRURfU1RSVUNUX1BB R0VfSU5JVCAqLw0KPiArDQo+ICAvKioNCj4gICAqIGZvcl9lYWNoX2ZyZWVfbWVtX3JhbmdlIC0g aXRlcmF0ZSB0aHJvdWdoIGZyZWUgbWVtYmxvY2sgYXJlYXMNCj4gICAqIEBpOiB1NjQgdXNlZCBh cyBsb29wIHZhcmlhYmxlDQo+IGRpZmYgLS1naXQgYS9tbS9tZW1ibG9jay5jIGIvbW0vbWVtYmxv Y2suYw0KPiBpbmRleCBmMmVmMzkxNWEzNTYuLmFiMzU0NWUzNTZiNyAxMDA2NDQNCj4gLS0tIGEv bW0vbWVtYmxvY2suYw0KPiArKysgYi9tbS9tZW1ibG9jay5jDQo+IEBAIC0xMjM5LDYgKzEyMzks NjkgQEAgaW50IF9faW5pdF9tZW1ibG9jayBtZW1ibG9ja19zZXRfbm9kZShwaHlzX2FkZHJfdCBi YXNlLCBwaHlzX2FkZHJfdCBzaXplLA0KPiAgCXJldHVybiAwOw0KPiAgfQ0KPiAgI2VuZGlmIC8q IENPTkZJR19IQVZFX01FTUJMT0NLX05PREVfTUFQICovDQo+ICsjaWZkZWYgQ09ORklHX0RFRkVS UkVEX1NUUlVDVF9QQUdFX0lOSVQNCj4gKy8qKg0KPiArICogX19uZXh0X21lbV9wZm5fcmFuZ2Vf aW5fem9uZSAtIGl0ZXJhdG9yIGZvciBmb3JfZWFjaF8qX3JhbmdlX2luX3pvbmUoKQ0KPiArICoN Cj4gKyAqIEBpZHg6IHBvaW50ZXIgdG8gdTY0IGxvb3AgdmFyaWFibGUNCj4gKyAqIEB6b25lOiB6 b25lIGluIHdoaWNoIGFsbCBvZiB0aGUgbWVtb3J5IGJsb2NrcyByZXNpZGUNCj4gKyAqIEBvdXRf c3RhcnQ6IHB0ciB0byB1bG9uZyBmb3Igc3RhcnQgcGZuIG9mIHRoZSByYW5nZSwgY2FuIGJlICVO VUxMDQo+ICsgKiBAb3V0X2VuZDogcHRyIHRvIHVsb25nIGZvciBlbmQgcGZuIG9mIHRoZSByYW5n ZSwgY2FuIGJlICVOVUxMDQo+ICsgKg0KPiArICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBi ZSBhIHpvbmUvcGZuIHNwZWNpZmljIHdyYXBwZXIgZm9yIHRoZQ0KPiArICogZm9yX2VhY2hfbWVt X3JhbmdlIHR5cGUgaXRlcmF0b3JzLiBTcGVjaWZpY2FsbHkgdGhleSBhcmUgdXNlZCBpbiB0aGUN Cj4gKyAqIGRlZmVycmVkIG1lbW9yeSBpbml0IHJvdXRpbmVzIGFuZCBhcyBzdWNoIHdlIHdlcmUg ZHVwbGljYXRpbmcgbXVjaCBvZg0KPiArICogdGhpcyBsb2dpYyB0aHJvdWdob3V0IHRoZSBjb2Rl LiBTbyBpbnN0ZWFkIG9mIGhhdmluZyBpdCBpbiBtdWx0aXBsZQ0KPiArICogbG9jYXRpb25zIGl0 IHNlZW1lZCBsaWtlIGl0IHdvdWxkIG1ha2UgbW9yZSBzZW5zZSB0byBjZW50cmFsaXplIHRoaXMg dG8NCj4gKyAqIG9uZSBuZXcgaXRlcmF0b3IgdGhhdCBkb2VzIGV2ZXJ5dGhpbmcgdGhleSBuZWVk Lg0KPiArICovDQo+ICt2b2lkIF9faW5pdF9tZW1ibG9jaw0KPiArX19uZXh0X21lbV9wZm5fcmFu Z2VfaW5fem9uZSh1NjQgKmlkeCwgc3RydWN0IHpvbmUgKnpvbmUsDQo+ICsJCQkgICAgIHVuc2ln bmVkIGxvbmcgKm91dF9zcGZuLCB1bnNpZ25lZCBsb25nICpvdXRfZXBmbikNCj4gK3sNCj4gKwlp bnQgem9uZV9uaWQgPSB6b25lX3RvX25pZCh6b25lKTsNCj4gKwlwaHlzX2FkZHJfdCBzcGEsIGVw YTsNCj4gKwlpbnQgbmlkOw0KPiArDQo+ICsJX19uZXh0X21lbV9yYW5nZShpZHgsIHpvbmVfbmlk LCBNRU1CTE9DS19OT05FLA0KPiArCQkJICZtZW1ibG9jay5tZW1vcnksICZtZW1ibG9jay5yZXNl cnZlZCwNCj4gKwkJCSAmc3BhLCAmZXBhLCAmbmlkKTsNCj4gKw0KPiArCXdoaWxlICgqaWR4ICE9 IFVMTE9OR19NQVgpIHsNCj4gKwkJdW5zaWduZWQgbG9uZyBlcGZuID0gUEZOX0RPV04oZXBhKTsN Cj4gKwkJdW5zaWduZWQgbG9uZyBzcGZuID0gUEZOX1VQKHNwYSk7DQo+ICsNCj4gKwkJLyoNCj4g KwkJICogVmVyaWZ5IHRoZSBlbmQgaXMgYXQgbGVhc3QgcGFzdCB0aGUgc3RhcnQgb2YgdGhlIHpv bmUgYW5kDQo+ICsJCSAqIHRoYXQgd2UgaGF2ZSBhdCBsZWFzdCBvbmUgUEZOIHRvIGluaXRpYWxp emUuDQo+ICsJCSAqLw0KPiArCQlpZiAoem9uZS0+em9uZV9zdGFydF9wZm4gPCBlcGZuICYmIHNw Zm4gPCBlcGZuKSB7DQo+ICsJCQkvKiBpZiB3ZSB3ZW50IHRvbyBmYXIganVzdCBzdG9wIHNlYXJj aGluZyAqLw0KPiArCQkJaWYgKHpvbmVfZW5kX3Bmbih6b25lKSA8PSBzcGZuKQ0KPiArCQkJCWJy ZWFrOw0KPiArDQo+ICsJCQlpZiAob3V0X3NwZm4pDQo+ICsJCQkJKm91dF9zcGZuID0gbWF4KHpv bmUtPnpvbmVfc3RhcnRfcGZuLCBzcGZuKTsNCj4gKwkJCWlmIChvdXRfZXBmbikNCj4gKwkJCQkq b3V0X2VwZm4gPSBtaW4oem9uZV9lbmRfcGZuKHpvbmUpLCBlcGZuKTsNCj4gKw0KPiArCQkJcmV0 dXJuOw0KPiArCQl9DQo+ICsNCj4gKwkJX19uZXh0X21lbV9yYW5nZShpZHgsIHpvbmVfbmlkLCBN RU1CTE9DS19OT05FLA0KPiArCQkJCSAmbWVtYmxvY2subWVtb3J5LCAmbWVtYmxvY2sucmVzZXJ2 ZWQsDQo+ICsJCQkJICZzcGEsICZlcGEsICZuaWQpOw0KPiArCX0NCj4gKw0KPiArCS8qIHNpZ25h bCBlbmQgb2YgaXRlcmF0aW9uICovDQo+ICsJKmlkeCA9IFVMTE9OR19NQVg7DQo+ICsJaWYgKG91 dF9zcGZuKQ0KPiArCQkqb3V0X3NwZm4gPSBVTE9OR19NQVg7DQo+ICsJaWYgKG91dF9lcGZuKQ0K PiArCQkqb3V0X2VwZm4gPSAwOw0KPiArfQ0KPiArDQo+ICsjZW5kaWYgLyogQ09ORklHX0RFRkVS UkVEX1NUUlVDVF9QQUdFX0lOSVQgKi8NCj4gIA0KPiAgI2lmZGVmIENPTkZJR19IQVZFX01FTUJM T0NLX1BGTl9WQUxJRA0KPiAgdW5zaWduZWQgbG9uZyBfX2luaXRfbWVtYmxvY2sgbWVtYmxvY2tf bmV4dF92YWxpZF9wZm4odW5zaWduZWQgbG9uZyBwZm4pDQo+IGRpZmYgLS1naXQgYS9tbS9wYWdl X2FsbG9jLmMgYi9tbS9wYWdlX2FsbG9jLmMNCj4gaW5kZXggYTc2NmExNWZhZDgxLi4yMGU5ZWIz NWQ3NWQgMTAwNjQ0DQo+IC0tLSBhL21tL3BhZ2VfYWxsb2MuYw0KPiArKysgYi9tbS9wYWdlX2Fs bG9jLmMNCj4gQEAgLTE1MTIsMTkgKzE1MTIsMTAzIEBAIHN0YXRpYyB1bnNpZ25lZCBsb25nICBf X2luaXQgZGVmZXJyZWRfaW5pdF9wYWdlcyhzdHJ1Y3Qgem9uZSAqem9uZSwNCj4gIAlyZXR1cm4g KG5yX3BhZ2VzKTsNCj4gIH0NCj4gIA0KPiArLyoNCj4gKyAqIFRoaXMgZnVuY3Rpb24gaXMgbWVh bnQgdG8gcHJlLWxvYWQgdGhlIGl0ZXJhdG9yIGZvciB0aGUgem9uZSBpbml0Lg0KPiArICogU3Bl Y2lmaWNhbGx5IGl0IHdhbGtzIHRocm91Z2ggdGhlIHJhbmdlcyB1bnRpbCB3ZSBhcmUgY2F1Z2h0 IHVwIHRvIHRoZQ0KPiArICogZmlyc3RfaW5pdF9wZm4gdmFsdWUgYW5kIGV4aXRzIHRoZXJlLiBJ ZiB3ZSBuZXZlciBlbmNvdW50ZXIgdGhlIHZhbHVlIHdlDQo+ICsgKiByZXR1cm4gZmFsc2UgaW5k aWNhdGluZyB0aGVyZSBhcmUgbm8gdmFsaWQgcmFuZ2VzIGxlZnQuDQo+ICsgKi8NCj4gK3N0YXRp YyBib29sIF9faW5pdA0KPiArZGVmZXJyZWRfaW5pdF9tZW1fcGZuX3JhbmdlX2luX3pvbmUodTY0 ICppLCBzdHJ1Y3Qgem9uZSAqem9uZSwNCj4gKwkJCQkgICAgdW5zaWduZWQgbG9uZyAqc3Bmbiwg dW5zaWduZWQgbG9uZyAqZXBmbiwNCj4gKwkJCQkgICAgdW5zaWduZWQgbG9uZyBmaXJzdF9pbml0 X3BmbikNCj4gK3sNCj4gKwl1NjQgajsNCj4gKw0KPiArCS8qDQo+ICsJICogU3RhcnQgb3V0IGJ5 IHdhbGtpbmcgdGhyb3VnaCB0aGUgcmFuZ2VzIGluIHRoaXMgem9uZSB0aGF0IGhhdmUNCj4gKwkg KiBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuIFdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcg d2l0aCB0aGVtDQo+ICsJICogc28gd2UganVzdCBuZWVkIHRvIGZsdXNoIHRoZW0gb3V0IG9mIHRo ZSBzeXN0ZW0uDQo+ICsJICovDQo+ICsJZm9yX2VhY2hfZnJlZV9tZW1fcGZuX3JhbmdlX2luX3pv bmUoaiwgem9uZSwgc3BmbiwgZXBmbikgew0KPiArCQlpZiAoKmVwZm4gPD0gZmlyc3RfaW5pdF9w Zm4pDQo+ICsJCQljb250aW51ZTsNCj4gKwkJaWYgKCpzcGZuIDwgZmlyc3RfaW5pdF9wZm4pDQo+ ICsJCQkqc3BmbiA9IGZpcnN0X2luaXRfcGZuOw0KPiArCQkqaSA9IGo7DQo+ICsJCXJldHVybiB0 cnVlOw0KPiArCX0NCj4gKw0KPiArCXJldHVybiBmYWxzZTsNCj4gK30NCj4gKw0KPiArLyoNCj4g KyAqIEluaXRpYWxpemUgYW5kIGZyZWUgcGFnZXMuIFdlIGRvIGl0IGluIHR3byBsb29wczogZmly c3Qgd2UgaW5pdGlhbGl6ZQ0KPiArICogc3RydWN0IHBhZ2UsIHRoYW4gZnJlZSB0byBidWRkeSBh bGxvY2F0b3IsIGJlY2F1c2Ugd2hpbGUgd2UgYXJlDQo+ICsgKiBmcmVlaW5nIHBhZ2VzIHdlIGNh biBhY2Nlc3MgcGFnZXMgdGhhdCBhcmUgYWhlYWQgKGNvbXB1dGluZyBidWRkeQ0KPiArICogcGFn ZSBpbiBfX2ZyZWVfb25lX3BhZ2UoKSkuDQo+ICsgKg0KPiArICogSW4gb3JkZXIgdG8gdHJ5IGFu ZCBrZWVwIHNvbWUgbWVtb3J5IGluIHRoZSBjYWNoZSB3ZSBoYXZlIHRoZSBsb29wDQo+ICsgKiBi cm9rZW4gYWxvbmcgbWF4IHBhZ2Ugb3JkZXIgYm91bmRhcmllcy4gVGhpcyB3YXkgd2Ugd2lsbCBu b3QgY2F1c2UNCj4gKyAqIGFueSBpc3N1ZXMgd2l0aCB0aGUgYnVkZHkgcGFnZSBjb21wdXRhdGlv bi4NCj4gKyAqLw0KPiArc3RhdGljIHVuc2lnbmVkIGxvbmcgX19pbml0DQo+ICtkZWZlcnJlZF9p bml0X21heG9yZGVyKHU2NCAqaSwgc3RydWN0IHpvbmUgKnpvbmUsIHVuc2lnbmVkIGxvbmcgKnN0 YXJ0X3BmbiwNCj4gKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgKmVuZF9wZm4pDQo+ICt7DQo+ICsJ dW5zaWduZWQgbG9uZyBtb19wZm4gPSBBTElHTigqc3RhcnRfcGZuICsgMSwgTUFYX09SREVSX05S X1BBR0VTKTsNCj4gKwl1bnNpZ25lZCBsb25nIHNwZm4gPSAqc3RhcnRfcGZuLCBlcGZuID0gKmVu ZF9wZm47DQo+ICsJdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IDA7DQo+ICsJdTY0IGogPSAqaTsN Cj4gKw0KPiArCS8qIEZpcnN0IHdlIGxvb3AgdGhyb3VnaCBhbmQgaW5pdGlhbGl6ZSB0aGUgcGFn ZSB2YWx1ZXMgKi8NCj4gKwlmb3JfZWFjaF9mcmVlX21lbV9wZm5fcmFuZ2VfaW5fem9uZV9mcm9t KGosIHpvbmUsICZzcGZuLCAmZXBmbikgew0KPiArCQl1bnNpZ25lZCBsb25nIHQ7DQo+ICsNCj4g KwkJaWYgKG1vX3BmbiA8PSBzcGZuKQ0KPiArCQkJYnJlYWs7DQo+ICsNCj4gKwkJdCA9IG1pbiht b19wZm4sIGVwZm4pOw0KPiArCQlucl9wYWdlcyArPSBkZWZlcnJlZF9pbml0X3BhZ2VzKHpvbmUs IHNwZm4sIHQpOw0KPiArDQo+ICsJCWlmIChtb19wZm4gPD0gZXBmbikNCj4gKwkJCWJyZWFrOw0K PiArCX0NCj4gKw0KPiArCS8qIFJlc2V0IHZhbHVlcyBhbmQgbm93IGxvb3AgdGhyb3VnaCBmcmVl aW5nIHBhZ2VzIGFzIG5lZWRlZCAqLw0KPiArCWogPSAqaTsNCj4gKw0KPiArCWZvcl9lYWNoX2Zy ZWVfbWVtX3Bmbl9yYW5nZV9pbl96b25lX2Zyb20oaiwgem9uZSwgc3RhcnRfcGZuLCBlbmRfcGZu KSB7DQo+ICsJCXVuc2lnbmVkIGxvbmcgdDsNCj4gKw0KPiArCQlpZiAobW9fcGZuIDw9ICpzdGFy dF9wZm4pDQo+ICsJCQlicmVhazsNCj4gKw0KPiArCQl0ID0gbWluKG1vX3BmbiwgKmVuZF9wZm4p Ow0KPiArCQlkZWZlcnJlZF9mcmVlX3BhZ2VzKCpzdGFydF9wZm4sIHQpOw0KPiArCQkqc3RhcnRf cGZuID0gdDsNCj4gKw0KPiArCQlpZiAobW9fcGZuIDwgKmVuZF9wZm4pDQo+ICsJCQlicmVhazsN Cj4gKwl9DQo+ICsNCj4gKwkvKiBTdG9yZSBvdXIgY3VycmVudCB2YWx1ZXMgdG8gYmUgcmV1c2Vk IG9uIHRoZSBuZXh0IGl0ZXJhdGlvbiAqLw0KPiArCSppID0gajsNCj4gKw0KPiArCXJldHVybiBu cl9wYWdlczsNCj4gK30NCj4gKw0KPiAgLyogSW5pdGlhbGlzZSByZW1haW5pbmcgbWVtb3J5IG9u IGEgbm9kZSAqLw0KPiAgc3RhdGljIGludCBfX2luaXQgZGVmZXJyZWRfaW5pdF9tZW1tYXAodm9p ZCAqZGF0YSkNCj4gIHsNCj4gIAlwZ19kYXRhX3QgKnBnZGF0ID0gZGF0YTsNCj4gLQlpbnQgbmlk ID0gcGdkYXQtPm5vZGVfaWQ7DQo+ICsJY29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdW1hc2sgPSBj cHVtYXNrX29mX25vZGUocGdkYXQtPm5vZGVfaWQpOw0KPiArCXVuc2lnbmVkIGxvbmcgc3BmbiA9 IDAsIGVwZm4gPSAwLCBucl9wYWdlcyA9IDA7DQo+ICsJdW5zaWduZWQgbG9uZyBmaXJzdF9pbml0 X3BmbiwgZmxhZ3M7DQo+ICAJdW5zaWduZWQgbG9uZyBzdGFydCA9IGppZmZpZXM7DQo+IC0JdW5z aWduZWQgbG9uZyBucl9wYWdlcyA9IDA7DQo+IC0JdW5zaWduZWQgbG9uZyBzcGZuLCBlcGZuLCBm aXJzdF9pbml0X3BmbiwgZmxhZ3M7DQo+IC0JcGh5c19hZGRyX3Qgc3BhLCBlcGE7DQo+IC0JaW50 IHppZDsNCj4gIAlzdHJ1Y3Qgem9uZSAqem9uZTsNCj4gLQljb25zdCBzdHJ1Y3QgY3B1bWFzayAq Y3B1bWFzayA9IGNwdW1hc2tfb2Zfbm9kZShwZ2RhdC0+bm9kZV9pZCk7DQo+ICAJdTY0IGk7DQo+ ICsJaW50IHppZDsNCj4gIA0KPiAgCS8qIEJpbmQgbWVtb3J5IGluaXRpYWxpc2F0aW9uIHRocmVh ZCB0byBhIGxvY2FsIG5vZGUgaWYgcG9zc2libGUgKi8NCj4gIAlpZiAoIWNwdW1hc2tfZW1wdHko Y3B1bWFzaykpDQo+IEBAIC0xNTQ5LDMxICsxNjMzLDMwIEBAIHN0YXRpYyBpbnQgX19pbml0IGRl ZmVycmVkX2luaXRfbWVtbWFwKHZvaWQgKmRhdGEpDQo+ICAJCWlmIChmaXJzdF9pbml0X3BmbiA8 IHpvbmVfZW5kX3Bmbih6b25lKSkNCj4gIAkJCWJyZWFrOw0KPiAgCX0NCj4gLQlmaXJzdF9pbml0 X3BmbiA9IG1heCh6b25lLT56b25lX3N0YXJ0X3BmbiwgZmlyc3RfaW5pdF9wZm4pOw0KPiArDQo+ ICsJLyogSWYgdGhlIHpvbmUgaXMgZW1wdHkgc29tZWJvZHkgZWxzZSBtYXkgaGF2ZSBjbGVhcmVk IG91dCB0aGUgem9uZSAqLw0KPiArCWlmICghZGVmZXJyZWRfaW5pdF9tZW1fcGZuX3JhbmdlX2lu X3pvbmUoJmksIHpvbmUsICZzcGZuLCAmZXBmbiwNCj4gKwkJCQkJCSBmaXJzdF9pbml0X3Bmbikp IHsNCj4gKwkJcGdkYXRfcmVzaXplX3VubG9jayhwZ2RhdCwgJmZsYWdzKTsNCj4gKwkJcGdkYXRf aW5pdF9yZXBvcnRfb25lX2RvbmUoKTsNCj4gKwkJcmV0dXJuIDA7DQo+ICsJfQ0KPiAgDQo+ICAJ LyoNCj4gLQkgKiBJbml0aWFsaXplIGFuZCBmcmVlIHBhZ2VzLiBXZSBkbyBpdCBpbiB0d28gbG9v cHM6IGZpcnN0IHdlIGluaXRpYWxpemUNCj4gLQkgKiBzdHJ1Y3QgcGFnZSwgdGhhbiBmcmVlIHRv IGJ1ZGR5IGFsbG9jYXRvciwgYmVjYXVzZSB3aGlsZSB3ZSBhcmUNCj4gLQkgKiBmcmVlaW5nIHBh Z2VzIHdlIGNhbiBhY2Nlc3MgcGFnZXMgdGhhdCBhcmUgYWhlYWQgKGNvbXB1dGluZyBidWRkeQ0K PiAtCSAqIHBhZ2UgaW4gX19mcmVlX29uZV9wYWdlKCkpLg0KPiArCSAqIEluaXRpYWxpemUgYW5k IGZyZWUgcGFnZXMgaW4gTUFYX09SREVSIHNpemVkIGluY3JlbWVudHMgc28NCj4gKwkgKiB0aGF0 IHdlIGNhbiBhdm9pZCBpbnRyb2R1Y2luZyBhbnkgaXNzdWVzIHdpdGggdGhlIGJ1ZGR5DQo+ICsJ ICogYWxsb2NhdG9yLg0KPiAgCSAqLw0KPiAtCWZvcl9lYWNoX2ZyZWVfbWVtX3JhbmdlKGksIG5p ZCwgTUVNQkxPQ0tfTk9ORSwgJnNwYSwgJmVwYSwgTlVMTCkgew0KPiAtCQlzcGZuID0gbWF4X3Qo dW5zaWduZWQgbG9uZywgZmlyc3RfaW5pdF9wZm4sIFBGTl9VUChzcGEpKTsNCj4gLQkJZXBmbiA9 IG1pbl90KHVuc2lnbmVkIGxvbmcsIHpvbmVfZW5kX3Bmbih6b25lKSwgUEZOX0RPV04oZXBhKSk7 DQo+IC0JCW5yX3BhZ2VzICs9IGRlZmVycmVkX2luaXRfcGFnZXMoem9uZSwgc3BmbiwgZXBmbik7 DQo+IC0JfQ0KPiAtCWZvcl9lYWNoX2ZyZWVfbWVtX3JhbmdlKGksIG5pZCwgTUVNQkxPQ0tfTk9O RSwgJnNwYSwgJmVwYSwgTlVMTCkgew0KPiAtCQlzcGZuID0gbWF4X3QodW5zaWduZWQgbG9uZywg Zmlyc3RfaW5pdF9wZm4sIFBGTl9VUChzcGEpKTsNCj4gLQkJZXBmbiA9IG1pbl90KHVuc2lnbmVk IGxvbmcsIHpvbmVfZW5kX3Bmbih6b25lKSwgUEZOX0RPV04oZXBhKSk7DQo+IC0JCWRlZmVycmVk X2ZyZWVfcGFnZXMoc3BmbiwgZXBmbik7DQo+IC0JfQ0KPiArCXdoaWxlIChzcGZuIDwgZXBmbikN Cj4gKwkJbnJfcGFnZXMgKz0gZGVmZXJyZWRfaW5pdF9tYXhvcmRlcigmaSwgem9uZSwgJnNwZm4s ICZlcGZuKTsNCj4gKw0KPiAgCXBnZGF0X3Jlc2l6ZV91bmxvY2socGdkYXQsICZmbGFncyk7DQo+ ICANCj4gIAkvKiBTYW5pdHkgY2hlY2sgdGhhdCB0aGUgbmV4dCB6b25lIHJlYWxseSBpcyB1bnBv cHVsYXRlZCAqLw0KPiAgCVdBUk5fT04oKyt6aWQgPCBNQVhfTlJfWk9ORVMgJiYgcG9wdWxhdGVk X3pvbmUoKyt6b25lKSk7DQo+ICANCj4gLQlwcl9pbmZvKCJub2RlICVkIGluaXRpYWxpc2VkLCAl bHUgcGFnZXMgaW4gJXVtc1xuIiwgbmlkLCBucl9wYWdlcywNCj4gLQkJCQkJamlmZmllc190b19t c2VjcyhqaWZmaWVzIC0gc3RhcnQpKTsNCj4gKwlwcl9pbmZvKCJub2RlICVkIGluaXRpYWxpc2Vk LCAlbHUgcGFnZXMgaW4gJXVtc1xuIiwNCj4gKwkJcGdkYXQtPm5vZGVfaWQsCW5yX3BhZ2VzLCBq aWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLSBzdGFydCkpOw0KPiAgDQo+ICAJcGdkYXRfaW5pdF9y ZXBvcnRfb25lX2RvbmUoKTsNCj4gIAlyZXR1cm4gMDsNCj4gQEAgLTE2MDQsMTQgKzE2ODcsMTEg QEAgc3RhdGljIGludCBfX2luaXQgZGVmZXJyZWRfaW5pdF9tZW1tYXAodm9pZCAqZGF0YSkNCj4g IHN0YXRpYyBub2lubGluZSBib29sIF9faW5pdA0KPiAgZGVmZXJyZWRfZ3Jvd196b25lKHN0cnVj dCB6b25lICp6b25lLCB1bnNpZ25lZCBpbnQgb3JkZXIpDQo+ICB7DQo+IC0JaW50IHppZCA9IHpv bmVfaWR4KHpvbmUpOw0KPiAtCWludCBuaWQgPSB6b25lX3RvX25pZCh6b25lKTsNCj4gLQlwZ19k YXRhX3QgKnBnZGF0ID0gTk9ERV9EQVRBKG5pZCk7DQo+ICAJdW5zaWduZWQgbG9uZyBucl9wYWdl c19uZWVkZWQgPSBBTElHTigxIDw8IG9yZGVyLCBQQUdFU19QRVJfU0VDVElPTik7DQo+IC0JdW5z aWduZWQgbG9uZyBucl9wYWdlcyA9IDA7DQo+IC0JdW5zaWduZWQgbG9uZyBmaXJzdF9pbml0X3Bm biwgc3BmbiwgZXBmbiwgdCwgZmxhZ3M7DQo+ICsJcGdfZGF0YV90ICpwZ2RhdCA9IHpvbmUtPnpv bmVfcGdkYXQ7DQo+ICAJdW5zaWduZWQgbG9uZyBmaXJzdF9kZWZlcnJlZF9wZm4gPSBwZ2RhdC0+ Zmlyc3RfZGVmZXJyZWRfcGZuOw0KPiAtCXBoeXNfYWRkcl90IHNwYSwgZXBhOw0KPiArCXVuc2ln bmVkIGxvbmcgc3BmbiwgZXBmbiwgZmxhZ3M7DQo+ICsJdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9 IDA7DQo+ICAJdTY0IGk7DQo+ICANCj4gIAkvKiBPbmx5IHRoZSBsYXN0IHpvbmUgbWF5IGhhdmUg ZGVmZXJyZWQgcGFnZXMgKi8NCj4gQEAgLTE2NDAsMzcgKzE3MjAsMjMgQEAgc3RhdGljIGludCBf X2luaXQgZGVmZXJyZWRfaW5pdF9tZW1tYXAodm9pZCAqZGF0YSkNCj4gIAkJcmV0dXJuIHRydWU7 DQo+ICAJfQ0KPiAgDQo+IC0JZmlyc3RfaW5pdF9wZm4gPSBtYXgoem9uZS0+em9uZV9zdGFydF9w Zm4sIGZpcnN0X2RlZmVycmVkX3Bmbik7DQo+IC0NCj4gLQlpZiAoZmlyc3RfaW5pdF9wZm4gPj0g cGdkYXRfZW5kX3BmbihwZ2RhdCkpIHsNCj4gKwkvKiBJZiB0aGUgem9uZSBpcyBlbXB0eSBzb21l Ym9keSBlbHNlIG1heSBoYXZlIGNsZWFyZWQgb3V0IHRoZSB6b25lICovDQo+ICsJaWYgKCFkZWZl cnJlZF9pbml0X21lbV9wZm5fcmFuZ2VfaW5fem9uZSgmaSwgem9uZSwgJnNwZm4sICZlcGZuLA0K PiArCQkJCQkJIGZpcnN0X2RlZmVycmVkX3BmbikpIHsNCj4gIAkJcGdkYXRfcmVzaXplX3VubG9j ayhwZ2RhdCwgJmZsYWdzKTsNCj4gLQkJcmV0dXJuIGZhbHNlOw0KPiArCQlyZXR1cm4gdHJ1ZTsN Cj4gIAl9DQo+ICANCj4gLQlmb3JfZWFjaF9mcmVlX21lbV9yYW5nZShpLCBuaWQsIE1FTUJMT0NL X05PTkUsICZzcGEsICZlcGEsIE5VTEwpIHsNCj4gLQkJc3BmbiA9IG1heF90KHVuc2lnbmVkIGxv bmcsIGZpcnN0X2luaXRfcGZuLCBQRk5fVVAoc3BhKSk7DQo+IC0JCWVwZm4gPSBtaW5fdCh1bnNp Z25lZCBsb25nLCB6b25lX2VuZF9wZm4oem9uZSksIFBGTl9ET1dOKGVwYSkpOw0KPiAtDQo+IC0J CXdoaWxlIChzcGZuIDwgZXBmbiAmJiBucl9wYWdlcyA8IG5yX3BhZ2VzX25lZWRlZCkgew0KPiAt CQkJdCA9IEFMSUdOKHNwZm4gKyBQQUdFU19QRVJfU0VDVElPTiwgUEFHRVNfUEVSX1NFQ1RJT04p Ow0KPiAtCQkJZmlyc3RfZGVmZXJyZWRfcGZuID0gbWluKHQsIGVwZm4pOw0KPiAtCQkJbnJfcGFn ZXMgKz0gZGVmZXJyZWRfaW5pdF9wYWdlcyh6b25lLCBzcGZuLA0KPiAtCQkJCQkJCWZpcnN0X2Rl ZmVycmVkX3Bmbik7DQo+IC0JCQlzcGZuID0gZmlyc3RfZGVmZXJyZWRfcGZuOw0KPiAtCQl9DQo+ IC0NCj4gLQkJaWYgKG5yX3BhZ2VzID49IG5yX3BhZ2VzX25lZWRlZCkNCj4gLQkJCWJyZWFrOw0K PiArCS8qDQo+ICsJICogSW5pdGlhbGl6ZSBhbmQgZnJlZSBwYWdlcyBpbiBNQVhfT1JERVIgc2l6 ZWQgaW5jcmVtZW50cyBzbw0KPiArCSAqIHRoYXQgd2UgY2FuIGF2b2lkIGludHJvZHVjaW5nIGFu eSBpc3N1ZXMgd2l0aCB0aGUgYnVkZHkNCj4gKwkgKiBhbGxvY2F0b3IuDQo+ICsJICovDQo+ICsJ d2hpbGUgKHNwZm4gPCBlcGZuICYmIG5yX3BhZ2VzIDwgbnJfcGFnZXNfbmVlZGVkKSB7DQo+ICsJ CW5yX3BhZ2VzICs9IGRlZmVycmVkX2luaXRfbWF4b3JkZXIoJmksIHpvbmUsICZzcGZuLCAmZXBm bik7DQo+ICsJCWZpcnN0X2RlZmVycmVkX3BmbiA9IHNwZm47DQo+ICAJfQ0KPiAgDQo+IC0JZm9y X2VhY2hfZnJlZV9tZW1fcmFuZ2UoaSwgbmlkLCBNRU1CTE9DS19OT05FLCAmc3BhLCAmZXBhLCBO VUxMKSB7DQo+IC0JCXNwZm4gPSBtYXhfdCh1bnNpZ25lZCBsb25nLCBmaXJzdF9pbml0X3Bmbiwg UEZOX1VQKHNwYSkpOw0KPiAtCQllcGZuID0gbWluX3QodW5zaWduZWQgbG9uZywgZmlyc3RfZGVm ZXJyZWRfcGZuLCBQRk5fRE9XTihlcGEpKTsNCj4gLQkJZGVmZXJyZWRfZnJlZV9wYWdlcyhzcGZu LCBlcGZuKTsNCj4gLQ0KPiAtCQlpZiAoZmlyc3RfZGVmZXJyZWRfcGZuID09IGVwZm4pDQo+IC0J CQlicmVhazsNCj4gLQl9DQo+ICAJcGdkYXQtPmZpcnN0X2RlZmVycmVkX3BmbiA9IGZpcnN0X2Rl ZmVycmVkX3BmbjsNCj4gIAlwZ2RhdF9yZXNpemVfdW5sb2NrKHBnZGF0LCAmZmxhZ3MpOw0KPiAg DQo+IA==