From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id BE224C352AA for ; Mon, 9 May 2022 01:29:52 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235684AbiEIBb4 (ORCPT ); Sun, 8 May 2022 21:31:56 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:53590 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236282AbiEIBWR (ORCPT ); Sun, 8 May 2022 21:22:17 -0400 Received: from out30-54.freemail.mail.aliyun.com (out30-54.freemail.mail.aliyun.com [115.124.30.54]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2F044DEAA; Sun, 8 May 2022 18:18:24 -0700 (PDT) X-Alimail-AntiSpam: AC=PASS;BC=-1|-1;BR=01201311R201e4;CH=green;DM=||false|;DS=||;FP=0|-1|-1|-1|0|-1|-1|-1;HT=e01e01424;MF=baolin.wang@linux.alibaba.com;NM=1;PH=DS;RN=12;SR=0;TI=SMTPD_---0VCc6ZLn_1652059099; Received: from 30.32.96.14(mailfrom:baolin.wang@linux.alibaba.com fp:SMTPD_---0VCc6ZLn_1652059099) by smtp.aliyun-inc.com(127.0.0.1); Mon, 09 May 2022 09:18:20 +0800 Message-ID: <5e33cf5e-2c48-89fe-3447-2f29c7844928@linux.alibaba.com> Date: Mon, 9 May 2022 09:19:00 +0800 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Thunderbird/91.8.1 Subject: Re: [RFC PATCH 1/3] arm64/hugetlb: Introduce new huge_ptep_get_access_flags() interface To: nh26223@qq.com, catalin.marinas@arm.com, will@kernel.org, arnd@arndb.de, mike.kravetz@oracle.com, akpm@linux-foundation.org, sj@kernel.org Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org References: From: Baolin Wang In-Reply-To: Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 5/8/2022 9:14 PM, nh26223@qq.com wrote: > On 2022年5月8日星期日 CST 下午4:58:52 Baolin Wang wrote: >> Now we use huge_ptep_get() to get the pte value of a hugetlb page, >> however it will only return one specific pte value for the CONT-PTE >> or CONT-PMD size hugetlb on ARM64 system, which can contain seravel >> continuous pte or pmd entries with same page table attributes. And it >> will not take into account the subpages' dirty or young bits of a >> CONT-PTE/PMD size hugetlb page. >> >> So the huge_ptep_get() is inconsistent with huge_ptep_get_and_clear(), >> which already takes account the dirty or young bits for any subpages >> in this CONT-PTE/PMD size hugetlb [1]. Meanwhile we can miss dirty or >> young flags statistics for hugetlb pages with current huge_ptep_get(), >> such as the gather_hugetlb_stats() function. >> >> Thus introduce a new huge_ptep_get_access_flags() interface and define >> an ARM64 specific implementation, that will take into account any subpages' >> dirty or young bits for CONT-PTE/PMD size hugetlb page, for those functions >> that want to check the dirty and young flags of a hugetlb page. >> >> [1] >> https://lore.kernel.org/linux-mm/85bd80b4-b4fd-0d3f-a2e5-149559f2f387@oracl >> e.com/ >> >> Signed-off-by: Baolin Wang >> --- >> arch/arm64/include/asm/hugetlb.h | 2 ++ >> arch/arm64/mm/hugetlbpage.c | 24 ++++++++++++++++++++++++ >> include/asm-generic/hugetlb.h | 7 +++++++ >> 3 files changed, 33 insertions(+) >> >> diff --git a/arch/arm64/include/asm/hugetlb.h >> b/arch/arm64/include/asm/hugetlb.h index 616b2ca..a473544 100644 >> --- a/arch/arm64/include/asm/hugetlb.h >> +++ b/arch/arm64/include/asm/hugetlb.h >> @@ -44,6 +44,8 @@ extern pte_t huge_ptep_clear_flush(struct vm_area_struct >> *vma, #define __HAVE_ARCH_HUGE_PTE_CLEAR >> extern void huge_pte_clear(struct mm_struct *mm, unsigned long addr, >> pte_t *ptep, unsigned long sz); >> +#define __HAVE_ARCH_HUGE_PTEP_GET_ACCESS_FLAGS >> +extern pte_t huge_ptep_get_access_flags(pte_t *ptep, unsigned long sz); >> extern void set_huge_swap_pte_at(struct mm_struct *mm, unsigned long addr, >> pte_t *ptep, pte_t pte, unsigned long > sz); >> #define set_huge_swap_pte_at set_huge_swap_pte_at >> diff --git a/arch/arm64/mm/hugetlbpage.c b/arch/arm64/mm/hugetlbpage.c >> index ca8e65c..ce39699 100644 >> --- a/arch/arm64/mm/hugetlbpage.c >> +++ b/arch/arm64/mm/hugetlbpage.c >> @@ -158,6 +158,30 @@ static inline int num_contig_ptes(unsigned long size, >> size_t *pgsize) return contig_ptes; >> } >> >> +pte_t huge_ptep_get_access_flags(pte_t *ptep, unsigned long sz) > The function name looks to me that it returns access flags of PTE. Yes, not a good name. That's why this is a RFC patch set to get more suggestion :) Maybe huge_ptep_get_with_access_flags()? or do you have some better idea? > >> +{ >> + int ncontig, i; >> + size_t pgsize; >> + pte_t orig_pte = ptep_get(ptep); >> + >> + if (!pte_cont(orig_pte)) >> + return orig_pte; >> + >> + ncontig = num_contig_ptes(sz, &pgsize); >> + >> + for (i = 0; i < ncontig; i++, ptep++) { >> + pte_t pte = ptep_get(ptep); >> + >> + if (pte_dirty(pte)) >> + orig_pte = pte_mkdirty(orig_pte); >> + >> + if (pte_young(pte)) >> + orig_pte = pte_mkyoung(orig_pte); >> + } >> + >> + return orig_pte; >> +} > Not sure whether it's worthy being changed to: > > bool dirty = false, young = false; > > for (i = 0; i < ncontig; i++, ptep++) { > pte_t pte = ptep_get(ptep); > > if (pte_dirty(pte)) > dirty = true; > > if (pte_young(pte)) > young = true; > > if (dirty && young) > break; > } > > if (dirty) > orig_pte = pte_mkdirty(orig_pte); > > if (young) > orig_pte = pte_mkyoung(orit_pte); > > return orig_pte; I followed the same logics in get_clear_flush(), which is more readable I think. Yes, your approach can save some cycles, I can change to use it in next version if arm64 maintainers have no objection. >> + >> /* >> * Changing some bits of contiguous entries requires us to follow a >> * Break-Before-Make approach, breaking the whole contiguous set >> diff --git a/include/asm-generic/hugetlb.h b/include/asm-generic/hugetlb.h >> index a57d667..bb77fb0 100644 >> --- a/include/asm-generic/hugetlb.h >> +++ b/include/asm-generic/hugetlb.h >> @@ -150,6 +150,13 @@ static inline pte_t huge_ptep_get(pte_t *ptep) >> } >> #endif >> >> +#ifndef __HAVE_ARCH_HUGE_PTEP_GET_ACCESS_FLAGS >> +static inline pte_t huge_ptep_get_access_flags(pte_t *ptep, unsigned long >> sz) +{ >> + return ptep_get(ptep); > Should be: > return huge_ptep_get(ptep) ? I don't think so. If no ARCH-specific definition, the huge_ptep_get_access_flags() implementation should be same as huge_ptep_get(). Thanks for your comments. #ifndef __HAVE_ARCH_HUGE_PTEP_GET static inline pte_t huge_ptep_get(pte_t *ptep) { return ptep_get(ptep); } #endif From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id D8355C433F5 for ; Mon, 9 May 2022 01:20:10 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:Content-Type: Content-Transfer-Encoding:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:In-Reply-To:From:References:Cc:To:Subject: MIME-Version:Date:Message-ID:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=7VEdav07IW1/J9y2DoFGqRl60fQkBn7/VJZN/8t2X48=; b=pw/dUatofOaUry E5WjAO2zu0w0LJo1dP+NEqY+gBrc+oVtkilG8S8A0A6CquihYX9KsMNpVv8I2aion+oQ1XbP4egP6 1eSquTIuPnzC4JhhBJQZWj52vRNj0MgbXa5da8AbbHZ3aVW8rD/OQLH53sd/is5WcCdDhKP+Qnwci bWmwcehjKiDsVew2WrrpIi4o87FFcvYMEgiu9kiS0nxLqIPpCQsljsEjDc26haDbx0PoeMybI1kI8 e7lOaPohoo0uiXyusEPymOpsMOMuPmt6WF0r4IgFCK4YFvQ8uUV0/1zMcOKrbQvcTVO7KMhJiGypg 5K7OWVNJ+JiR5gK8VG0Q==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1nns2i-00BvDV-Ge; Mon, 09 May 2022 01:18:32 +0000 Received: from out30-133.freemail.mail.aliyun.com ([115.124.30.133]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1nns2d-00BvCM-On for linux-arm-kernel@lists.infradead.org; Mon, 09 May 2022 01:18:30 +0000 X-Alimail-AntiSpam: AC=PASS; BC=-1|-1; BR=01201311R201e4; CH=green; DM=||false|; DS=||; FP=0|-1|-1|-1|0|-1|-1|-1; HT=e01e01424; MF=baolin.wang@linux.alibaba.com; NM=1; PH=DS; RN=12; SR=0; TI=SMTPD_---0VCc6ZLn_1652059099; Received: from 30.32.96.14(mailfrom:baolin.wang@linux.alibaba.com fp:SMTPD_---0VCc6ZLn_1652059099) by smtp.aliyun-inc.com(127.0.0.1); Mon, 09 May 2022 09:18:20 +0800 Message-ID: <5e33cf5e-2c48-89fe-3447-2f29c7844928@linux.alibaba.com> Date: Mon, 9 May 2022 09:19:00 +0800 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Thunderbird/91.8.1 Subject: Re: [RFC PATCH 1/3] arm64/hugetlb: Introduce new huge_ptep_get_access_flags() interface To: nh26223@qq.com, catalin.marinas@arm.com, will@kernel.org, arnd@arndb.de, mike.kravetz@oracle.com, akpm@linux-foundation.org, sj@kernel.org Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org References: From: Baolin Wang In-Reply-To: X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220508_181828_019276_565629AA X-CRM114-Status: GOOD ( 23.11 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org CgpPbiA1LzgvMjAyMiA5OjE0IFBNLCBuaDI2MjIzQHFxLmNvbSB3cm90ZToKPiBPbiAyMDIy5bm0 NeaciDjml6XmmJ/mnJ/ml6UgQ1NUIOS4i+WNiDQ6NTg6NTIgQmFvbGluIFdhbmcgd3JvdGU6Cj4+ IE5vdyB3ZSB1c2UgaHVnZV9wdGVwX2dldCgpIHRvIGdldCB0aGUgcHRlIHZhbHVlIG9mIGEgaHVn ZXRsYiBwYWdlLAo+PiBob3dldmVyIGl0IHdpbGwgb25seSByZXR1cm4gb25lIHNwZWNpZmljIHB0 ZSB2YWx1ZSBmb3IgdGhlIENPTlQtUFRFCj4+IG9yIENPTlQtUE1EIHNpemUgaHVnZXRsYiBvbiBB Uk02NCBzeXN0ZW0sIHdoaWNoIGNhbiBjb250YWluIHNlcmF2ZWwKPj4gY29udGludW91cyBwdGUg b3IgcG1kIGVudHJpZXMgd2l0aCBzYW1lIHBhZ2UgdGFibGUgYXR0cmlidXRlcy4gQW5kIGl0Cj4+ IHdpbGwgbm90IHRha2UgaW50byBhY2NvdW50IHRoZSBzdWJwYWdlcycgZGlydHkgb3IgeW91bmcg Yml0cyBvZiBhCj4+IENPTlQtUFRFL1BNRCBzaXplIGh1Z2V0bGIgcGFnZS4KPj4KPj4gU28gdGhl IGh1Z2VfcHRlcF9nZXQoKSBpcyBpbmNvbnNpc3RlbnQgd2l0aCBodWdlX3B0ZXBfZ2V0X2FuZF9j bGVhcigpLAo+PiB3aGljaCBhbHJlYWR5IHRha2VzIGFjY291bnQgdGhlIGRpcnR5IG9yIHlvdW5n IGJpdHMgZm9yIGFueSBzdWJwYWdlcwo+PiBpbiB0aGlzIENPTlQtUFRFL1BNRCBzaXplIGh1Z2V0 bGIgWzFdLiBNZWFud2hpbGUgd2UgY2FuIG1pc3MgZGlydHkgb3IKPj4geW91bmcgZmxhZ3Mgc3Rh dGlzdGljcyBmb3IgaHVnZXRsYiBwYWdlcyB3aXRoIGN1cnJlbnQgaHVnZV9wdGVwX2dldCgpLAo+ PiBzdWNoIGFzIHRoZSBnYXRoZXJfaHVnZXRsYl9zdGF0cygpIGZ1bmN0aW9uLgo+Pgo+PiBUaHVz IGludHJvZHVjZSBhIG5ldyBodWdlX3B0ZXBfZ2V0X2FjY2Vzc19mbGFncygpIGludGVyZmFjZSBh bmQgZGVmaW5lCj4+IGFuIEFSTTY0IHNwZWNpZmljIGltcGxlbWVudGF0aW9uLCB0aGF0IHdpbGwg dGFrZSBpbnRvIGFjY291bnQgYW55IHN1YnBhZ2VzJwo+PiBkaXJ0eSBvciB5b3VuZyBiaXRzIGZv ciBDT05ULVBURS9QTUQgc2l6ZSBodWdldGxiIHBhZ2UsIGZvciB0aG9zZSBmdW5jdGlvbnMKPj4g dGhhdCB3YW50IHRvIGNoZWNrIHRoZSBkaXJ0eSBhbmQgeW91bmcgZmxhZ3Mgb2YgYSBodWdldGxi IHBhZ2UuCj4+Cj4+IFsxXQo+PiBodHRwczovL2xvcmUua2VybmVsLm9yZy9saW51eC1tbS84NWJk ODBiNC1iNGZkLTBkM2YtYTJlNS0xNDk1NTlmMmYzODdAb3JhY2wKPj4gZS5jb20vCj4+Cj4+IFNp Z25lZC1vZmYtYnk6IEJhb2xpbiBXYW5nIDxiYW9saW4ud2FuZ0BsaW51eC5hbGliYWJhLmNvbT4K Pj4gLS0tCj4+ICAgYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9odWdldGxiLmggfCAgMiArKwo+PiAg IGFyY2gvYXJtNjQvbW0vaHVnZXRsYnBhZ2UuYyAgICAgIHwgMjQgKysrKysrKysrKysrKysrKysr KysrKysrCj4+ICAgaW5jbHVkZS9hc20tZ2VuZXJpYy9odWdldGxiLmggICAgfCAgNyArKysrKysr Cj4+ICAgMyBmaWxlcyBjaGFuZ2VkLCAzMyBpbnNlcnRpb25zKCspCj4+Cj4+IGRpZmYgLS1naXQg YS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2h1Z2V0bGIuaAo+PiBiL2FyY2gvYXJtNjQvaW5jbHVk ZS9hc20vaHVnZXRsYi5oIGluZGV4IDYxNmIyY2EuLmE0NzM1NDQgMTAwNjQ0Cj4+IC0tLSBhL2Fy Y2gvYXJtNjQvaW5jbHVkZS9hc20vaHVnZXRsYi5oCj4+ICsrKyBiL2FyY2gvYXJtNjQvaW5jbHVk ZS9hc20vaHVnZXRsYi5oCj4+IEBAIC00NCw2ICs0NCw4IEBAIGV4dGVybiBwdGVfdCBodWdlX3B0 ZXBfY2xlYXJfZmx1c2goc3RydWN0IHZtX2FyZWFfc3RydWN0Cj4+ICp2bWEsICNkZWZpbmUgX19I QVZFX0FSQ0hfSFVHRV9QVEVfQ0xFQVIKPj4gICBleHRlcm4gdm9pZCBodWdlX3B0ZV9jbGVhcihz dHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLAo+PiAgIAkJCSAgIHB0ZV90 ICpwdGVwLCB1bnNpZ25lZCBsb25nIHN6KTsKPj4gKyNkZWZpbmUgX19IQVZFX0FSQ0hfSFVHRV9Q VEVQX0dFVF9BQ0NFU1NfRkxBR1MKPj4gK2V4dGVybiBwdGVfdCBodWdlX3B0ZXBfZ2V0X2FjY2Vz c19mbGFncyhwdGVfdCAqcHRlcCwgdW5zaWduZWQgbG9uZyBzeik7Cj4+ICAgZXh0ZXJuIHZvaWQg c2V0X2h1Z2Vfc3dhcF9wdGVfYXQoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcg YWRkciwKPj4gICAJCQkJIHB0ZV90ICpwdGVwLCBwdGVfdCBwdGUsIHVuc2lnbmVkIGxvbmcKPiBz eik7Cj4+ICAgI2RlZmluZSBzZXRfaHVnZV9zd2FwX3B0ZV9hdCBzZXRfaHVnZV9zd2FwX3B0ZV9h dAo+PiBkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9tbS9odWdldGxicGFnZS5jIGIvYXJjaC9hcm02 NC9tbS9odWdldGxicGFnZS5jCj4+IGluZGV4IGNhOGU2NWMuLmNlMzk2OTkgMTAwNjQ0Cj4+IC0t LSBhL2FyY2gvYXJtNjQvbW0vaHVnZXRsYnBhZ2UuYwo+PiArKysgYi9hcmNoL2FybTY0L21tL2h1 Z2V0bGJwYWdlLmMKPj4gQEAgLTE1OCw2ICsxNTgsMzAgQEAgc3RhdGljIGlubGluZSBpbnQgbnVt X2NvbnRpZ19wdGVzKHVuc2lnbmVkIGxvbmcgc2l6ZSwKPj4gc2l6ZV90ICpwZ3NpemUpIHJldHVy biBjb250aWdfcHRlczsKPj4gICB9Cj4+Cj4+ICtwdGVfdCBodWdlX3B0ZXBfZ2V0X2FjY2Vzc19m bGFncyhwdGVfdCAqcHRlcCwgdW5zaWduZWQgbG9uZyBzeikKPiBUaGUgZnVuY3Rpb24gbmFtZSBs b29rcyB0byBtZSB0aGF0IGl0IHJldHVybnMgYWNjZXNzIGZsYWdzIG9mIFBURS4KClllcywgbm90 IGEgZ29vZCBuYW1lLiBUaGF0J3Mgd2h5IHRoaXMgaXMgYSBSRkMgcGF0Y2ggc2V0IHRvIGdldCBt b3JlIApzdWdnZXN0aW9uIDopCgpNYXliZSBodWdlX3B0ZXBfZ2V0X3dpdGhfYWNjZXNzX2ZsYWdz KCk/IG9yIGRvIHlvdSBoYXZlIHNvbWUgYmV0dGVyIGlkZWE/Cgo+IAo+PiArewo+PiArCWludCBu Y29udGlnLCBpOwo+PiArCXNpemVfdCBwZ3NpemU7Cj4+ICsJcHRlX3Qgb3JpZ19wdGUgPSBwdGVw X2dldChwdGVwKTsKPj4gKwo+PiArCWlmICghcHRlX2NvbnQob3JpZ19wdGUpKQo+PiArCQlyZXR1 cm4gb3JpZ19wdGU7Cj4+ICsKPj4gKwluY29udGlnID0gbnVtX2NvbnRpZ19wdGVzKHN6LCAmcGdz aXplKTsKPj4gKwo+PiArCWZvciAoaSA9IDA7IGkgPCBuY29udGlnOyBpKyssIHB0ZXArKykgewo+ PiArCQlwdGVfdCBwdGUgPSBwdGVwX2dldChwdGVwKTsKPj4gKwo+PiArCQlpZiAocHRlX2RpcnR5 KHB0ZSkpCj4+ICsJCQlvcmlnX3B0ZSA9IHB0ZV9ta2RpcnR5KG9yaWdfcHRlKTsKPj4gKwo+PiAr CQlpZiAocHRlX3lvdW5nKHB0ZSkpCj4+ICsJCQlvcmlnX3B0ZSA9IHB0ZV9ta3lvdW5nKG9yaWdf cHRlKTsKPj4gKwl9Cj4+ICsKPj4gKwlyZXR1cm4gb3JpZ19wdGU7Cj4+ICt9Cj4gTm90IHN1cmUg d2hldGhlciBpdCdzIHdvcnRoeSBiZWluZyBjaGFuZ2VkIHRvOgo+IAo+ICAgICAgICAgIGJvb2wg ZGlydHkgPSBmYWxzZSwgeW91bmcgPSBmYWxzZTsKPiAKPiAgICAgICAgICBmb3IgKGkgPSAwOyBp IDwgbmNvbnRpZzsgaSsrLCBwdGVwKyspIHsKPiAgICAgICAgICAgICAgICAgIHB0ZV90IHB0ZSA9 IHB0ZXBfZ2V0KHB0ZXApOwo+IAo+ICAgICAgICAgICAgICAgICAgaWYgKHB0ZV9kaXJ0eShwdGUp KQo+ICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJ0eSA9IHRydWU7Cj4gCj4gICAgICAgICAg ICAgICAgICBpZiAocHRlX3lvdW5nKHB0ZSkpCj4gICAgICAgICAgICAgICAgICAgICAgICAgIHlv dW5nID0gdHJ1ZTsKPiAKPiAgICAgICAgICAgICAgICAgIGlmIChkaXJ0eSAmJiB5b3VuZykKPiAg ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Cj4gICAgICAgICAgfQo+IAo+ICAgICAgICAg IGlmIChkaXJ0eSkKPiAgICAgICAgICAgICAgICAgIG9yaWdfcHRlID0gcHRlX21rZGlydHkob3Jp Z19wdGUpOwo+IAo+ICAgICAgICAgIGlmICh5b3VuZykKPiAgICAgICAgICAgICAgICAgIG9yaWdf cHRlID0gcHRlX21reW91bmcob3JpdF9wdGUpOwo+IAo+ICAgICAgICAgIHJldHVybiBvcmlnX3B0 ZTsKCkkgZm9sbG93ZWQgdGhlIHNhbWUgbG9naWNzIGluIGdldF9jbGVhcl9mbHVzaCgpLCB3aGlj aCBpcyBtb3JlIHJlYWRhYmxlIApJIHRoaW5rLiBZZXMsIHlvdXIgYXBwcm9hY2ggY2FuIHNhdmUg c29tZSBjeWNsZXMsIEkgY2FuIGNoYW5nZSB0byB1c2UgaXQgCmluIG5leHQgdmVyc2lvbiBpZiBh cm02NCBtYWludGFpbmVycyBoYXZlIG5vIG9iamVjdGlvbi4KCj4+ICsKPj4gICAvKgo+PiAgICAq IENoYW5naW5nIHNvbWUgYml0cyBvZiBjb250aWd1b3VzIGVudHJpZXMgcmVxdWlyZXMgdXMgdG8g Zm9sbG93IGEKPj4gICAgKiBCcmVhay1CZWZvcmUtTWFrZSBhcHByb2FjaCwgYnJlYWtpbmcgdGhl IHdob2xlIGNvbnRpZ3VvdXMgc2V0Cj4+IGRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmlj L2h1Z2V0bGIuaCBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvaHVnZXRsYi5oCj4+IGluZGV4IGE1N2Q2 NjcuLmJiNzdmYjAgMTAwNjQ0Cj4+IC0tLSBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvaHVnZXRsYi5o Cj4+ICsrKyBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvaHVnZXRsYi5oCj4+IEBAIC0xNTAsNiArMTUw LDEzIEBAIHN0YXRpYyBpbmxpbmUgcHRlX3QgaHVnZV9wdGVwX2dldChwdGVfdCAqcHRlcCkKPj4g ICB9Cj4+ICAgI2VuZGlmCj4+Cj4+ICsjaWZuZGVmIF9fSEFWRV9BUkNIX0hVR0VfUFRFUF9HRVRf QUNDRVNTX0ZMQUdTCj4+ICtzdGF0aWMgaW5saW5lIHB0ZV90IGh1Z2VfcHRlcF9nZXRfYWNjZXNz X2ZsYWdzKHB0ZV90ICpwdGVwLCB1bnNpZ25lZCBsb25nCj4+IHN6KSArewo+PiArCXJldHVybiBw dGVwX2dldChwdGVwKTsKPiBTaG91bGQgYmU6Cj4gCXJldHVybiBodWdlX3B0ZXBfZ2V0KHB0ZXAp ID8KCkkgZG9uJ3QgdGhpbmsgc28uIElmIG5vIEFSQ0gtc3BlY2lmaWMgZGVmaW5pdGlvbiwgdGhl IApodWdlX3B0ZXBfZ2V0X2FjY2Vzc19mbGFncygpIGltcGxlbWVudGF0aW9uIHNob3VsZCBiZSBz YW1lIGFzIApodWdlX3B0ZXBfZ2V0KCkuIFRoYW5rcyBmb3IgeW91ciBjb21tZW50cy4KCiNpZm5k ZWYgX19IQVZFX0FSQ0hfSFVHRV9QVEVQX0dFVApzdGF0aWMgaW5saW5lIHB0ZV90IGh1Z2VfcHRl cF9nZXQocHRlX3QgKnB0ZXApCnsKICAgICAgICAgcmV0dXJuIHB0ZXBfZ2V0KHB0ZXApOwp9CiNl bmRpZgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbGlu dXgtYXJtLWtlcm5lbCBtYWlsaW5nIGxpc3QKbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRl YWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgt YXJtLWtlcm5lbAo=