Received: by 2002:a05:6a10:a0d1:0:0:0:0 with SMTP id j17csp1081536pxa; Wed, 12 Aug 2020 23:12:30 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwq5V5ZC/vDLOHQJHVuXBgjy+yoHoEOMS5DDKiRjBxfX2OXKxT8qB4tHTfwOyK8ZlY1HTZO X-Received: by 2002:a17:906:ecf7:: with SMTP id qt23mr3430234ejb.314.1597299150383; Wed, 12 Aug 2020 23:12:30 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1597299150; cv=none; d=google.com; s=arc-20160816; b=Ng93J1FHq/NVUtgBzSvXxemc+F6sfOf7j3rUuTFa6pBmpHcYpwBBbP/r9CN9po/ZUP 43qIi1E1JnFzMR9IRqiCMfheybqtklxE/7yZsZeD36mSNtF938IcpbXjMoc/xYpDPmC4 LUWKEWeeZDtm0N72SjB2yPw5CTrbtIK0FAPOzbZp2T7B3yK83RsHIPD/1hqz9kXuuiD1 w02njXUiZLkZiwg4L0uQPP4ckIhgccsJItYmCwBXMnYDaagBB4H8evVF7ih+tiDwjDXf nEpOV7ls0FUyCoKTj9jqBmzqno0FRjOYDK7PjsAXvdRayWzpG97QHxzu59E/rEbnte7g GQ9w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:content-transfer-encoding :content-language:accept-language:in-reply-to:references:message-id :date:thread-index:thread-topic:subject:cc:to:from; bh=KNO6QfYtgrZ2hODqOSNPXgucszToqajKt+OsKpV8JV4=; b=liR3gNny+3/4jZqin34iwaXY7GE94vOKE6nBVBAbZUrhJ0RkSWNaxQcYTp1pvz+S+C uAN6+2nnLG2DVTttJeQb+qK52WTw1pngCFg9aYSCAt39Awqdc+bco7TY17+jnxG0IdDY Fp1G03Pf/Q6WoIQs1Jmp4L42VZY/X2iq6K5cIPnvewLI1FDh+D5Vu5CPeeZ5vwz3PnSO JimZdKLyjuUYjfCBr9PZDVUFNGIo9wr87+Xf3iP5psTPwh/oETOU7xxKWQoUISz1/WWV n1Sfu6m/k9t3hSdGwQM5tf0sHXnpoHUEa4gmscoSzWddW6UvAawXc57NRs6UJqPvOwfZ oYQA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id n12si2644348edt.4.2020.08.12.23.12.03; Wed, 12 Aug 2020 23:12:30 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726081AbgHMGLY (ORCPT + 99 others); Thu, 13 Aug 2020 02:11:24 -0400 Received: from szxga08-in.huawei.com ([45.249.212.255]:36746 "EHLO huawei.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1725954AbgHMGLY (ORCPT ); Thu, 13 Aug 2020 02:11:24 -0400 Received: from DGGEML403-HUB.china.huawei.com (unknown [172.30.72.57]) by Forcepoint Email with ESMTP id 6D49E75F6F6F224E49A7; Thu, 13 Aug 2020 14:11:18 +0800 (CST) Received: from DGGEML524-MBX.china.huawei.com ([169.254.1.38]) by DGGEML403-HUB.china.huawei.com ([fe80::74d9:c659:fbec:21fa%31]) with mapi id 14.03.0487.000; Thu, 13 Aug 2020 14:11:08 +0800 From: "Maoming (maoming, Cloud Infrastructure Service Product Dept.)" To: Alex Williamson CC: "linux-kernel@vger.kernel.org" , "kvm@vger.kernel.org" , "cohuck@redhat.com" , "Huangweidong (C)" , Peter Xu , Andrea Arcangeli , "Zhoujian (jay)" Subject: =?gb2312?B?tPC4tDogW1BBVENIXSB2ZmlvIGRtYV9tYXAvdW5tYXA6IG9wdGltaXplZCBm?= =?gb2312?Q?or_hugetlbfs_pages?= Thread-Topic: [PATCH] vfio dma_map/unmap: optimized for hugetlbfs pages Thread-Index: AQHWXm/3A5abr1Qs5U6IZ3wmN1tiJakQjBuAgAD2ggCAGtWuYA== Date: Thu, 13 Aug 2020 06:11:07 +0000 Message-ID: <8B561EC9A4D13649A62CF60D3A8E8CB28C2D0873@dggeml524-mbx.china.huawei.com> References: <20200720082947.1770-1-jianjay.zhou@huawei.com> <20200720164603.3a622548@x1.home> In-Reply-To: Accept-Language: en-US Content-Language: zh-CN X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.174.151.124] Content-Type: text/plain; charset="gb2312" Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org SGksIEFsZXgNClRoYW5rcyBmb3IgdGFraW5nIGEgbG9vay4gQWxzbywgbXkgYXBvbG9naWVzIGZv ciB0aGUgc2xvdyByZXBseS4NClNvbWUgcmVwbGllcyBiZWxvdzoNCi0tLS0t08q8/tStvP4tLS0t LQ0Kt6K8/sjLOiBaaG91amlhbiAoamF5KSANCreiy83KsbzkOiAyMDIwxOo31MIyMcjVIDIxOjI4 DQrK1bz+yMs6IEFsZXggV2lsbGlhbXNvbiA8YWxleC53aWxsaWFtc29uQHJlZGhhdC5jb20+DQqz rcvNOiBsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnOyBrdm1Admdlci5rZXJuZWwub3JnOyBj b2h1Y2tAcmVkaGF0LmNvbTsgTWFvbWluZyAobWFvbWluZywgQ2xvdWQgSW5mcmFzdHJ1Y3R1cmUg U2VydmljZSBQcm9kdWN0IERlcHQuKSA8bWFvbWluZy5tYW9taW5nQGh1YXdlaS5jb20+OyBIdWFu Z3dlaWRvbmcgKEMpIDx3ZWlkb25nLmh1YW5nQGh1YXdlaS5jb20+OyBQZXRlciBYdSA8cGV0ZXJ4 QHJlZGhhdC5jb20+OyBBbmRyZWEgQXJjYW5nZWxpIDxhYXJjYW5nZUByZWRoYXQuY29tPg0K1vfM 4jogUkU6IFtQQVRDSF0gdmZpbyBkbWFfbWFwL3VubWFwOiBvcHRpbWl6ZWQgZm9yIGh1Z2V0bGJm cyBwYWdlcw0KDQpUaGFua3MgZm9yIHRha2luZyBhIGNsb3NlIGxvb2sgYXQgdGhlIGNvZGUsIEFs ZXguDQpXZSdsbCBjaGVjayB0aGVtIG9uZSBieSBvbmUgQVNBUC4NCg0KPiAtLS0tLU9yaWdpbmFs IE1lc3NhZ2UtLS0tLQ0KPiBGcm9tOiBBbGV4IFdpbGxpYW1zb24gW21haWx0bzphbGV4LndpbGxp YW1zb25AcmVkaGF0LmNvbV0NCj4gU2VudDogVHVlc2RheSwgSnVseSAyMSwgMjAyMCA2OjQ2IEFN DQo+IFRvOiBaaG91amlhbiAoamF5KSA8amlhbmpheS56aG91QGh1YXdlaS5jb20+DQo+IENjOiBs aW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnOyBrdm1Admdlci5rZXJuZWwub3JnOyANCj4gY29o dWNrQHJlZGhhdC5jb207IE1hb21pbmcgKG1hb21pbmcsIENsb3VkIEluZnJhc3RydWN0dXJlIFNl cnZpY2UgDQo+IFByb2R1Y3QgRGVwdC4pIDxtYW9taW5nLm1hb21pbmdAaHVhd2VpLmNvbT47IEh1 YW5nd2VpZG9uZyAoQykgDQo+IDx3ZWlkb25nLmh1YW5nQGh1YXdlaS5jb20+OyBQZXRlciBYdSA8 cGV0ZXJ4QHJlZGhhdC5jb20+OyBBbmRyZWEgDQo+IEFyY2FuZ2VsaSA8YWFyY2FuZ2VAcmVkaGF0 LmNvbT4NCj4gU3ViamVjdDogUmU6IFtQQVRDSF0gdmZpbyBkbWFfbWFwL3VubWFwOiBvcHRpbWl6 ZWQgZm9yIGh1Z2V0bGJmcyBwYWdlcw0KPiANCj4gT24gTW9uLCAyMCBKdWwgMjAyMCAxNjoyOTo0 NyArMDgwMA0KPiBKYXkgWmhvdSA8amlhbmpheS56aG91QGh1YXdlaS5jb20+IHdyb3RlOg0KPiAN Cj4gPiBGcm9tOiBNaW5nIE1hbyA8bWFvbWluZy5tYW9taW5nQGh1YXdlaS5jb20+DQo+ID4NCj4g PiBIaSBhbGwsDQo+ID4gSSdtIHdvcmtpbmcgb24gc3RhcnRpbmcgbG90cyBvZiBiaWcgc2l6ZSBW aXJ0dWFsIE1hY2hpbmVzKG1lbW9yeToNCj4gPiA+MTI4R0IpIHdpdGggVkZJTy1kZXZpY2VzLiBB bmQgSSBlbmNvdW50ZXIgYSBwcm9ibGVtIHRoYXQgaXMgdGhlDQo+ID4gd2FpdGluZyB0aW1lIG9m IHN0YXJ0aW5nIGFsbCBWaXJ0dWFsIE1hY2hpbmVzIGlzIHRvbyBsb25nLiBJIGFuYWx5emUgDQo+ ID4gdGhlIHN0YXJ0dXAgbG9nIGFuZCBmaW5kIHRoYXQgdGhlIHRpbWUgb2YgcGlubmluZy91bnBp bm5pbmcgcGFnZXMgDQo+ID4gY291bGQgYmUgcmVkdWNlZC4NCj4gPg0KPiA+IEluIHRoZSBvcmln aW5hbCBwcm9jZXNzLCB0byBtYWtlIHN1cmUgdGhlIHBhZ2VzIGFyZSBjb250aWd1b3VzLCB3ZSAN Cj4gPiBoYXZlIHRvIGNoZWNrIGFsbCBwYWdlcyBvbmUgYnkgb25lLiBJIHRoaW5rIG1heWJlIHdl IGNhbiB1c2UgDQo+ID4gaHVnZXRsYmZzIHBhZ2VzIHdoaWNoIGNhbiBza2lwIHRoaXMgc3RlcC4N Cj4gPiBTbyBJIGNyZWF0ZSBhIHBhdGNoIHRvIGRvIHRoaXMuDQo+ID4gQWNjb3JkaW5nIHRvIG15 IHRlc3QsIHRoZSByZXN1bHQgb2YgdGhpcyBwYXRjaCBpcyBwcmV0dHkgd2VsbC4NCj4gPg0KPiA+ IFZpcnR1YWwgTWFjaGluZTogNTBHIG1lbW9yeSwgMzIgQ1BVLCAxIFZGSU8tZGV2aWNlLCAxRyBo dWdldGxiZnMgcGFnZQ0KPiA+ICAgICAgICAgb3JpZ2luYWwgICBhZnRlciBvcHRpbWl6YXRpb24N Cj4gPiBwaW4gdGltZSAgIDcwMG1zICAgICAgICAgIDAuMW1zDQo+ID4NCj4gPiBJIFN1cHBvc2Ug dGhhdDoNCj4gPiAxKXRoZSBodWdldGxiZnMgcGFnZSBzaG91bGQgbm90IGJlIHNwbGl0IDIpUEdf cmVzZXJ2ZWQgaXMgbm90IA0KPiA+IHJlbGV2YW50IGZvciBodWdldGxiZnMgcGFnZXMgMyl3ZSBj YW4gZGVsZXRlIHRoZSBmb3IgbG9vcHMgYW5kIHVzZSANCj4gPiBzb21lIG9wZXJhdGlvbnMgKHN1 Y2ggYXMgYXRvbWljX2FkZCxwYWdlX3JlZl9hZGQpIGluc3RlYWQNCj4gPg0KPiA+IHBsZWFzZSBj b3JyZWN0IG1lIGlmIEkgYW0gd3JvbmcuDQo+ID4NCj4gPiBUaGFua3MuDQo+ID4NCj4gPiBTaWdu ZWQtb2ZmLWJ5OiBNaW5nIE1hbyA8bWFvbWluZy5tYW9taW5nQGh1YXdlaS5jb20+DQo+ID4gLS0t DQo+ID4gIGRyaXZlcnMvdmZpby92ZmlvX2lvbW11X3R5cGUxLmMgfCAyMzYgKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrLS0NCj4gPiAgaW5jbHVkZS9saW51eC92ZmlvLmggICAgICAgICAg ICB8ICAyMCArKysNCj4gPiAgMiBmaWxlcyBjaGFuZ2VkLCAyNDYgaW5zZXJ0aW9ucygrKSwgMTAg ZGVsZXRpb25zKC0pDQo+ID4NCj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy92ZmlvL3ZmaW9faW9t bXVfdHlwZTEuYyANCj4gPiBiL2RyaXZlcnMvdmZpby92ZmlvX2lvbW11X3R5cGUxLmMgaW5kZXgg NWU1NTZhYzkxLi40MmUyNTc1MmUgMTAwNjQ0DQo+ID4gLS0tIGEvZHJpdmVycy92ZmlvL3ZmaW9f aW9tbXVfdHlwZTEuYw0KPiA+ICsrKyBiL2RyaXZlcnMvdmZpby92ZmlvX2lvbW11X3R5cGUxLmMN Cj4gPiBAQCAtNDE1LDYgKzQxNSw0NiBAQCBzdGF0aWMgaW50IHB1dF9wZm4odW5zaWduZWQgbG9u ZyBwZm4sIGludCBwcm90KQ0KPiA+ICAJcmV0dXJuIDA7DQo+ID4gIH0NCj4gPg0KPiA+ICsvKg0K PiA+ICsgKiBwdXQgcGZucyBmb3IgYSBodWdldGxiZnMgcGFnZQ0KPiA+ICsgKiBAc3RhcnQ6dGhl IDRLQi1wYWdlIHdlIHN0YXJ0IHRvIHB1dCxjYW4gYmUgYW55IHBhZ2UgaW4gdGhpcyANCj4gPiAr aHVnZXRsYmZzIHBhZ2UNCj4gPiArICogQG5wYWdlOnRoZSBudW1iZXIgb2YgNEtCLXBhZ2VzIG5l ZWQgdG8gcHV0DQo+IA0KPiBUaGlzIGNvZGUgc3VwcG9ydHMgc3lzdGVtcyB3aGVyZSBQQUdFX1NJ WkUgaXMgbm90IDRLQi4NCj4gDQoNClllcywgSSB3aWxsIGZpeCB0aGlzIHByb2JsZW0NCg0KDQo+ ID4gKyAqIEBwcm90OklPTU1VX1JFQUQvV1JJVEUNCj4gPiArICovDQo+ID4gK3N0YXRpYyBpbnQg aHVnZXRsYl9wdXRfcGZuKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGludCBucGFnZSwg DQo+ID4gK2ludCBwcm90KSB7DQo+ID4gKwlzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7DQo+ID4g KwlzdHJ1Y3QgcGFnZSAqaGVhZCA9IE5VTEw7DQo+IA0KPiBVbm5lY2Vzc2FyeSBpbml0aWFsaXph dGlvbi4NCj4NClllcyx5b3UgYXJlIHJpZ2h0DQoNCg0KIA0KPiA+ICsNCj4gPiArCWlmICghbnBh Z2UgfHwgIXBmbl92YWxpZChzdGFydCkpDQo+ID4gKwkJcmV0dXJuIDA7DQo+ID4gKw0KPiA+ICsJ cGFnZSA9IHBmbl90b19wYWdlKHN0YXJ0KTsNCj4gPiArCWlmICghcGFnZSB8fCAhUGFnZUh1Z2Uo cGFnZSkpDQo+ID4gKwkJcmV0dXJuIDA7DQo+ID4gKwloZWFkID0gY29tcG91bmRfaGVhZChwYWdl KTsNCj4gPiArCS8qDQo+ID4gKwkgKiBUaGUgbGFzdCBwYWdlIHNob3VsZCBiZSBpbiB0aGlzIGh1 Z2V0bGJmcyBwYWdlLg0KPiA+ICsJICogVGhlIG51bWJlciBvZiBwdXR0aW5nIHBhZ2VzIHNob3Vs ZCBiZSBlcXVhbCB0byB0aGUgbnVtYmVyDQo+ID4gKwkgKiBvZiBnZXR0aW5nIHBhZ2VzLlNvIHRo ZSBodWdlcGFnZSBwaW5uZWQgcmVmY291bnQgYW5kIHRoZSBub3JtYWwNCj4gPiArCSAqIHBhZ2Ug cmVmY291bnQgY2FuIG5vdCBiZSBzbWFsbGVyIHRoYW4gbnBhZ2UuDQo+ID4gKwkgKi8NCj4gPiAr CWlmICgoaGVhZCAhPSBjb21wb3VuZF9oZWFkKHBmbl90b19wYWdlKHN0YXJ0ICsgbnBhZ2UgLSAx KSkpDQo+ID4gKwkgICAgfHwgKHBhZ2VfcmVmX2NvdW50KGhlYWQpIDwgbnBhZ2UpDQo+ID4gKwkg ICAgfHwgKGNvbXBvdW5kX3BpbmNvdW50KHBhZ2UpIDwgbnBhZ2UpKQ0KPiA+ICsJCXJldHVybiAw Ow0KPiA+ICsNCj4gPiArCWlmICgocHJvdCAmIElPTU1VX1dSSVRFKSAmJiAhUGFnZURpcnR5KHBh Z2UpKQ0KPiA+ICsJCXNldF9wYWdlX2RpcnR5X2xvY2socGFnZSk7DQo+ID4gKw0KPiA+ICsJYXRv bWljX3N1YihucGFnZSwgY29tcG91bmRfcGluY291bnRfcHRyKGhlYWQpKTsNCj4gPiArCWlmIChw YWdlX3JlZl9zdWJfYW5kX3Rlc3QoaGVhZCwgbnBhZ2UpKQ0KPiA+ICsJCV9fcHV0X3BhZ2UoaGVh ZCk7DQo+ID4gKw0KPiA+ICsJbW9kX25vZGVfcGFnZV9zdGF0ZShwYWdlX3BnZGF0KGhlYWQpLCBO Ul9GT0xMX1BJTl9SRUxFQVNFRCwNCj4gbnBhZ2UpOw0KPiA+ICsJcmV0dXJuIDE7DQo+ID4gK30N Cj4gPiArDQo+ID4gIHN0YXRpYyBpbnQgZm9sbG93X2ZhdWx0X3BmbihzdHJ1Y3Qgdm1fYXJlYV9z dHJ1Y3QgKnZtYSwgc3RydWN0IA0KPiA+IG1tX3N0cnVjdA0KPiAqbW0sDQo+ID4gIAkJCSAgICB1 bnNpZ25lZCBsb25nIHZhZGRyLCB1bnNpZ25lZCBsb25nICpwZm4sDQo+ID4gIAkJCSAgICBib29s IHdyaXRlX2ZhdWx0KQ0KPiA+IEBAIC00NzksNiArNTE5LDkwIEBAIHN0YXRpYyBpbnQgdmFkZHJf Z2V0X3BmbihzdHJ1Y3QgbW1fc3RydWN0ICptbSwNCj4gdW5zaWduZWQgbG9uZyB2YWRkciwNCj4g PiAgCXJldHVybiByZXQ7DQo+ID4gIH0NCj4gPg0KPiA+ICtzdHJ1Y3QgdmZpb19odXBldGxicGFn ZV9pbmZvIHZmaW9faHVnZXRsYnBhZ2VfaW5mb1tIVUdFX01BWF9IU1RBVEVdID0gew0KPiA+ICsJ e3ZmaW9faHVnZXRsYnBhZ2VfMk0sIFBNRF9TSVpFLCB+KCgxVUxMIDw8IEhQQUdFX1BNRF9TSElG VCkgLSAxKX0sDQo+ID4gKwl7dmZpb19odWdldGxicGFnZV8xRywgUFVEX1NJWkUsIH4oKDFVTEwg PDwgSFBBR0VfUFVEX1NISUZUKSAtIDEpfSwNCj4gDQo+IE90aGVyIGFyY2hpdGVjdHVyZXMgc3Vw cG9ydCBtb3JlIGh1Z2UgcGFnZSBzaXplcywgYWxzbyAwLWRheSANCj4gaWRlbnRpZmllZCB0aGVz ZSAjZGVmaW5lcyBkb24ndCBleGlzdCB3aGVuIFRIUCBpcyBub3QgY29uZmlndXJlZC4gIEJ1dCAN Cj4gd2h5IGNvdWxkbid0IHdlIGZpZ3VyZSBvdXQgYWxsIG9mIHRoZXNlIGZvcm0gdGhlIGNvbXBv dW5kX29yZGVyKCk/ICANCj4gb3JkZXIgPT0gc2hpZnQsIHNpemUgPSBQQUdFX1NJWkUgPDwgb3Jk ZXIuDQo+IA0KDQpZZXMsIGNvbXBvdW5kX29yZGVyKCkgaXMgYmV0dGVyLg0KDQoNCj4gPiArfTsN Cj4gPiArDQo+ID4gK3N0YXRpYyBib29sIGlzX2h1Z2V0bGJwYWdlKHVuc2lnbmVkIGxvbmcgcGZu LCBlbnVtIA0KPiA+ICt2ZmlvX2h1Z2V0bGJwYWdlX3R5cGUgKnR5cGUpIHsNCj4gPiArCXN0cnVj dCBwYWdlICpwYWdlID0gTlVMTDsNCj4gDQo+IFVubmVjZXNzYXJ5IGluaXRpYWxpemF0aW9uLg0K PiANClllcyx5b3UgYXJlIHJpZ2h0DQoNCg0KDQo+ID4gKw0KPiA+ICsJaWYgKCFwZm5fdmFsaWQo cGZuKSB8fCAhdHlwZSkNCj4gPiArCQlyZXR1cm4gZmFsc2U7DQo+ID4gKw0KPiA+ICsJcGFnZSA9 IHBmbl90b19wYWdlKHBmbik7DQo+ID4gKwkvKiBvbmx5IGNoZWNrIGZvciBodWdldGxiZnMgcGFn ZXMgKi8NCj4gPiArCWlmICghcGFnZSB8fCAhUGFnZUh1Z2UocGFnZSkpDQo+ID4gKwkJcmV0dXJu IGZhbHNlOw0KPiA+ICsNCj4gPiArCXN3aXRjaCAoY29tcG91bmRfb3JkZXIoY29tcG91bmRfaGVh ZChwYWdlKSkpIHsNCj4gPiArCWNhc2UgUE1EX09SREVSOg0KPiA+ICsJCSp0eXBlID0gdmZpb19o dWdldGxicGFnZV8yTTsNCj4gPiArCQlicmVhazsNCj4gPiArCWNhc2UgUFVEX09SREVSOg0KPiA+ ICsJCSp0eXBlID0gdmZpb19odWdldGxicGFnZV8xRzsNCj4gPiArCQlicmVhazsNCj4gPiArCWRl ZmF1bHQ6DQo+ID4gKwkJcmV0dXJuIGZhbHNlOw0KPiA+ICsJfQ0KPiA+ICsNCj4gPiArCXJldHVy biB0cnVlOw0KPiA+ICt9DQo+ID4gKw0KPiA+ICsvKiBJcyB0aGUgYWRkciBpbiB0aGUgbGFzdCBw YWdlIGluIGh1Z2V0bGJmcyBwYWdlcz8gKi8gc3RhdGljIGJvb2wgDQo+ID4gK2h1Z2V0bGJfaXNf bGFzdF9wYWdlKHVuc2lnbmVkIGxvbmcgYWRkciwgZW51bSB2ZmlvX2h1Z2V0bGJwYWdlX3R5cGUN Cj4gPiArdHlwZSkgew0KPiA+ICsJdW5zaWduZWQgaW50IG51bSA9IDA7DQo+IA0KPiBVbm5lY2Vz c2FyeSBpbml0aWFsaXphdGlvbiwgYW5kIGluIGZhY3QgdW5uZWNlc3NhcnkgdmFyaWFibGUgYWx0 b2dldGhlci4NCj4gaWUuDQo+IA0KPiAJcmV0dXJuIGh1Z2V0bGJfZ2V0X3Jlc2R1YWxfcGFnZXMo YWRkciAmIH4oUEFHRV9TSVpFIC0gMSksIHR5cGUpID09IDE7DQo+IA0KPiANCj4gPiArDQo+ID4g KwludW0gPSBodWdldGxiX2dldF9yZXNkdWFsX3BhZ2VzKGFkZHIgJiB+KFBBR0VfU0laRSAtIDEp LCB0eXBlKTsNCj4gDQo+IHJlc2lkdWFsPw0KPiANCg0KWWVzLCBJIHdpbGwgZml4IHRoaXMgcHJv YmxlbQ0KDQoNCj4gPiArDQo+ID4gKwlpZiAobnVtID09IDEpDQo+ID4gKwkJcmV0dXJuIHRydWU7 DQo+ID4gKwllbHNlDQo+ID4gKwkJcmV0dXJuIGZhbHNlOw0KPiA+ICt9DQo+ID4gKw0KPiA+ICtz dGF0aWMgYm9vbCBodWdldGxiX3BhZ2VfaXNfcGlubmVkKHN0cnVjdCB2ZmlvX2RtYSAqZG1hLA0K PiA+ICsJCQkJdW5zaWduZWQgbG9uZyBzdGFydCwNCj4gPiArCQkJCXVuc2lnbmVkIGxvbmcgbnBh Z2VzKQ0KPiA+ICt7DQo+ID4gKwlzdHJ1Y3QgdmZpb19wZm4gKnZwZm4gPSBOVUxMOw0KPiANCj4g VW5uZWNlc3NhcnkgaW5pdGlhbGl6YXRpb24uDQo+IA0KWWVzLHlvdSBhcmUgcmlnaHQNCg0KDQo+ ID4gKwlzdHJ1Y3QgcmJfbm9kZSAqbm9kZSA9IHJiX2ZpcnN0KCZkbWEtPnBmbl9saXN0KTsNCj4g PiArCXVuc2lnbmVkIGxvbmcgZW5kID0gc3RhcnQgKyBucGFnZXMgLSAxOw0KPiA+ICsNCj4gPiAr CWZvciAoOyBub2RlOyBub2RlID0gcmJfbmV4dChub2RlKSkgew0KPiA+ICsJCXZwZm4gPSByYl9l bnRyeShub2RlLCBzdHJ1Y3QgdmZpb19wZm4sIG5vZGUpOw0KPiA+ICsNCj4gPiArCQlpZiAoKHZw Zm4tPnBmbiA+PSBzdGFydCkgJiYgKHZwZm4tPnBmbiA8PSBlbmQpKQ0KPiA+ICsJCQlyZXR1cm4g dHJ1ZTsNCj4gDQo+IFRoaXMgZnVuY3Rpb24gY291bGQgYmUgbmFtZWQgYmV0dGVyLCBpdCBzdWdn ZXN0cyB0aGUgaHVnZXRsYmZzIHBhZ2UgaXMgDQo+IHBpbm5lZCwgYnV0IHJlYWxseSB3ZSdyZSBv bmx5IGxvb2tpbmcgZm9yIGFueSBwZm5fbGlzdCBwaW5uaW5ncyBvdmVybGFwcGluZyB0aGUgcGZu IHJhbmdlLg0KPiANCg0KWWVzLHlvdSBhcmUgcmlnaHQNCg0KDQoNCg0KPiA+ICsJfQ0KPiA+ICsN Cj4gPiArCXJldHVybiBmYWxzZTsNCj4gPiArfQ0KPiA+ICsNCj4gPiArc3RhdGljIHVuc2lnbmVk IGludCBodWdldGxiX2dldF9jb250aWd1b3VzX3BhZ2VzX251bShzdHJ1Y3QgDQo+ID4gK3ZmaW9f ZG1hDQo+ICpkbWEsDQo+ID4gKwkJCQkJCXVuc2lnbmVkIGxvbmcgcGZuLA0KPiA+ICsJCQkJCQl1 bnNpZ25lZCBsb25nIHJlc2R1YWxfbnBhZ2UsDQo+ID4gKwkJCQkJCXVuc2lnbmVkIGxvbmcgbWF4 X25wYWdlKQ0KPiA+ICt7DQo+ID4gKwl1bnNpZ25lZCBpbnQgbnVtID0gMDsNCj4gDQo+IFVubmVj ZXNzYXJ5IGluaXRpYWxpemF0aW9uDQo+IA0KDQoNClllcyx5b3UgYXJlIHJpZ2h0DQoNCg0KDQo+ ID4gKw0KPiA+ICsJaWYgKCFkbWEpDQo+ID4gKwkJcmV0dXJuIDA7DQo+ID4gKw0KPiA+ICsJbnVt ID0gcmVzZHVhbF9ucGFnZSA8IG1heF9ucGFnZSA/IHJlc2R1YWxfbnBhZ2UgOiBtYXhfbnBhZ2U7 DQo+IA0KPiBtaW4ocmVzZHVhbF9ucGFnZSwgbWF4X25wYWdlKQ0KPiANCj4gDQoNClllcyxtaW4g aXMgYmV0dGVyDQoNCg0KDQo+ID4gKwkvKg0KPiA+ICsJICogSWYgdGhlcmUgaXMgb25seSBvbmUg cGFnZSwgaXQgaXMgbm8gbmVlZCB0byBvcHRpbWl6ZSB0aGVtLg0KPiANCj4gcy9ubyBuZWVkL25v dCBuZWNlc3NhcnkvDQo+IA0KDQpJIHdpbGwgZml4IHRoaXMgcHJvYmxlbQ0KDQo+ID4gKwkgKiBN YXliZSBzb21lIHBhZ2VzIGhhdmUgYmVlbiBwaW5uZWQgYW5kIGluc2VydGVkIGludG8gDQo+ID4g K2RtYS0+cGZuX2xpc3QgYnkNCj4gb3RoZXJzLg0KPiA+ICsJICogSW4gdGhpcyBjYXNlLCB3ZSBq dXN0IGdvdG8gdGhlIHNsb3cgcGF0aCBzaW1wbHkuDQo+ID4gKwkgKi8NCj4gPiArCWlmICgobnVt IDwgMikgfHwgaHVnZXRsYl9wYWdlX2lzX3Bpbm5lZChkbWEsIHBmbiwgbnVtKSkNCj4gPiArCQly ZXR1cm4gMDsNCj4gDQo+IFdoeSBkb2VzIGhhdmluZyBwaW5uaW5ncyBpbiB0aGUgcGZuX2xpc3Qg ZGlzcXVhbGlmeSBpdCBmcm9tIGh1Z2V0bGJmcyBwaW5uaW5nPw0KPiANCj4gVGVzdGluZyBmb3Ig dGhlIGxhc3QgcGFnZSBoZXJlIGlzIHJlZHVuZGFudCB0byB0aGUgcGlubmluZyBwYXRoLCANCj4g c2hvdWxkIGl0IG9ubHkgYmUgZG9uZSBoZXJlPyAgQ2FuIG51bSBiZSB6ZXJvPw0KPiANCj4gTWF5 YmUgYmV0dGVyIHRvIHJldHVybiAtZXJybm8gZm9yIHRoaXMgYW5kIGFib3ZlIHplcm8gY29uZGl0 aW9ucyANCj4gcmF0aGVyIHRoYW4gcmV0dXJuIGEgdmFsdWUgdGhhdCBkb2Vzbid0IHJlZmxlY3Qg dGhlIHB1cnBvc2Ugb2YgdGhlIGZ1bmN0aW9uPw0KPiANCg0KDQpBbGwgcGFnZXMgZm91bmQgaW4g cGZuX2xpc3QgaGF2ZSBiZWVuIHBpbm5lZCBhbmQgY291bnRlZCBleHRlcm5hbGx5Lg0KSW4gdGhp cyBjYXNlLCB0aGUgbG9ja19hY2N0IHNob3VsZCBub3QgYmUgYWRkZWQuDQpJIHRob3VnaHQgaXQg Y291bGQgc3BlbmQgbG90cyBvZiB0aW1lIHRvIGZpZ3VyZSBvdXQgaG93IG1hbnkgcGFnZXMgaGF2 ZSBiZWVuIHBpbm5lZA0KaW4gdGhpcyBodWdldGxiIHBhZ2UuDQpCdXQgY29uc2lkZXJpbmcgdGhh dCB0aGUgZG1hLT5wZm5fbGlzdCBpcyBOVUxMIGluIG1vc3QgY2FzZXMsIGl0IGRvZXMgbm90IG1h dHRlciB0byANCmRvIHRoaXMuIFNvLEkgd2lsbCBtb2RpZnkgaXQgdG8gZmlndXJlIG91dCB0aGUg bnVtYmVyIG9mIHBhZ2VzIHBpbm5lZCBleHRlcm5hbGx5Lg0KDQpJdCBpcyBhIHNwZWNpYWwgY2Fz ZSBpZiB0aGUgdmFkZHIgaXMgdGhlIGxhc3QgcGFnZS4NCkJlY2F1c2UgdGhlIG5leHQgcGFnZSBp cyBpbiBhbm90aGVyIGh1Z2V0bGIgcGFnZSwgYW5kIHRoZSBodWdldGxiIHBhZ2VzIG1heSBiZSBu b3QgY29udGlndW91cy4NCkJ1dCxhcyB5b3Ugc2FpZCwgaXQgaXMgcmVkdW5kYW50IHRvIHRoZSBw aW5uaW5nIHBhdGguDQpJIHdpbGwgcmV3cml0ZSB0aGlzIGZ1bmN0aW9uLg0KDQoNCj4gPiArDQo+ ID4gKwlyZXR1cm4gbnVtOw0KPiA+ICt9DQo+ID4gKw0KPiA+ICAvKg0KPiA+ICAgKiBBdHRlbXB0 IHRvIHBpbiBwYWdlcy4gIFdlIHJlYWxseSBkb24ndCB3YW50IHRvIHRyYWNrIGFsbCB0aGUgcGZu cyBhbmQNCj4gPiAgICogdGhlIGlvbW11IGNhbiBvbmx5IG1hcCBjaHVua3Mgb2YgY29uc2VjdXRp dmUgcGZucyBhbnl3YXksIHNvIGdldCANCj4gPiB0aGUgQEAgLTQ5Miw2ICs2MTYsNyBAQCBzdGF0 aWMgbG9uZyB2ZmlvX3Bpbl9wYWdlc19yZW1vdGUoc3RydWN0IA0KPiA+IHZmaW9fZG1hDQo+ICpk bWEsIHVuc2lnbmVkIGxvbmcgdmFkZHIsDQo+ID4gIAlsb25nIHJldCwgcGlubmVkID0gMCwgbG9j a19hY2N0ID0gMDsNCj4gPiAgCWJvb2wgcnN2ZDsNCj4gPiAgCWRtYV9hZGRyX3QgaW92YSA9IHZh ZGRyIC0gZG1hLT52YWRkciArIGRtYS0+aW92YTsNCj4gPiArCWVudW0gdmZpb19odWdldGxicGFn ZV90eXBlIHR5cGU7DQo+ID4NCj4gPiAgCS8qIFRoaXMgY29kZSBwYXRoIGlzIG9ubHkgdXNlciBp bml0aWF0ZWQgKi8NCj4gPiAgCWlmICghY3VycmVudC0+bW0pDQo+ID4gQEAgLTUyMSw2ICs2NDYs NTUgQEAgc3RhdGljIGxvbmcgdmZpb19waW5fcGFnZXNfcmVtb3RlKHN0cnVjdCANCj4gPiB2Zmlv X2RtYQ0KPiAqZG1hLCB1bnNpZ25lZCBsb25nIHZhZGRyLA0KPiA+ICAJaWYgKHVubGlrZWx5KGRp c2FibGVfaHVnZXBhZ2VzKSkNCj4gPiAgCQlnb3RvIG91dDsNCj4gPg0KPiA+ICsJLyoNCj4gPiAr CSAqIEl0IGlzIG5vIG5lZWQgdG8gZ2V0IHBhZ2VzIG9uZSBieSBvbmUgZm9yIGh1Z2V0bGJmcyBw YWdlcy4NCj4gDQo+IHMvbm8gbmVlZC9ub3QgbmVjZXNzYXJ5Lw0KPiANCkkgd2lsbCBmaXggdGhp cyBwcm9ibGVtDQoNCg0KPiA+ICsJICogNEtCLXBhZ2VzIGluIGh1Z2V0bGJmcyBwYWdlcyBhcmUg Y29udGlndW91cy4NCj4gPiArCSAqIEJ1dCBpZiB0aGUgdmFkZHIgaXMgaW4gdGhlIGxhc3QgNEtC LXBhZ2UsIHdlIGp1c3QgZ290byB0aGUgc2xvdyBwYXRoLg0KPiANCj4gDQo+IHMvNEtCLS9QQUdF X1NJWkUgLw0KPiANCkkgd2lsbCBmaXggdGhpcyBwcm9ibGVtDQoNCg0KPiBQbGVhc2UgZXhwbGFp biB0aGUgc2lnbmlmaWNhbmNlIG9mIHZhZGRyIGJlaW5nIGluIHRoZSBsYXN0IFBBR0VfU0laRSAN Cj4gcGFnZSBvZiBhIGh1Z2V0bGJmcyBwYWdlLiAgSXMgaXQgc2ltcGx5IHRoYXQgd2Ugc2hvdWxk IHRha2UgdGhlIHNsb3cgDQo+IHBhdGggZm9yIG1hcHBpbmcgYSBzaW5nbGUgcGFnZSBiZWZvcmUg dGhlIGVuZCBvZiB0aGUgaHVnZXRsYmZzIHBhZ2U/DQo+IElzIHRoaXMgb3B0aW1pemF0aW9uIHdv cnRod2hpbGU/ICBJc24ndCBpdCBtb3JlIGNvbnNpc3RlbnQgdG8gaGFuZGxlIA0KPiBhbGwgbWFw cGluZ3Mgb3ZlciBodWdldGxiZnMgcGFnZXMgdGhlIHNhbWU/ICBTaG91bGQgd2UgYmUgb3BlcmF0 aW5nIG9uIA0KPiB2YWRkciBoZXJlIGZvciB0aGUgaHVnZXRsYmZzIHBhZ2UgYWxpZ25tZW50IG9y IGJhc2VfcGZuPw0KPiANCg0KDQpJZiB0aGUgdmFkZHIgaXMgdGhlIGxhc3QgcGFnZSwgdGhlIG5l eHQgcGFnZSBpcyBpbiBhbm90aGVyIGh1Z2V0bGIgcGFnZS4NCkluIHRoZSBuZXcgcGF0Y2gsIEkg d2lsbCBjaGVjayB0aGUgYWRkcmVzcyBvZiBhbGwgaHVnZXRsYiBwYWdlcy4gSWYgdGhlIHZhZGRy IGlzIHRoZQ0KbGFzdCBwYWdlIG9mIGEgaHVnZXRsYiBwYWdlIGFuZCB0aGUgbmV4dCBodWdldGxi IHBhZ2UgaXMgY29udGlndW91cywgSSB3bGwgdGFrZSB0aGUNCmZhc3QgcGF0aC4NCg0KWWVzLCB0 aGUgdmFkZHIgc2hvdWxkIGJlIGFsaWdubWVudC4NCg0KDQo+ID4gKwkgKi8NCj4gPiArCWlmIChp c19odWdldGxicGFnZSgqcGZuX2Jhc2UsICZ0eXBlKSAmJiANCj4gPiArIWh1Z2V0bGJfaXNfbGFz dF9wYWdlKHZhZGRyLA0KPiB0eXBlKSkgew0KPiA+ICsJCXVuc2lnbmVkIGxvbmcgaHVnZXRsYl9y ZXNkdWFsX25wYWdlID0gMDsNCj4gPiArCQl1bnNpZ25lZCBsb25nIGNvbnRpZ3VvdXNfbnBhZ2Ug PSAwOw0KPiA+ICsJCXN0cnVjdCBwYWdlICpoZWFkID0gTlVMTDsNCj4gPiArDQo+ID4gKwkJaHVn ZXRsYl9yZXNkdWFsX25wYWdlID0NCj4gPiArCQkJaHVnZXRsYl9nZXRfcmVzZHVhbF9wYWdlcygo dmFkZHIgKyBQQUdFX1NJWkUpICYgfihQQUdFX1NJWkUgLQ0KPiAxKSwNCj4gPiArdHlwZSk7DQo+ IA0KPiB+KFBBR0VfU0laRSAtIDEpIGlzIFBBR0VfTUFTSywgYnV0IHRoYXQgd2hvbGUgb3BlcmF0 aW9uIGxvb2tzIGxpa2UgYQ0KPiBQQUdFX0FMSUdOKHZhZGRyKQ0KPiANCj4gVGhpcyBpcyB0cnlp bmcgdG8gZ2V0IHRoZSBudW1iZXIgb2YgcGFnZXMgYWZ0ZXIgdGhpcyBwYWdlIHRvIHRoZSBlbmQg DQo+IG9mIHRoZSBodWdldGxiZnMgcGFnZSwgcmlnaHQ/ICBSYXRoZXIgdGhhbiB0aGUgaHVnZXRs Yl9pc19sYXN0X3BhZ2UoKSANCj4gYWJvdmUsIHNob3VsZG4ndCB3ZSBoYXZlIHJlY29yZGVkIHRo ZSBudW1iZXIgb2YgcGFnZXMgdGhlcmUgYW5kIHVzZWQgbWF0aCB0byBnZXQgdGhpcyB2YWx1ZT8N Cj4gDQoNClllcywgeW91IGFyZSByaWdodC4gSSB3aWxsIGZpeCB0aGlzIHByb2JsZW0NCg0KDQo+ ID4gKwkJLyoNCj4gPiArCQkgKiBNYXliZSB0aGUgaHVnZXRsYl9yZXNkdWFsX25wYWdlIGlzIGlu dmFsaWQuDQo+ID4gKwkJICogRm9yIGV4YW1wbGUsIGh1Z2V0bGJfcmVzZHVhbF9ucGFnZSA+IChu cGFnZSAtIDEpIG9yDQo+ID4gKwkJICogc29tZSBwYWdlcyBvZiB0aGlzIGh1Z2V0bGJmcyBwYWdl IGhhdmUgYmVlbiBwaW5uZWQuDQo+ID4gKwkJICovDQo+ID4gKwkJY29udGlndW91c19ucGFnZSA9 IGh1Z2V0bGJfZ2V0X2NvbnRpZ3VvdXNfcGFnZXNfbnVtKGRtYSwNCj4gKnBmbl9iYXNlICsgMSwN Cj4gPiArCQkJCQkJaHVnZXRsYl9yZXNkdWFsX25wYWdlLCBucGFnZSAtIDEpOw0KPiA+ICsJCWlm ICghY29udGlndW91c19ucGFnZSkNCj4gPiArCQkJZ290byBzbG93X3BhdGg7DQo+ID4gKw0KPiA+ ICsJCS8qDQo+ID4gKwkJICogVW5saWtlIFRIUCwgdGhlIHNwbGl0dGluZyBzaG91bGQgbm90IGhh cHBlbiBmb3IgaHVnZXRsYmZzIHBhZ2VzLg0KPiA+ICsJCSAqIFNpbmNlIFBHX3Jlc2VydmVkIGlz IG5vdCByZWxldmFudCBmb3IgY29tcG91bmQgcGFnZXMsIGFuZCB0aGUgDQo+ID4gK3Bmbg0KPiBv Zg0KPiA+ICsJCSAqIDRLQi1wYWdlIHdoaWNoIGluIGh1Z2V0bGJmcyBwYWdlcyBpcyB2YWxpZCwN Cj4gDQo+IHMvNEtCL1BBR0VfU0laRS8NCj4gDQoNCkkgd2lsbCBmaXggdGhpcyBwcm9ibGVtDQoN Cj4gPiArCQkgKiBpdCBpcyBubyBuZWVkIHRvIGNoZWNrIHJzdmQgZm9yIGh1Z2V0bGJmcyBwYWdl cy4NCj4gDQo+IHMvbm8gbmVlZC9ub3QgbmVjZXNzYXJ5Lw0KPiANCg0KSSB3aWxsIGZpeCB0aGlz IHByb2JsZW0NCg0KPiA+ICsJCSAqLw0KPiA+ICsJCWlmICghZG1hLT5sb2NrX2NhcCAmJg0KPiA+ ICsJCSAgICBjdXJyZW50LT5tbS0+bG9ja2VkX3ZtICsgbG9ja19hY2N0ICsgY29udGlndW91c19u cGFnZSA+IA0KPiA+ICtsaW1pdCkNCj4gew0KPiA+ICsJCQlwcl93YXJuKCIlczogUkxJTUlUX01F TUxPQ0sgKCVsZCkgZXhjZWVkZWRcbiIsDQo+ID4gKwkJCQkgX19mdW5jX18sIGxpbWl0IDw8IFBB R0VfU0hJRlQpOw0KPiA+ICsJCQlyZXQgPSAtRU5PTUVNOw0KPiA+ICsJCQlnb3RvIHVucGluX291 dDsNCj4gPiArCQl9DQo+ID4gKwkJLyoNCj4gPiArCQkgKiBXZSBnb3QgYSBodWdldGxiZnMgcGFn ZSB1c2luZyB2YWRkcl9nZXRfcGZuIGFscmVhZGx5Lg0KPiA+ICsJCSAqIEluIHRoaXMgY2FzZSx3 ZSBkbyBub3QgbmVlZCB0byBhbGxvYyBwYWdlcyBhbmQgd2UgY2FuIGZpbmlzaCBhbGwNCj4gPiAr CQkgKiB3b3JrIGJ5IGEgc2luZ2xlIG9wZXJhdGlvbiB0byB0aGUgaGVhZCBwYWdlLg0KPiA+ICsJ CSAqLw0KPiA+ICsJCWxvY2tfYWNjdCArPSBjb250aWd1b3VzX25wYWdlOw0KPiA+ICsJCWhlYWQg PSBjb21wb3VuZF9oZWFkKHBmbl90b19wYWdlKCpwZm5fYmFzZSkpOw0KPiA+ICsJCWF0b21pY19h ZGQoY29udGlndW91c19ucGFnZSwgY29tcG91bmRfcGluY291bnRfcHRyKGhlYWQpKTsNCj4gPiAr CQlwYWdlX3JlZl9hZGQoaGVhZCwgY29udGlndW91c19ucGFnZSk7DQo+ID4gKwkJbW9kX25vZGVf cGFnZV9zdGF0ZShwYWdlX3BnZGF0KGhlYWQpLCBOUl9GT0xMX1BJTl9BQ1FVSVJFRCwNCj4gY29u dGlndW91c19ucGFnZSk7DQo+ID4gKwkJcGlubmVkICs9IGNvbnRpZ3VvdXNfbnBhZ2U7DQo+ID4g KwkJZ290byBvdXQ7DQo+IA0KPiBJJ20gaG9waW5nIFBldGVyIG9yIEFuZHJlYSB1bmRlcnN0YW5k IHRoaXMsIGJ1dCBJIHRoaW5rIHdlIHN0aWxsIGhhdmUgDQo+IHBmbl9iYXNlIHBpbm5lZCBzZXBh cmF0ZWx5IGFuZCBJIGRvbid0IHNlZSB0aGF0IHdlJ3ZlIGRvbmUgYW4gdW5waW4gDQo+IGFueXdo ZXJlLCBzbyBhcmUgd2UgbGVha2luZyB0aGUgcGluIG9mIHRoZSBmaXJzdCBwYWdlPz8NCj4gDQoN CkRvIHlvdSBtZWFuIGxpa2UgdGhpcz8NCigxKSByZXQgPSB2YWRkcl9nZXRfcGZuKGN1cnJlbnQt Pm1tLCB2YWRkciwgZG1hLT5wcm90LCBwZm5fYmFzZSkNCigyKXJzdmQgaXMgdHJ1ZQ0KKDMpVGhl cmUgaXMgc29tZXRoaW5nIHdyb25nIGFuZCBnb3RvIHVucGluX291dA0KKDQpY2FuIG5vdCBwdXRf cGZuIGZvciBwZm5fYmFzZSBiZWNhdXNlIG9mIHJzdmQNCg0KDQoNCj4gPiArCX0NCj4gPiArc2xv d19wYXRoOg0KPiA+ICAJLyogTG9jayBhbGwgdGhlIGNvbnNlY3V0aXZlIHBhZ2VzIGZyb20gcGZu X2Jhc2UgKi8NCj4gPiAgCWZvciAodmFkZHIgKz0gUEFHRV9TSVpFLCBpb3ZhICs9IFBBR0VfU0la RTsgcGlubmVkIDwgbnBhZ2U7DQo+ID4gIAkgICAgIHBpbm5lZCsrLCB2YWRkciArPSBQQUdFX1NJ WkUsIGlvdmEgKz0gUEFHRV9TSVpFKSB7IEBAIC01NjksNw0KPiA+ICs3NDMsMzAgQEAgc3RhdGlj IGxvbmcgdmZpb191bnBpbl9wYWdlc19yZW1vdGUoc3RydWN0IHZmaW9fZG1hICpkbWEsDQo+ID4g ZG1hX2FkZHJfdCBpb3ZhLCAgew0KPiA+ICAJbG9uZyB1bmxvY2tlZCA9IDAsIGxvY2tlZCA9IDA7 DQo+ID4gIAlsb25nIGk7DQo+ID4gKwllbnVtIHZmaW9faHVnZXRsYnBhZ2VfdHlwZSB0eXBlOw0K PiA+ICsNCj4gPiArCWlmIChpc19odWdldGxicGFnZShwZm4sICZ0eXBlKSkgew0KPiA+ICsJCXVu c2lnbmVkIGxvbmcgaHVnZXRsYl9yZXNkdWFsX25wYWdlID0gMDsNCj4gPiArCQl1bnNpZ25lZCBs b25nIGNvbnRpZ3VvdXNfbnBhZ2UgPSAwOw0KPiANCj4gVW5uZWNlc3NhcnkgaW5pdGlhbGl6YXRp b24uLi4NCj4gDQo+ID4NCg0KWWVzLCB5b3UgYXJlIHJpZ2h0DQoNCj4gPiArCQlodWdldGxiX3Jl c2R1YWxfbnBhZ2UgPSBodWdldGxiX2dldF9yZXNkdWFsX3BhZ2VzKGlvdmEgJiANCj4gPiArfihQ QUdFX1NJWkUgLSAxKSwgdHlwZSk7DQo+IA0KPiBQQUdFX01BU0sNCj4gDQoNCkkgd2lsbCBmaXgg dGhpcyBwcm9ibGVtDQoNCg0KPiBMaWtlIGFib3ZlLCBpcyBpdCBwZm4gb3IgaW92YSB0aGF0IHdl IHNob3VsZCBiZSB1c2luZyB3aGVuIGxvb2tpbmcgYXQgDQo+IGh1Z2V0bGJmcyBhbGlnbm1lbnQ/ DQo+IA0KDQpZZXMsIEkgd2lsbCBmaXggdGhpcyBwcm9ibGVtDQoNCg0KDQo+ID4gKwkJY29udGln dW91c19ucGFnZSA9IGh1Z2V0bGJfZ2V0X2NvbnRpZ3VvdXNfcGFnZXNfbnVtKGRtYSwgcGZuLA0K PiA+ICsJCQkJCQlodWdldGxiX3Jlc2R1YWxfbnBhZ2UsIG5wYWdlKTsNCj4gPiArCQkvKg0KPiA+ ICsJCSAqIFRoZXJlIGlzIG5vdCBlbm91Z2ggY29udGlndW91cyBwYWdlcyBvciB0aGlzIGh1Z2V0 bGJmcyBwYWdlDQo+ID4gKwkJICogaGFzIGJlZW4gcGlubmVkLg0KPiA+ICsJCSAqIExldCdzIHRy eSB0aGUgc2xvdyBwYXRoLg0KPiA+ICsJCSAqLw0KPiA+ICsJCWlmICghY29udGlndW91c19ucGFn ZSkNCj4gPiArCQkJZ290byBzbG93X3BhdGg7DQo+ID4gKw0KPiA+ICsJCS8qIHRyeSB0aGUgc2xv dyBwYXRoIGlmIGZhaWxlZCAqLw0KPiA+ICsJCWlmIChodWdldGxiX3B1dF9wZm4ocGZuLCBjb250 aWd1b3VzX25wYWdlLCBkbWEtPnByb3QpKSB7DQo+ID4gKwkJCXVubG9ja2VkID0gY29udGlndW91 c19ucGFnZTsNCj4gPiArCQkJZ290byBvdXQ7DQo+ID4gKwkJfQ0KPiANCj4gU2hvdWxkIHByb2Jh Ymx5IGJyZWFrIHRoZSBwaW4gcGF0aCBpbnRvIGEgc2VwYXJhdGUgZ2V0X3BmbiBmdW5jdGlvbiAN Cj4gZm9yIHN5bW1ldHJ5Lg0KPiANCj4gDQoNClllcywgSSB3aWxsIGZpeCB0aGlzIHByb2JsZW0N Cg0KDQo+ID4gKwl9DQo+ID4gK3Nsb3dfcGF0aDoNCj4gPiAgCWZvciAoaSA9IDA7IGkgPCBucGFn ZTsgaSsrLCBpb3ZhICs9IFBBR0VfU0laRSkgew0KPiA+ICAJCWlmIChwdXRfcGZuKHBmbisrLCBk bWEtPnByb3QpKSB7DQo+ID4gIAkJCXVubG9ja2VkKys7DQo+ID4gQEAgLTU3OCw2ICs3NzUsNyBA QCBzdGF0aWMgbG9uZyB2ZmlvX3VucGluX3BhZ2VzX3JlbW90ZShzdHJ1Y3QgDQo+ID4gdmZpb19k bWENCj4gKmRtYSwgZG1hX2FkZHJfdCBpb3ZhLA0KPiA+ICAJCX0NCj4gPiAgCX0NCj4gPg0KPiA+ ICtvdXQ6DQo+ID4gIAlpZiAoZG9fYWNjb3VudGluZykNCj4gPiAgCQl2ZmlvX2xvY2tfYWNjdChk bWEsIGxvY2tlZCAtIHVubG9ja2VkLCB0cnVlKTsNCj4gPg0KPiA+IEBAIC04NjcsNiArMTA2NSw3 IEBAIHN0YXRpYyBsb25nIHZmaW9fdW5tYXBfdW5waW4oc3RydWN0IHZmaW9faW9tbXUNCj4gKmlv bW11LCBzdHJ1Y3QgdmZpb19kbWEgKmRtYSwNCj4gPiAgCXN0cnVjdCBpb21tdV9pb3RsYl9nYXRo ZXIgaW90bGJfZ2F0aGVyOw0KPiA+ICAJaW50IHVubWFwcGVkX3JlZ2lvbl9jbnQgPSAwOw0KPiA+ ICAJbG9uZyB1bmxvY2tlZCA9IDA7DQo+ID4gKwllbnVtIHZmaW9faHVnZXRsYnBhZ2VfdHlwZSB0 eXBlOw0KPiA+DQo+ID4gIAlpZiAoIWRtYS0+c2l6ZSkNCj4gPiAgCQlyZXR1cm4gMDsNCj4gPiBA QCAtOTAwLDE2ICsxMDk5LDMzIEBAIHN0YXRpYyBsb25nIHZmaW9fdW5tYXBfdW5waW4oc3RydWN0 IA0KPiA+IHZmaW9faW9tbXUNCj4gKmlvbW11LCBzdHJ1Y3QgdmZpb19kbWEgKmRtYSwNCj4gPiAg CQkJY29udGludWU7DQo+ID4gIAkJfQ0KPiA+DQo+ID4gLQkJLyoNCj4gPiAtCQkgKiBUbyBvcHRp bWl6ZSBmb3IgZmV3ZXIgaW9tbXVfdW5tYXAoKSBjYWxscywgZWFjaCBvZiB3aGljaA0KPiA+IC0J CSAqIG1heSByZXF1aXJlIGhhcmR3YXJlIGNhY2hlIGZsdXNoaW5nLCB0cnkgdG8gZmluZCB0aGUN Cj4gPiAtCQkgKiBsYXJnZXN0IGNvbnRpZ3VvdXMgcGh5c2ljYWwgbWVtb3J5IGNodW5rIHRvIHVu bWFwLg0KPiA+IC0JCSAqLw0KPiA+IC0JCWZvciAobGVuID0gUEFHRV9TSVpFOw0KPiA+IC0JCSAg ICAgIWRvbWFpbi0+ZmdzcCAmJiBpb3ZhICsgbGVuIDwgZW5kOyBsZW4gKz0gUEFHRV9TSVpFKSB7 DQo+ID4gLQkJCW5leHQgPSBpb21tdV9pb3ZhX3RvX3BoeXMoZG9tYWluLT5kb21haW4sIGlvdmEg KyBsZW4pOw0KPiA+IC0JCQlpZiAobmV4dCAhPSBwaHlzICsgbGVuKQ0KPiA+IC0JCQkJYnJlYWs7 DQo+ID4gKwkJaWYgKGlzX2h1Z2V0bGJwYWdlKChwaHlzID4+IFBBR0VfU0hJRlQpLCAmdHlwZSkN Cj4gPiArCQkgICAgJiYgKCFkb21haW4tPmZnc3ApKSB7DQo+IA0KPiBSZXZlcnNlIHRoZSBvcmRl ciBvZiB0aGVzZSB0ZXN0cy4NCj4gDQpPSywgSSB3aWxsIGZpeCB0aGlzIHByb2JsZW0NCg0KDQo+ ID4gKwkJCXVuc2lnbmVkIGxvbmcgaHVnZXRsYl9yZXNkdWFsX25wYWdlID0gMDsNCj4gPiArCQkJ dW5zaWduZWQgbG9uZyBjb250aWd1b3VzX25wYWdlID0gMDsNCj4gDQo+IA0KPiBVbm5lY2Vzc2Fy eS4uLg0KPiANCg0KWWVzLCBJIHdpbGwgZml4IHRoaXMgcHJvYmxlbQ0KDQo+ID4gKwkJCWh1Z2V0 bGJfcmVzZHVhbF9ucGFnZSA9DQo+ID4gKwkJCQlodWdldGxiX2dldF9yZXNkdWFsX3BhZ2VzKGlv dmEgJiB+KFBBR0VfU0laRSAtIDEpLCB0eXBlKTsNCj4gDQo+IFBBR0VfTUFTSw0KPiANCg0KWWVz LCBJIHdpbGwgZml4IHRoaXMgcHJvYmxlbQ0KDQoNCj4gPiArCQkJLyoNCj4gPiArCQkJICogVGhl IG51bWJlciBvZiBjb250aWd1b3VzIHBhZ2UgY2FuIG5vdCBiZSBsYXJnZXIgdGhhbg0KPiBkbWEt PnNpemUNCj4gPiArCQkJICogd2hpY2ggaXMgdGhlIG51bWJlciBvZiBwYWdlcyBwaW5uZWQuDQo+ ID4gKwkJCSAqLw0KPiA+ICsJCQljb250aWd1b3VzX25wYWdlID0gKChkbWEtPnNpemUgPj4gUEFH RV9TSElGVCkgPg0KPiBodWdldGxiX3Jlc2R1YWxfbnBhZ2UpID8NCj4gPiArCQkJCWh1Z2V0bGJf cmVzZHVhbF9ucGFnZSA6IChkbWEtPnNpemUgPj4gUEFHRV9TSElGVCk7DQo+IA0KPiBtaW4oKQ0K PiANCg0KDQpZZXMsIG1pbiBpcyBiZXR0ZXINCj4gPiArDQo+ID4gKwkJCWxlbiA9IGNvbnRpZ3Vv dXNfbnBhZ2UgKiBQQUdFX1NJWkU7DQo+ID4gKwkJfSBlbHNlIHsNCj4gPiArCQkJLyoNCj4gPiAr CQkJICogVG8gb3B0aW1pemUgZm9yIGZld2VyIGlvbW11X3VubWFwKCkgY2FsbHMsIGVhY2ggb2Yg d2hpY2gNCj4gPiArCQkJICogbWF5IHJlcXVpcmUgaGFyZHdhcmUgY2FjaGUgZmx1c2hpbmcsIHRy eSB0byBmaW5kIHRoZQ0KPiA+ICsJCQkgKiBsYXJnZXN0IGNvbnRpZ3VvdXMgcGh5c2ljYWwgbWVt b3J5IGNodW5rIHRvIHVubWFwLg0KPiA+ICsJCQkgKi8NCj4gPiArCQkJZm9yIChsZW4gPSBQQUdF X1NJWkU7DQo+ID4gKwkJCSAgICAgIWRvbWFpbi0+ZmdzcCAmJiBpb3ZhICsgbGVuIDwgZW5kOyBs ZW4gKz0gUEFHRV9TSVpFKSB7DQo+ID4gKwkJCQluZXh0ID0gaW9tbXVfaW92YV90b19waHlzKGRv bWFpbi0+ZG9tYWluLCBpb3ZhICsgbGVuKTsNCj4gPiArCQkJCWlmIChuZXh0ICE9IHBoeXMgKyBs ZW4pDQo+ID4gKwkJCQkJYnJlYWs7DQo+ID4gKwkJCX0NCj4gPiAgCQl9DQo+ID4NCj4gPiAgCQkv Kg0KPiA+IGRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3ZmaW8uaCBiL2luY2x1ZGUvbGludXgv dmZpby5oIGluZGV4IA0KPiA+IDM4ZDNjNmE4ZC4uOTFlZjIwNThmIDEwMDY0NA0KPiA+IC0tLSBh L2luY2x1ZGUvbGludXgvdmZpby5oDQo+ID4gKysrIGIvaW5jbHVkZS9saW51eC92ZmlvLmgNCj4g PiBAQCAtMjE0LDQgKzIxNCwyNCBAQCBleHRlcm4gaW50IHZmaW9fdmlycWZkX2VuYWJsZSh2b2lk ICpvcGFxdWUsDQo+ID4gIAkJCSAgICAgIHZvaWQgKmRhdGEsIHN0cnVjdCB2aXJxZmQgKipwdmly cWZkLCBpbnQgZmQpOyAgZXh0ZXJuIHZvaWQgDQo+ID4gdmZpb192aXJxZmRfZGlzYWJsZShzdHJ1 Y3QgdmlycWZkICoqcHZpcnFmZCk7DQo+ID4NCj4gPiArZW51bSB2ZmlvX2h1Z2V0bGJwYWdlX3R5 cGUgew0KPiA+ICsJdmZpb19odWdldGxicGFnZV8yTSwNCj4gPiArCXZmaW9faHVnZXRsYnBhZ2Vf MUcsDQo+ID4gK307DQo+ID4gKw0KPiA+ICtzdHJ1Y3QgdmZpb19odXBldGxicGFnZV9pbmZvIHsN Cj4gPiArCWVudW0gdmZpb19odWdldGxicGFnZV90eXBlIHR5cGU7DQo+IA0KPiBUaGUgZW51bSB3 aXRoaW4gdGhlIHN0cnVjdHVyZSBzZXJ2ZXMgbm8gcHVycG9zZS4NCj4gDQoNClllcywgSSB3aWxs IGRlbGV0ZSBpdA0KDQoNCj4gPiArCXVuc2lnbmVkIGxvbmcgc2l6ZTsNCj4gPiArCXVuc2lnbmVk IGxvbmcgbWFzazsNCj4gPiArfTsNCj4gPiArDQo+ID4gKyNkZWZpbmUgUE1EX09SREVSIDkNCj4g PiArI2RlZmluZSBQVURfT1JERVIgMTgNCj4gDQo+IEFyY2hpdGVjdHVyZSBzcGVjaWZpYy4NCj4g DQoNCkkgd2lsbCB1c2UgY29tcG91bmRfb3JkZXIoKQ0KDQo+ID4gKy8qDQo+ID4gKyAqIGdldCB0 aGUgbnVtYmVyIG9mIHJlc2R1YWwgNEtCLXBhZ2VzIGluIGEgaHVnZXRsYmZzIHBhZ2UNCj4gPiAr ICogKGluY2x1ZGluZyB0aGUgcGFnZSB3aGljaCBwb2ludGVkIGJ5IHRoaXMgYWRkcmVzcykNCj4g DQo+IHMvNEtCL1BBR0VfU0laRS8NCj4gDQoNClllcywgSSB3aWxsIGZpeCB0aGlzIHByb2JsZW0N Cg0KDQo+ID4gKyAqLw0KPiA+ICsjZGVmaW5lIGh1Z2V0bGJfZ2V0X3Jlc2R1YWxfcGFnZXMoYWRk cmVzcywgdHlwZSkJCQkJXA0KPiA+ICsJCSgodmZpb19odWdldGxicGFnZV9pbmZvW3R5cGVdLnNp emUJCQkJXA0KPiA+ICsJCS0gKGFkZHJlc3MgJiB+dmZpb19odWdldGxicGFnZV9pbmZvW3R5cGVd Lm1hc2spKSA+PiBQQUdFX1NISUZUKQ0KPiA+ICAjZW5kaWYgLyogVkZJT19IICovDQoNCg==