From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 1DBC51CAA8 for ; Wed, 22 Nov 2023 09:22:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=arm.com Authentication-Results: smtp.subspace.kernel.org; dkim=none Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 42BE01595; Wed, 22 Nov 2023 01:23:32 -0800 (PST) Received: from arm.com (e121798.cambridge.arm.com [10.1.197.44]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 3C2073F73F; Wed, 22 Nov 2023 01:22:41 -0800 (PST) Date: Wed, 22 Nov 2023 09:22:38 +0000 From: Alexandru Elisei To: Peter Collingbourne Cc: catalin.marinas@arm.com, will@kernel.org, oliver.upton@linux.dev, maz@kernel.org, james.morse@arm.com, suzuki.poulose@arm.com, yuzenghui@huawei.com, arnd@arndb.de, akpm@linux-foundation.org, mingo@redhat.com, peterz@infradead.org, juri.lelli@redhat.com, vincent.guittot@linaro.org, dietmar.eggemann@arm.com, rostedt@goodmis.org, bsegall@google.com, mgorman@suse.de, bristot@redhat.com, vschneid@redhat.com, mhiramat@kernel.org, rppt@kernel.org, hughd@google.com, steven.price@arm.com, anshuman.khandual@arm.com, vincenzo.frascino@arm.com, david@redhat.com, eugenis@google.com, kcc@google.com, hyesoo.yu@samsung.com, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, kvmarm@lists.linux.dev, linux-fsdevel@vger.kernel.org, linux-arch@vger.kernel.org, linux-mm@kvack.org, linux-trace-kernel@vger.kernel.org Subject: Re: [PATCH RFC v2 20/27] mm: hugepage: Handle huge page fault on access Message-ID: References: <20231119165721.9849-1-alexandru.elisei@arm.com> <20231119165721.9849-21-alexandru.elisei@arm.com> Precedence: bulk X-Mailing-List: kvmarm@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: Hi Peter, On Tue, Nov 21, 2023 at 05:28:49PM -0800, Peter Collingbourne wrote: > On Sun, Nov 19, 2023 at 8:59 AM Alexandru Elisei > wrote: > > > > Handle PAGE_FAULT_ON_ACCESS faults for huge pages in a similar way to > > regular pages. > > > > Signed-off-by: Alexandru Elisei > > --- > > arch/arm64/include/asm/mte_tag_storage.h | 1 + > > arch/arm64/include/asm/pgtable.h | 7 ++ > > arch/arm64/mm/fault.c | 81 ++++++++++++++++++++++++ > > include/linux/huge_mm.h | 2 + > > include/linux/pgtable.h | 5 ++ > > mm/huge_memory.c | 4 +- > > mm/memory.c | 3 + > > 7 files changed, 101 insertions(+), 2 deletions(-) > > > > diff --git a/arch/arm64/include/asm/mte_tag_storage.h b/arch/arm64/include/asm/mte_tag_storage.h > > index c70ced60a0cd..b97406d369ce 100644 > > --- a/arch/arm64/include/asm/mte_tag_storage.h > > +++ b/arch/arm64/include/asm/mte_tag_storage.h > > @@ -35,6 +35,7 @@ void free_tag_storage(struct page *page, int order); > > bool page_tag_storage_reserved(struct page *page); > > > > vm_fault_t handle_page_missing_tag_storage(struct vm_fault *vmf); > > +vm_fault_t handle_huge_page_missing_tag_storage(struct vm_fault *vmf); > > #else > > static inline bool tag_storage_enabled(void) > > { > > diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h > > index 8cc135f1c112..1704411c096d 100644 > > --- a/arch/arm64/include/asm/pgtable.h > > +++ b/arch/arm64/include/asm/pgtable.h > > @@ -477,6 +477,13 @@ static inline vm_fault_t arch_do_page_fault_on_access(struct vm_fault *vmf) > > return handle_page_missing_tag_storage(vmf); > > return VM_FAULT_SIGBUS; > > } > > + > > +static inline vm_fault_t arch_do_huge_page_fault_on_access(struct vm_fault *vmf) > > +{ > > + if (tag_storage_enabled()) > > + return handle_huge_page_missing_tag_storage(vmf); > > + return VM_FAULT_SIGBUS; > > +} > > #endif /* CONFIG_ARCH_HAS_FAULT_ON_ACCESS */ > > > > #define pmd_present_invalid(pmd) (!!(pmd_val(pmd) & PMD_PRESENT_INVALID)) > > diff --git a/arch/arm64/mm/fault.c b/arch/arm64/mm/fault.c > > index f5fa583acf18..6730a0812a24 100644 > > --- a/arch/arm64/mm/fault.c > > +++ b/arch/arm64/mm/fault.c > > @@ -1041,6 +1041,87 @@ vm_fault_t handle_page_missing_tag_storage(struct vm_fault *vmf) > > > > return 0; > > > > +out_retry: > > + put_page(page); > > + if (vmf->flags & FAULT_FLAG_VMA_LOCK) > > + vma_end_read(vma); > > + if (fault_flag_allow_retry_first(vmf->flags)) { > > + err = VM_FAULT_RETRY; > > + } else { > > + /* Replay the fault. */ > > + err = 0; > > + } > > + return err; > > +} > > + > > +vm_fault_t handle_huge_page_missing_tag_storage(struct vm_fault *vmf) > > +{ > > + unsigned long haddr = vmf->address & HPAGE_PMD_MASK; > > + struct vm_area_struct *vma = vmf->vma; > > + pmd_t old_pmd, new_pmd; > > + bool writable = false; > > + struct page *page; > > + vm_fault_t err; > > + int ret; > > + > > + vmf->ptl = pmd_lock(vma->vm_mm, vmf->pmd); > > + if (unlikely(!pmd_same(vmf->orig_pmd, *vmf->pmd))) { > > + spin_unlock(vmf->ptl); > > + return 0; > > + } > > + > > + old_pmd = vmf->orig_pmd; > > + new_pmd = pmd_modify(old_pmd, vma->vm_page_prot); > > + > > + /* > > + * Detect now whether the PMD could be writable; this information > > + * is only valid while holding the PT lock. > > + */ > > + writable = pmd_write(new_pmd); > > + if (!writable && vma_wants_manual_pte_write_upgrade(vma) && > > + can_change_pmd_writable(vma, vmf->address, new_pmd)) > > + writable = true; > > + > > + page = vm_normal_page_pmd(vma, haddr, new_pmd); > > + if (!page) > > + goto out_map; > > + > > + if (!(vma->vm_flags & VM_MTE)) > > + goto out_map; > > + > > + get_page(page); > > + vma_set_access_pid_bit(vma); > > + > > + spin_unlock(vmf->ptl); > > + writable = false; > > + > > + if (unlikely(is_migrate_isolate_page(page))) > > + goto out_retry; > > + > > + ret = reserve_tag_storage(page, HPAGE_PMD_ORDER, GFP_HIGHUSER_MOVABLE); > > + if (ret) > > + goto out_retry; > > + > > + put_page(page); > > + > > + vmf->ptl = pmd_lock(vma->vm_mm, vmf->pmd); > > + if (unlikely(!pmd_same(old_pmd, *vmf->pmd))) { > > + spin_unlock(vmf->ptl); > > + return 0; > > + } > > + > > +out_map: > > + /* Restore the PMD */ > > + new_pmd = pmd_modify(old_pmd, vma->vm_page_prot); > > + new_pmd = pmd_mkyoung(new_pmd); > > + if (writable) > > + new_pmd = pmd_mkwrite(new_pmd, vma); > > + set_pmd_at(vma->vm_mm, haddr, vmf->pmd, new_pmd); > > + update_mmu_cache_pmd(vma, vmf->address, vmf->pmd); > > + spin_unlock(vmf->ptl); > > + > > + return 0; > > + > > out_retry: > > put_page(page); > > if (vmf->flags & FAULT_FLAG_VMA_LOCK) > > diff --git a/include/linux/huge_mm.h b/include/linux/huge_mm.h > > index fa0350b0812a..bb84291f9231 100644 > > --- a/include/linux/huge_mm.h > > +++ b/include/linux/huge_mm.h > > @@ -36,6 +36,8 @@ bool move_huge_pmd(struct vm_area_struct *vma, unsigned long old_addr, > > int change_huge_pmd(struct mmu_gather *tlb, struct vm_area_struct *vma, > > pmd_t *pmd, unsigned long addr, pgprot_t newprot, > > unsigned long cp_flags); > > +bool can_change_pmd_writable(struct vm_area_struct *vma, unsigned long addr, > > + pmd_t pmd); > > > > vm_fault_t vmf_insert_pfn_pmd(struct vm_fault *vmf, pfn_t pfn, bool write); > > vm_fault_t vmf_insert_pfn_pud(struct vm_fault *vmf, pfn_t pfn, bool write); > > diff --git a/include/linux/pgtable.h b/include/linux/pgtable.h > > index e2c761dd6c41..de45f475bf8d 100644 > > --- a/include/linux/pgtable.h > > +++ b/include/linux/pgtable.h > > @@ -1473,6 +1473,11 @@ static inline vm_fault_t arch_do_page_fault_on_access(struct vm_fault *vmf) > > { > > return VM_FAULT_SIGBUS; > > } > > + > > +static inline vm_fault_t arch_do_huge_page_fault_on_access(struct vm_fault *vmf) > > +{ > > + return VM_FAULT_SIGBUS; > > +} > > #endif > > > > #endif /* CONFIG_MMU */ > > diff --git a/mm/huge_memory.c b/mm/huge_memory.c > > index 9beead961a65..d1402b43ea39 100644 > > --- a/mm/huge_memory.c > > +++ b/mm/huge_memory.c > > @@ -1406,8 +1406,8 @@ vm_fault_t do_huge_pmd_wp_page(struct vm_fault *vmf) > > return VM_FAULT_FALLBACK; > > } > > > > -static inline bool can_change_pmd_writable(struct vm_area_struct *vma, > > - unsigned long addr, pmd_t pmd) > > +inline bool can_change_pmd_writable(struct vm_area_struct *vma, > > Remove inline keyword here. Indeed, as it does nothing now that the function is not static. Thanks, Alex > > Peter > > > + unsigned long addr, pmd_t pmd) > > { > > struct page *page; > > > > diff --git a/mm/memory.c b/mm/memory.c > > index a04a971200b9..46b926625503 100644 > > --- a/mm/memory.c > > +++ b/mm/memory.c > > @@ -5168,6 +5168,9 @@ static vm_fault_t __handle_mm_fault(struct vm_area_struct *vma, > > return 0; > > } > > if (pmd_trans_huge(vmf.orig_pmd) || pmd_devmap(vmf.orig_pmd)) { > > + if (fault_on_access_pmd(vmf.orig_pmd) && vma_is_accessible(vma)) > > + return arch_do_huge_page_fault_on_access(&vmf); > > + > > if (pmd_protnone(vmf.orig_pmd) && vma_is_accessible(vma)) > > return do_huge_pmd_numa_page(&vmf); > > > > -- > > 2.42.1 > > 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 89E3BC61D9B for ; Wed, 22 Nov 2023 09:23:15 +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-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References: Message-ID:Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=z99UUpGx+klsqoC+Fov3J8zApTr+Akqx8m1549J3n4k=; b=xloQvlo276ufNb sZ0Epaz8MI8yPWRdKKeWh+VOUwxcWOb2R/ksK6NWMG6lN5SoaGKtr2CXsU2wO4OJwinbt5nyccFKA 1AvGGFzYGtYIt69tmBcIdGsNaGGht2ybcqyZbGs/cJCfvdJNq4HydfEp6QOps1sfGsPiKdtmlr/sm IDNhbB3xyxfkgU5F/Ug4+IzoTtOWX7OkXO586dswCkDTHzA1mpk9tiqFbMSLCbKz5zBCd/dnTb9P9 br1FqHTYdY+Yh8UiwtoQnfEEzoM5M1RlZ1MPEx0pN4mfr8WmYhpC3Uf1YW9KA8Yh/Ih0AgZxvnZAp OeP/YQ8aKr8CNEtvaiKQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1r5jRY-001By8-1g; Wed, 22 Nov 2023 09:22:48 +0000 Received: from foss.arm.com ([217.140.110.172]) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1r5jRW-001BxE-0W for linux-arm-kernel@lists.infradead.org; Wed, 22 Nov 2023 09:22:47 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 42BE01595; Wed, 22 Nov 2023 01:23:32 -0800 (PST) Received: from arm.com (e121798.cambridge.arm.com [10.1.197.44]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 3C2073F73F; Wed, 22 Nov 2023 01:22:41 -0800 (PST) Date: Wed, 22 Nov 2023 09:22:38 +0000 From: Alexandru Elisei To: Peter Collingbourne Cc: catalin.marinas@arm.com, will@kernel.org, oliver.upton@linux.dev, maz@kernel.org, james.morse@arm.com, suzuki.poulose@arm.com, yuzenghui@huawei.com, arnd@arndb.de, akpm@linux-foundation.org, mingo@redhat.com, peterz@infradead.org, juri.lelli@redhat.com, vincent.guittot@linaro.org, dietmar.eggemann@arm.com, rostedt@goodmis.org, bsegall@google.com, mgorman@suse.de, bristot@redhat.com, vschneid@redhat.com, mhiramat@kernel.org, rppt@kernel.org, hughd@google.com, steven.price@arm.com, anshuman.khandual@arm.com, vincenzo.frascino@arm.com, david@redhat.com, eugenis@google.com, kcc@google.com, hyesoo.yu@samsung.com, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, kvmarm@lists.linux.dev, linux-fsdevel@vger.kernel.org, linux-arch@vger.kernel.org, linux-mm@kvack.org, linux-trace-kernel@vger.kernel.org Subject: Re: [PATCH RFC v2 20/27] mm: hugepage: Handle huge page fault on access Message-ID: References: <20231119165721.9849-1-alexandru.elisei@arm.com> <20231119165721.9849-21-alexandru.elisei@arm.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20231122_012246_294379_D8CE7798 X-CRM114-Status: GOOD ( 24.26 ) 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-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org SGkgUGV0ZXIsCgpPbiBUdWUsIE5vdiAyMSwgMjAyMyBhdCAwNToyODo0OVBNIC0wODAwLCBQZXRl ciBDb2xsaW5nYm91cm5lIHdyb3RlOgo+IE9uIFN1biwgTm92IDE5LCAyMDIzIGF0IDg6NTnigK9B TSBBbGV4YW5kcnUgRWxpc2VpCj4gPGFsZXhhbmRydS5lbGlzZWlAYXJtLmNvbT4gd3JvdGU6Cj4g Pgo+ID4gSGFuZGxlIFBBR0VfRkFVTFRfT05fQUNDRVNTIGZhdWx0cyBmb3IgaHVnZSBwYWdlcyBp biBhIHNpbWlsYXIgd2F5IHRvCj4gPiByZWd1bGFyIHBhZ2VzLgo+ID4KPiA+IFNpZ25lZC1vZmYt Ynk6IEFsZXhhbmRydSBFbGlzZWkgPGFsZXhhbmRydS5lbGlzZWlAYXJtLmNvbT4KPiA+IC0tLQo+ ID4gIGFyY2gvYXJtNjQvaW5jbHVkZS9hc20vbXRlX3RhZ19zdG9yYWdlLmggfCAgMSArCj4gPiAg YXJjaC9hcm02NC9pbmNsdWRlL2FzbS9wZ3RhYmxlLmggICAgICAgICB8ICA3ICsrCj4gPiAgYXJj aC9hcm02NC9tbS9mYXVsdC5jICAgICAgICAgICAgICAgICAgICB8IDgxICsrKysrKysrKysrKysr KysrKysrKysrKwo+ID4gIGluY2x1ZGUvbGludXgvaHVnZV9tbS5oICAgICAgICAgICAgICAgICAg fCAgMiArCj4gPiAgaW5jbHVkZS9saW51eC9wZ3RhYmxlLmggICAgICAgICAgICAgICAgICB8ICA1 ICsrCj4gPiAgbW0vaHVnZV9tZW1vcnkuYyAgICAgICAgICAgICAgICAgICAgICAgICB8ICA0ICst Cj4gPiAgbW0vbWVtb3J5LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAzICsKPiA+ ICA3IGZpbGVzIGNoYW5nZWQsIDEwMSBpbnNlcnRpb25zKCspLCAyIGRlbGV0aW9ucygtKQo+ID4K PiA+IGRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL210ZV90YWdfc3RvcmFnZS5o IGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9tdGVfdGFnX3N0b3JhZ2UuaAo+ID4gaW5kZXggYzcw Y2VkNjBhMGNkLi5iOTc0MDZkMzY5Y2UgMTAwNjQ0Cj4gPiAtLS0gYS9hcmNoL2FybTY0L2luY2x1 ZGUvYXNtL210ZV90YWdfc3RvcmFnZS5oCj4gPiArKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNt L210ZV90YWdfc3RvcmFnZS5oCj4gPiBAQCAtMzUsNiArMzUsNyBAQCB2b2lkIGZyZWVfdGFnX3N0 b3JhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIGludCBvcmRlcik7Cj4gPiAgYm9vbCBwYWdlX3RhZ19z dG9yYWdlX3Jlc2VydmVkKHN0cnVjdCBwYWdlICpwYWdlKTsKPiA+Cj4gPiAgdm1fZmF1bHRfdCBo YW5kbGVfcGFnZV9taXNzaW5nX3RhZ19zdG9yYWdlKHN0cnVjdCB2bV9mYXVsdCAqdm1mKTsKPiA+ ICt2bV9mYXVsdF90IGhhbmRsZV9odWdlX3BhZ2VfbWlzc2luZ190YWdfc3RvcmFnZShzdHJ1Y3Qg dm1fZmF1bHQgKnZtZik7Cj4gPiAgI2Vsc2UKPiA+ICBzdGF0aWMgaW5saW5lIGJvb2wgdGFnX3N0 b3JhZ2VfZW5hYmxlZCh2b2lkKQo+ID4gIHsKPiA+IGRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2lu Y2x1ZGUvYXNtL3BndGFibGUuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vcGd0YWJsZS5oCj4g PiBpbmRleCA4Y2MxMzVmMWMxMTIuLjE3MDQ0MTFjMDk2ZCAxMDA2NDQKPiA+IC0tLSBhL2FyY2gv YXJtNjQvaW5jbHVkZS9hc20vcGd0YWJsZS5oCj4gPiArKysgYi9hcmNoL2FybTY0L2luY2x1ZGUv YXNtL3BndGFibGUuaAo+ID4gQEAgLTQ3Nyw2ICs0NzcsMTMgQEAgc3RhdGljIGlubGluZSB2bV9m YXVsdF90IGFyY2hfZG9fcGFnZV9mYXVsdF9vbl9hY2Nlc3Moc3RydWN0IHZtX2ZhdWx0ICp2bWYp Cj4gPiAgICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZV9wYWdlX21pc3NpbmdfdGFnX3N0b3Jh Z2Uodm1mKTsKPiA+ICAgICAgICAgcmV0dXJuIFZNX0ZBVUxUX1NJR0JVUzsKPiA+ICB9Cj4gPiAr Cj4gPiArc3RhdGljIGlubGluZSB2bV9mYXVsdF90IGFyY2hfZG9faHVnZV9wYWdlX2ZhdWx0X29u X2FjY2VzcyhzdHJ1Y3Qgdm1fZmF1bHQgKnZtZikKPiA+ICt7Cj4gPiArICAgICAgIGlmICh0YWdf c3RvcmFnZV9lbmFibGVkKCkpCj4gPiArICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZV9odWdl X3BhZ2VfbWlzc2luZ190YWdfc3RvcmFnZSh2bWYpOwo+ID4gKyAgICAgICByZXR1cm4gVk1fRkFV TFRfU0lHQlVTOwo+ID4gK30KPiA+ICAjZW5kaWYgLyogQ09ORklHX0FSQ0hfSEFTX0ZBVUxUX09O X0FDQ0VTUyAqLwo+ID4KPiA+ICAjZGVmaW5lIHBtZF9wcmVzZW50X2ludmFsaWQocG1kKSAgICAg KCEhKHBtZF92YWwocG1kKSAmIFBNRF9QUkVTRU5UX0lOVkFMSUQpKQo+ID4gZGlmZiAtLWdpdCBh L2FyY2gvYXJtNjQvbW0vZmF1bHQuYyBiL2FyY2gvYXJtNjQvbW0vZmF1bHQuYwo+ID4gaW5kZXgg ZjVmYTU4M2FjZjE4Li42NzMwYTA4MTJhMjQgMTAwNjQ0Cj4gPiAtLS0gYS9hcmNoL2FybTY0L21t L2ZhdWx0LmMKPiA+ICsrKyBiL2FyY2gvYXJtNjQvbW0vZmF1bHQuYwo+ID4gQEAgLTEwNDEsNiAr MTA0MSw4NyBAQCB2bV9mYXVsdF90IGhhbmRsZV9wYWdlX21pc3NpbmdfdGFnX3N0b3JhZ2Uoc3Ry dWN0IHZtX2ZhdWx0ICp2bWYpCj4gPgo+ID4gICAgICAgICByZXR1cm4gMDsKPiA+Cj4gPiArb3V0 X3JldHJ5Ogo+ID4gKyAgICAgICBwdXRfcGFnZShwYWdlKTsKPiA+ICsgICAgICAgaWYgKHZtZi0+ ZmxhZ3MgJiBGQVVMVF9GTEFHX1ZNQV9MT0NLKQo+ID4gKyAgICAgICAgICAgICAgIHZtYV9lbmRf cmVhZCh2bWEpOwo+ID4gKyAgICAgICBpZiAoZmF1bHRfZmxhZ19hbGxvd19yZXRyeV9maXJzdCh2 bWYtPmZsYWdzKSkgewo+ID4gKyAgICAgICAgICAgICAgIGVyciA9IFZNX0ZBVUxUX1JFVFJZOwo+ ID4gKyAgICAgICB9IGVsc2Ugewo+ID4gKyAgICAgICAgICAgICAgIC8qIFJlcGxheSB0aGUgZmF1 bHQuICovCj4gPiArICAgICAgICAgICAgICAgZXJyID0gMDsKPiA+ICsgICAgICAgfQo+ID4gKyAg ICAgICByZXR1cm4gZXJyOwo+ID4gK30KPiA+ICsKPiA+ICt2bV9mYXVsdF90IGhhbmRsZV9odWdl X3BhZ2VfbWlzc2luZ190YWdfc3RvcmFnZShzdHJ1Y3Qgdm1fZmF1bHQgKnZtZikKPiA+ICt7Cj4g PiArICAgICAgIHVuc2lnbmVkIGxvbmcgaGFkZHIgPSB2bWYtPmFkZHJlc3MgJiBIUEFHRV9QTURf TUFTSzsKPiA+ICsgICAgICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEgPSB2bWYtPnZtYTsK PiA+ICsgICAgICAgcG1kX3Qgb2xkX3BtZCwgbmV3X3BtZDsKPiA+ICsgICAgICAgYm9vbCB3cml0 YWJsZSA9IGZhbHNlOwo+ID4gKyAgICAgICBzdHJ1Y3QgcGFnZSAqcGFnZTsKPiA+ICsgICAgICAg dm1fZmF1bHRfdCBlcnI7Cj4gPiArICAgICAgIGludCByZXQ7Cj4gPiArCj4gPiArICAgICAgIHZt Zi0+cHRsID0gcG1kX2xvY2sodm1hLT52bV9tbSwgdm1mLT5wbWQpOwo+ID4gKyAgICAgICBpZiAo dW5saWtlbHkoIXBtZF9zYW1lKHZtZi0+b3JpZ19wbWQsICp2bWYtPnBtZCkpKSB7Cj4gPiArICAg ICAgICAgICAgICAgc3Bpbl91bmxvY2sodm1mLT5wdGwpOwo+ID4gKyAgICAgICAgICAgICAgIHJl dHVybiAwOwo+ID4gKyAgICAgICB9Cj4gPiArCj4gPiArICAgICAgIG9sZF9wbWQgPSB2bWYtPm9y aWdfcG1kOwo+ID4gKyAgICAgICBuZXdfcG1kID0gcG1kX21vZGlmeShvbGRfcG1kLCB2bWEtPnZt X3BhZ2VfcHJvdCk7Cj4gPiArCj4gPiArICAgICAgIC8qCj4gPiArICAgICAgICAqIERldGVjdCBu b3cgd2hldGhlciB0aGUgUE1EIGNvdWxkIGJlIHdyaXRhYmxlOyB0aGlzIGluZm9ybWF0aW9uCj4g PiArICAgICAgICAqIGlzIG9ubHkgdmFsaWQgd2hpbGUgaG9sZGluZyB0aGUgUFQgbG9jay4KPiA+ ICsgICAgICAgICovCj4gPiArICAgICAgIHdyaXRhYmxlID0gcG1kX3dyaXRlKG5ld19wbWQpOwo+ ID4gKyAgICAgICBpZiAoIXdyaXRhYmxlICYmIHZtYV93YW50c19tYW51YWxfcHRlX3dyaXRlX3Vw Z3JhZGUodm1hKSAmJgo+ID4gKyAgICAgICAgICAgY2FuX2NoYW5nZV9wbWRfd3JpdGFibGUodm1h LCB2bWYtPmFkZHJlc3MsIG5ld19wbWQpKQo+ID4gKyAgICAgICAgICAgICAgIHdyaXRhYmxlID0g dHJ1ZTsKPiA+ICsKPiA+ICsgICAgICAgcGFnZSA9IHZtX25vcm1hbF9wYWdlX3BtZCh2bWEsIGhh ZGRyLCBuZXdfcG1kKTsKPiA+ICsgICAgICAgaWYgKCFwYWdlKQo+ID4gKyAgICAgICAgICAgICAg IGdvdG8gb3V0X21hcDsKPiA+ICsKPiA+ICsgICAgICAgaWYgKCEodm1hLT52bV9mbGFncyAmIFZN X01URSkpCj4gPiArICAgICAgICAgICAgICAgZ290byBvdXRfbWFwOwo+ID4gKwo+ID4gKyAgICAg ICBnZXRfcGFnZShwYWdlKTsKPiA+ICsgICAgICAgdm1hX3NldF9hY2Nlc3NfcGlkX2JpdCh2bWEp Owo+ID4gKwo+ID4gKyAgICAgICBzcGluX3VubG9jayh2bWYtPnB0bCk7Cj4gPiArICAgICAgIHdy aXRhYmxlID0gZmFsc2U7Cj4gPiArCj4gPiArICAgICAgIGlmICh1bmxpa2VseShpc19taWdyYXRl X2lzb2xhdGVfcGFnZShwYWdlKSkpCj4gPiArICAgICAgICAgICAgICAgZ290byBvdXRfcmV0cnk7 Cj4gPiArCj4gPiArICAgICAgIHJldCA9IHJlc2VydmVfdGFnX3N0b3JhZ2UocGFnZSwgSFBBR0Vf UE1EX09SREVSLCBHRlBfSElHSFVTRVJfTU9WQUJMRSk7Cj4gPiArICAgICAgIGlmIChyZXQpCj4g PiArICAgICAgICAgICAgICAgZ290byBvdXRfcmV0cnk7Cj4gPiArCj4gPiArICAgICAgIHB1dF9w YWdlKHBhZ2UpOwo+ID4gKwo+ID4gKyAgICAgICB2bWYtPnB0bCA9IHBtZF9sb2NrKHZtYS0+dm1f bW0sIHZtZi0+cG1kKTsKPiA+ICsgICAgICAgaWYgKHVubGlrZWx5KCFwbWRfc2FtZShvbGRfcG1k LCAqdm1mLT5wbWQpKSkgewo+ID4gKyAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrKHZtZi0+cHRs KTsKPiA+ICsgICAgICAgICAgICAgICByZXR1cm4gMDsKPiA+ICsgICAgICAgfQo+ID4gKwo+ID4g K291dF9tYXA6Cj4gPiArICAgICAgIC8qIFJlc3RvcmUgdGhlIFBNRCAqLwo+ID4gKyAgICAgICBu ZXdfcG1kID0gcG1kX21vZGlmeShvbGRfcG1kLCB2bWEtPnZtX3BhZ2VfcHJvdCk7Cj4gPiArICAg ICAgIG5ld19wbWQgPSBwbWRfbWt5b3VuZyhuZXdfcG1kKTsKPiA+ICsgICAgICAgaWYgKHdyaXRh YmxlKQo+ID4gKyAgICAgICAgICAgICAgIG5ld19wbWQgPSBwbWRfbWt3cml0ZShuZXdfcG1kLCB2 bWEpOwo+ID4gKyAgICAgICBzZXRfcG1kX2F0KHZtYS0+dm1fbW0sIGhhZGRyLCB2bWYtPnBtZCwg bmV3X3BtZCk7Cj4gPiArICAgICAgIHVwZGF0ZV9tbXVfY2FjaGVfcG1kKHZtYSwgdm1mLT5hZGRy ZXNzLCB2bWYtPnBtZCk7Cj4gPiArICAgICAgIHNwaW5fdW5sb2NrKHZtZi0+cHRsKTsKPiA+ICsK PiA+ICsgICAgICAgcmV0dXJuIDA7Cj4gPiArCj4gPiAgb3V0X3JldHJ5Ogo+ID4gICAgICAgICBw dXRfcGFnZShwYWdlKTsKPiA+ICAgICAgICAgaWYgKHZtZi0+ZmxhZ3MgJiBGQVVMVF9GTEFHX1ZN QV9MT0NLKQo+ID4gZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaHVnZV9tbS5oIGIvaW5jbHVk ZS9saW51eC9odWdlX21tLmgKPiA+IGluZGV4IGZhMDM1MGIwODEyYS4uYmI4NDI5MWY5MjMxIDEw MDY0NAo+ID4gLS0tIGEvaW5jbHVkZS9saW51eC9odWdlX21tLmgKPiA+ICsrKyBiL2luY2x1ZGUv bGludXgvaHVnZV9tbS5oCj4gPiBAQCAtMzYsNiArMzYsOCBAQCBib29sIG1vdmVfaHVnZV9wbWQo c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgb2xkX2FkZHIsCj4gPiAg aW50IGNoYW5nZV9odWdlX3BtZChzdHJ1Y3QgbW11X2dhdGhlciAqdGxiLCBzdHJ1Y3Qgdm1fYXJl YV9zdHJ1Y3QgKnZtYSwKPiA+ICAgICAgICAgICAgICAgICAgICAgcG1kX3QgKnBtZCwgdW5zaWdu ZWQgbG9uZyBhZGRyLCBwZ3Byb3RfdCBuZXdwcm90LAo+ID4gICAgICAgICAgICAgICAgICAgICB1 bnNpZ25lZCBsb25nIGNwX2ZsYWdzKTsKPiA+ICtib29sIGNhbl9jaGFuZ2VfcG1kX3dyaXRhYmxl KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsCj4gPiArICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHBtZF90IHBtZCk7Cj4gPgo+ID4gIHZtX2ZhdWx0X3Qg dm1mX2luc2VydF9wZm5fcG1kKHN0cnVjdCB2bV9mYXVsdCAqdm1mLCBwZm5fdCBwZm4sIGJvb2wg d3JpdGUpOwo+ID4gIHZtX2ZhdWx0X3Qgdm1mX2luc2VydF9wZm5fcHVkKHN0cnVjdCB2bV9mYXVs dCAqdm1mLCBwZm5fdCBwZm4sIGJvb2wgd3JpdGUpOwo+ID4gZGlmZiAtLWdpdCBhL2luY2x1ZGUv bGludXgvcGd0YWJsZS5oIGIvaW5jbHVkZS9saW51eC9wZ3RhYmxlLmgKPiA+IGluZGV4IGUyYzc2 MWRkNmM0MS4uZGU0NWY0NzViZjhkIDEwMDY0NAo+ID4gLS0tIGEvaW5jbHVkZS9saW51eC9wZ3Rh YmxlLmgKPiA+ICsrKyBiL2luY2x1ZGUvbGludXgvcGd0YWJsZS5oCj4gPiBAQCAtMTQ3Myw2ICsx NDczLDExIEBAIHN0YXRpYyBpbmxpbmUgdm1fZmF1bHRfdCBhcmNoX2RvX3BhZ2VfZmF1bHRfb25f YWNjZXNzKHN0cnVjdCB2bV9mYXVsdCAqdm1mKQo+ID4gIHsKPiA+ICAgICAgICAgcmV0dXJuIFZN X0ZBVUxUX1NJR0JVUzsKPiA+ICB9Cj4gPiArCj4gPiArc3RhdGljIGlubGluZSB2bV9mYXVsdF90 IGFyY2hfZG9faHVnZV9wYWdlX2ZhdWx0X29uX2FjY2VzcyhzdHJ1Y3Qgdm1fZmF1bHQgKnZtZikK PiA+ICt7Cj4gPiArICAgICAgIHJldHVybiBWTV9GQVVMVF9TSUdCVVM7Cj4gPiArfQo+ID4gICNl bmRpZgo+ID4KPiA+ICAjZW5kaWYgLyogQ09ORklHX01NVSAqLwo+ID4gZGlmZiAtLWdpdCBhL21t L2h1Z2VfbWVtb3J5LmMgYi9tbS9odWdlX21lbW9yeS5jCj4gPiBpbmRleCA5YmVlYWQ5NjFhNjUu LmQxNDAyYjQzZWEzOSAxMDA2NDQKPiA+IC0tLSBhL21tL2h1Z2VfbWVtb3J5LmMKPiA+ICsrKyBi L21tL2h1Z2VfbWVtb3J5LmMKPiA+IEBAIC0xNDA2LDggKzE0MDYsOCBAQCB2bV9mYXVsdF90IGRv X2h1Z2VfcG1kX3dwX3BhZ2Uoc3RydWN0IHZtX2ZhdWx0ICp2bWYpCj4gPiAgICAgICAgIHJldHVy biBWTV9GQVVMVF9GQUxMQkFDSzsKPiA+ICB9Cj4gPgo+ID4gLXN0YXRpYyBpbmxpbmUgYm9vbCBj YW5fY2hhbmdlX3BtZF93cml0YWJsZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKPiA+IC0g ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGFk ZHIsIHBtZF90IHBtZCkKPiA+ICtpbmxpbmUgYm9vbCBjYW5fY2hhbmdlX3BtZF93cml0YWJsZShz dHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKPiAKPiBSZW1vdmUgaW5saW5lIGtleXdvcmQgaGVy ZS4KCkluZGVlZCwgYXMgaXQgZG9lcyBub3RoaW5nIG5vdyB0aGF0IHRoZSBmdW5jdGlvbiBpcyBu b3Qgc3RhdGljLgoKVGhhbmtzLApBbGV4Cgo+IAo+IFBldGVyCj4gCj4gPiArICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHBtZF90IHBtZCkKPiA+ ICB7Cj4gPiAgICAgICAgIHN0cnVjdCBwYWdlICpwYWdlOwo+ID4KPiA+IGRpZmYgLS1naXQgYS9t bS9tZW1vcnkuYyBiL21tL21lbW9yeS5jCj4gPiBpbmRleCBhMDRhOTcxMjAwYjkuLjQ2YjkyNjYy NTUwMyAxMDA2NDQKPiA+IC0tLSBhL21tL21lbW9yeS5jCj4gPiArKysgYi9tbS9tZW1vcnkuYwo+ ID4gQEAgLTUxNjgsNiArNTE2OCw5IEBAIHN0YXRpYyB2bV9mYXVsdF90IF9faGFuZGxlX21tX2Zh dWx0KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAo+ID4gICAgICAgICAgICAgICAgICAgICAg ICAgcmV0dXJuIDA7Cj4gPiAgICAgICAgICAgICAgICAgfQo+ID4gICAgICAgICAgICAgICAgIGlm IChwbWRfdHJhbnNfaHVnZSh2bWYub3JpZ19wbWQpIHx8IHBtZF9kZXZtYXAodm1mLm9yaWdfcG1k KSkgewo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZhdWx0X29uX2FjY2Vzc19wbWQo dm1mLm9yaWdfcG1kKSAmJiB2bWFfaXNfYWNjZXNzaWJsZSh2bWEpKQo+ID4gKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJjaF9kb19odWdlX3BhZ2VfZmF1bHRfb25fYWNj ZXNzKCZ2bWYpOwo+ID4gKwo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBtZF9wcm90 bm9uZSh2bWYub3JpZ19wbWQpICYmIHZtYV9pc19hY2Nlc3NpYmxlKHZtYSkpCj4gPiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkb19odWdlX3BtZF9udW1hX3BhZ2UoJnZt Zik7Cj4gPgo+ID4gLS0KPiA+IDIuNDIuMQo+ID4KCl9fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4 LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9y Zy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK