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 5FBAAEB64DA for ; Wed, 5 Jul 2023 18:01:28 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233313AbjGESB1 (ORCPT ); Wed, 5 Jul 2023 14:01:27 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39806 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233328AbjGESBU (ORCPT ); Wed, 5 Jul 2023 14:01:20 -0400 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 62E7419A9 for ; Wed, 5 Jul 2023 11:01:13 -0700 (PDT) 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 399E21763; Wed, 5 Jul 2023 11:01:55 -0700 (PDT) Received: from [10.57.76.116] (unknown [10.57.76.116]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 5C29C3F762; Wed, 5 Jul 2023 11:01:11 -0700 (PDT) Message-ID: Date: Wed, 5 Jul 2023 19:01:09 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:102.0) Gecko/20100101 Thunderbird/102.12.0 Subject: Re: [PATCH v2 3/5] mm: Default implementation of arch_wants_pte_order() To: Yu Zhao Cc: Andrew Morton , Matthew Wilcox , "Kirill A. Shutemov" , Yin Fengwei , David Hildenbrand , Catalin Marinas , Will Deacon , Anshuman Khandual , Yang Shi , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org References: <20230703135330.1865927-1-ryan.roberts@arm.com> <20230703135330.1865927-4-ryan.roberts@arm.com> <9c5f3515-ad39-e416-902e-96e9387a3b60@arm.com> From: Ryan Roberts In-Reply-To: Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 05/07/2023 18:24, Yu Zhao wrote: > On Wed, Jul 5, 2023 at 3:11 AM Ryan Roberts wrote: >> >> On 05/07/2023 03:07, Yu Zhao wrote: >>> On Tue, Jul 4, 2023 at 7:20 AM Ryan Roberts wrote: >>>> >>>> On 03/07/2023 20:50, Yu Zhao wrote: >>>>> On Mon, Jul 3, 2023 at 7:53 AM Ryan Roberts wrote: >>>>>> >>>>>> arch_wants_pte_order() can be overridden by the arch to return the >>>>>> preferred folio order for pte-mapped memory. This is useful as some >>>>>> architectures (e.g. arm64) can coalesce TLB entries when the physical >>>>>> memory is suitably contiguous. >>>>>> >>>>>> The first user for this hint will be FLEXIBLE_THP, which aims to >>>>>> allocate large folios for anonymous memory to reduce page faults and >>>>>> other per-page operation costs. >>>>>> >>>>>> Here we add the default implementation of the function, used when the >>>>>> architecture does not define it, which returns the order corresponding >>>>>> to 64K. >>>>> >>>>> I don't really mind a non-zero default value. But people would ask why >>>>> non-zero and why 64KB. Probably you could argue this is the large size >>>>> all known archs support if they have TLB coalescing. For x86, AMD CPUs >>>>> would want to override this. I'll leave it to Fengwei to decide >>>>> whether Intel wants a different default value.> >>>>> Also I don't like the vma parameter because it makes >>>>> arch_wants_pte_order() a mix of hw preference and vma policy. From my >>>>> POV, the function should be only about the former; the latter should >>>>> be decided by arch-independent MM code. However, I can live with it if >>>>> ARM MM people think this is really what you want. ATM, I'm skeptical >>>>> they do. >>>> >>>> Here's the big picture for what I'm tryng to achieve: >>>> >>>> - In the common case, I'd like all programs to get a performance bump by >>>> automatically and transparently using large anon folios - so no explicit >>>> requirement on the process to opt-in. >>> >>> We all agree on this :) >>> >>>> - On arm64, in the above case, I'd like the preferred folio size to be 64K; >>>> from the (admittedly limitted) testing I've done that's about where the >>>> performance knee is and it doesn't appear to increase the memory wastage very >>>> much. It also has the benefits that for 4K base pages this is the contpte size >>>> (order-4) so I can take full benefit of contpte mappings transparently to the >>>> process. And for 16K this is the HPA size (order-2). >>> >>> My highest priority is to get 16KB proven first because it would >>> benefit both client and server devices. So it may be different from >>> yours but I don't see any conflict. >> >> Do you mean 16K folios on a 4K base page system > > Yes. > >> or large folios on a 16K base >> page system? I thought your focus was on speeding up 4K base page client systems >> but this statement has got me wondering? > > Sorry, I should have said 4x4KB. OK. Be aware that a number of Arm CPUs that support HPA don't have it enabled by default (or at least don't have it enabled in the mode that you would want it to see best performance with large anon folios). You would need EL3 access to reconfigure it. > >>>> - On arm64 when the process has marked the VMA for THP (or when >>>> transparent_hugepage=always) but the VMA does not meet the requirements for a >>>> PMD-sized mapping (or we failed to allocate, ...) then I'd like to map using >>>> contpte. For 4K base pages this is 64K (order-4), for 16K this is 2M (order-7) >>>> and for 64K this is 2M (order-5). The 64K base page case is very important since >>>> the PMD size for that base page is 512MB which is almost impossible to allocate >>>> in practice. >>> >>> Which case (server or client) are you focusing on here? For our client >>> devices, I can confidently say that 64KB has to be after 16KB, if it >>> happens at all. For servers in general, I don't know of any major >>> memory-intensive workloads that are not THP-aware, i.e., I don't think >>> "VMA does not meet the requirements" is a concern. >> >> For the 64K base page case, the focus is server. The problem reported by our >> partner is that the 512M huge page size is too big to reliably allocate and so >> the fauls always fall back to 64K base pages in practice. I would also speculate >> (happy to be proved wrong) that there are many THP-aware workloads that assume >> the THP size is 2M. In this case, their VMAs may well be too small to fit a 512M >> huge page when running on 64K base page system. > > Interesting. When you have something ready to share, I might be able > to try it on our ARM servers as well. That would be really helpful. I'm currently updating my branch that collates everything to reflect the review comments in this patch set and the contpte patch set. I'll share it in a couple of weeks. > >> But the TL;DR is that Arm has a partner for which enabling 2M THP on a 64K base >> page system is a very real requirement. Our intent is that this will be the >> mechanism we use to enable it. > > Yes, contpte makes more sense for what you described. It'd fit in a > lot better in the hugetlb case, but I guess your partner uses anon. arm64 already supports contpte for hugetlb, but they need it to work with anon memory using THP. 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 653F9EB64DD for ; Thu, 6 Jul 2023 01:45:08 +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: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=nxctNn/zpfUvJ+DZcBeZaJ5jTViIJYPRdquPgK9R24o=; b=aZ6bHn1iiO4rS7 5DC8nhXE2+9wOzipqWEzNksTsBw2a6Qd2lheAL9rZLjdHtvTNHcHBVjmUtxbQC/MwhenpTF+ccQlp /TrDDTEporNMqyimcf9vURaVeT5TGIb3kD8XHR4CdZEekYH1eCdziiLq3PwqQR0dsqhGbAlOQgF0U fzezMl3GYGRcEpBSDpyWI6d4ZnafbqKtKe/GW0E9NFu8MAnIR00TqXIFiVsDRJbHpfL7bSbeY+yVv K0gFS/C2If1UGPjMhkV+z6kPCgaeE9DP3+appDc/QD4MRAXJuNXwLRcMU9DJTNrSZR4RwKs2ywG8d qHZsSoB6+zadDpIL662g==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qHE32-0000iY-1g; Thu, 06 Jul 2023 01:44:44 +0000 Received: from foss.arm.com ([217.140.110.172]) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qHE2v-0000gk-2t for linux-arm-kernel@lists.infradead.org; Thu, 06 Jul 2023 01:44:41 +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 399E21763; Wed, 5 Jul 2023 11:01:55 -0700 (PDT) Received: from [10.57.76.116] (unknown [10.57.76.116]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 5C29C3F762; Wed, 5 Jul 2023 11:01:11 -0700 (PDT) Message-ID: Date: Wed, 5 Jul 2023 19:01:09 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:102.0) Gecko/20100101 Thunderbird/102.12.0 Subject: Re: [PATCH v2 3/5] mm: Default implementation of arch_wants_pte_order() To: Yu Zhao Cc: Andrew Morton , Matthew Wilcox , "Kirill A. Shutemov" , Yin Fengwei , David Hildenbrand , Catalin Marinas , Will Deacon , Anshuman Khandual , Yang Shi , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org References: <20230703135330.1865927-1-ryan.roberts@arm.com> <20230703135330.1865927-4-ryan.roberts@arm.com> <9c5f3515-ad39-e416-902e-96e9387a3b60@arm.com> From: Ryan Roberts In-Reply-To: X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230705_184438_031990_FA9F9899 X-CRM114-Status: GOOD ( 36.22 ) 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 T24gMDUvMDcvMjAyMyAxODoyNCwgWXUgWmhhbyB3cm90ZToKPiBPbiBXZWQsIEp1bCA1LCAyMDIz IGF0IDM6MTHigK9BTSBSeWFuIFJvYmVydHMgPHJ5YW4ucm9iZXJ0c0Bhcm0uY29tPiB3cm90ZToK Pj4KPj4gT24gMDUvMDcvMjAyMyAwMzowNywgWXUgWmhhbyB3cm90ZToKPj4+IE9uIFR1ZSwgSnVs IDQsIDIwMjMgYXQgNzoyMOKAr0FNIFJ5YW4gUm9iZXJ0cyA8cnlhbi5yb2JlcnRzQGFybS5jb20+ IHdyb3RlOgo+Pj4+Cj4+Pj4gT24gMDMvMDcvMjAyMyAyMDo1MCwgWXUgWmhhbyB3cm90ZToKPj4+ Pj4gT24gTW9uLCBKdWwgMywgMjAyMyBhdCA3OjUz4oCvQU0gUnlhbiBSb2JlcnRzIDxyeWFuLnJv YmVydHNAYXJtLmNvbT4gd3JvdGU6Cj4+Pj4+Pgo+Pj4+Pj4gYXJjaF93YW50c19wdGVfb3JkZXIo KSBjYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUgYXJjaCB0byByZXR1cm4gdGhlCj4+Pj4+PiBwcmVm ZXJyZWQgZm9saW8gb3JkZXIgZm9yIHB0ZS1tYXBwZWQgbWVtb3J5LiBUaGlzIGlzIHVzZWZ1bCBh cyBzb21lCj4+Pj4+PiBhcmNoaXRlY3R1cmVzIChlLmcuIGFybTY0KSBjYW4gY29hbGVzY2UgVExC IGVudHJpZXMgd2hlbiB0aGUgcGh5c2ljYWwKPj4+Pj4+IG1lbW9yeSBpcyBzdWl0YWJseSBjb250 aWd1b3VzLgo+Pj4+Pj4KPj4+Pj4+IFRoZSBmaXJzdCB1c2VyIGZvciB0aGlzIGhpbnQgd2lsbCBi ZSBGTEVYSUJMRV9USFAsIHdoaWNoIGFpbXMgdG8KPj4+Pj4+IGFsbG9jYXRlIGxhcmdlIGZvbGlv cyBmb3IgYW5vbnltb3VzIG1lbW9yeSB0byByZWR1Y2UgcGFnZSBmYXVsdHMgYW5kCj4+Pj4+PiBv dGhlciBwZXItcGFnZSBvcGVyYXRpb24gY29zdHMuCj4+Pj4+Pgo+Pj4+Pj4gSGVyZSB3ZSBhZGQg dGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIGZ1bmN0aW9uLCB1c2VkIHdoZW4gdGhl Cj4+Pj4+PiBhcmNoaXRlY3R1cmUgZG9lcyBub3QgZGVmaW5lIGl0LCB3aGljaCByZXR1cm5zIHRo ZSBvcmRlciBjb3JyZXNwb25kaW5nCj4+Pj4+PiB0byA2NEsuCj4+Pj4+Cj4+Pj4+IEkgZG9uJ3Qg cmVhbGx5IG1pbmQgYSBub24temVybyBkZWZhdWx0IHZhbHVlLiBCdXQgcGVvcGxlIHdvdWxkIGFz ayB3aHkKPj4+Pj4gbm9uLXplcm8gYW5kIHdoeSA2NEtCLiBQcm9iYWJseSB5b3UgY291bGQgYXJn dWUgdGhpcyBpcyB0aGUgbGFyZ2Ugc2l6ZQo+Pj4+PiBhbGwga25vd24gYXJjaHMgc3VwcG9ydCBp ZiB0aGV5IGhhdmUgVExCIGNvYWxlc2NpbmcuIEZvciB4ODYsIEFNRCBDUFVzCj4+Pj4+IHdvdWxk IHdhbnQgdG8gb3ZlcnJpZGUgdGhpcy4gSSdsbCBsZWF2ZSBpdCB0byBGZW5nd2VpIHRvIGRlY2lk ZQo+Pj4+PiB3aGV0aGVyIEludGVsIHdhbnRzIGEgZGlmZmVyZW50IGRlZmF1bHQgdmFsdWUuPgo+ Pj4+PiBBbHNvIEkgZG9uJ3QgbGlrZSB0aGUgdm1hIHBhcmFtZXRlciBiZWNhdXNlIGl0IG1ha2Vz Cj4+Pj4+IGFyY2hfd2FudHNfcHRlX29yZGVyKCkgYSBtaXggb2YgaHcgcHJlZmVyZW5jZSBhbmQg dm1hIHBvbGljeS4gRnJvbSBteQo+Pj4+PiBQT1YsIHRoZSBmdW5jdGlvbiBzaG91bGQgYmUgb25s eSBhYm91dCB0aGUgZm9ybWVyOyB0aGUgbGF0dGVyIHNob3VsZAo+Pj4+PiBiZSBkZWNpZGVkIGJ5 IGFyY2gtaW5kZXBlbmRlbnQgTU0gY29kZS4gSG93ZXZlciwgSSBjYW4gbGl2ZSB3aXRoIGl0IGlm Cj4+Pj4+IEFSTSBNTSBwZW9wbGUgdGhpbmsgdGhpcyBpcyByZWFsbHkgd2hhdCB5b3Ugd2FudC4g QVRNLCBJJ20gc2tlcHRpY2FsCj4+Pj4+IHRoZXkgZG8uCj4+Pj4KPj4+PiBIZXJlJ3MgdGhlIGJp ZyBwaWN0dXJlIGZvciB3aGF0IEknbSB0cnluZyB0byBhY2hpZXZlOgo+Pj4+Cj4+Pj4gIC0gSW4g dGhlIGNvbW1vbiBjYXNlLCBJJ2QgbGlrZSBhbGwgcHJvZ3JhbXMgdG8gZ2V0IGEgcGVyZm9ybWFu Y2UgYnVtcCBieQo+Pj4+IGF1dG9tYXRpY2FsbHkgYW5kIHRyYW5zcGFyZW50bHkgdXNpbmcgbGFy Z2UgYW5vbiBmb2xpb3MgLSBzbyBubyBleHBsaWNpdAo+Pj4+IHJlcXVpcmVtZW50IG9uIHRoZSBw cm9jZXNzIHRvIG9wdC1pbi4KPj4+Cj4+PiBXZSBhbGwgYWdyZWUgb24gdGhpcyA6KQo+Pj4KPj4+ PiAgLSBPbiBhcm02NCwgaW4gdGhlIGFib3ZlIGNhc2UsIEknZCBsaWtlIHRoZSBwcmVmZXJyZWQg Zm9saW8gc2l6ZSB0byBiZSA2NEs7Cj4+Pj4gZnJvbSB0aGUgKGFkbWl0dGVkbHkgbGltaXR0ZWQp IHRlc3RpbmcgSSd2ZSBkb25lIHRoYXQncyBhYm91dCB3aGVyZSB0aGUKPj4+PiBwZXJmb3JtYW5j ZSBrbmVlIGlzIGFuZCBpdCBkb2Vzbid0IGFwcGVhciB0byBpbmNyZWFzZSB0aGUgbWVtb3J5IHdh c3RhZ2UgdmVyeQo+Pj4+IG11Y2guIEl0IGFsc28gaGFzIHRoZSBiZW5lZml0cyB0aGF0IGZvciA0 SyBiYXNlIHBhZ2VzIHRoaXMgaXMgdGhlIGNvbnRwdGUgc2l6ZQo+Pj4+IChvcmRlci00KSBzbyBJ IGNhbiB0YWtlIGZ1bGwgYmVuZWZpdCBvZiBjb250cHRlIG1hcHBpbmdzIHRyYW5zcGFyZW50bHkg dG8gdGhlCj4+Pj4gcHJvY2Vzcy4gQW5kIGZvciAxNksgdGhpcyBpcyB0aGUgSFBBIHNpemUgKG9y ZGVyLTIpLgo+Pj4KPj4+IE15IGhpZ2hlc3QgcHJpb3JpdHkgaXMgdG8gZ2V0IDE2S0IgcHJvdmVu IGZpcnN0IGJlY2F1c2UgaXQgd291bGQKPj4+IGJlbmVmaXQgYm90aCBjbGllbnQgYW5kIHNlcnZl ciBkZXZpY2VzLiBTbyBpdCBtYXkgYmUgZGlmZmVyZW50IGZyb20KPj4+IHlvdXJzIGJ1dCBJIGRv bid0IHNlZSBhbnkgY29uZmxpY3QuCj4+Cj4+IERvIHlvdSBtZWFuIDE2SyBmb2xpb3Mgb24gYSA0 SyBiYXNlIHBhZ2Ugc3lzdGVtCj4gCj4gWWVzLgo+IAo+PiBvciBsYXJnZSBmb2xpb3Mgb24gYSAx NksgYmFzZQo+PiBwYWdlIHN5c3RlbT8gSSB0aG91Z2h0IHlvdXIgZm9jdXMgd2FzIG9uIHNwZWVk aW5nIHVwIDRLIGJhc2UgcGFnZSBjbGllbnQgc3lzdGVtcwo+PiBidXQgdGhpcyBzdGF0ZW1lbnQg aGFzIGdvdCBtZSB3b25kZXJpbmc/Cj4gCj4gU29ycnksIEkgc2hvdWxkIGhhdmUgc2FpZCA0eDRL Qi4KCk9LLiBCZSBhd2FyZSB0aGF0IGEgbnVtYmVyIG9mIEFybSBDUFVzIHRoYXQgc3VwcG9ydCBI UEEgZG9uJ3QgaGF2ZSBpdCBlbmFibGVkIGJ5CmRlZmF1bHQgKG9yIGF0IGxlYXN0IGRvbid0IGhh dmUgaXQgZW5hYmxlZCBpbiB0aGUgbW9kZSB0aGF0IHlvdSB3b3VsZCB3YW50IGl0IHRvCnNlZSBi ZXN0IHBlcmZvcm1hbmNlIHdpdGggbGFyZ2UgYW5vbiBmb2xpb3MpLiBZb3Ugd291bGQgbmVlZCBF TDMgYWNjZXNzIHRvCnJlY29uZmlndXJlIGl0LgoKPiAKPj4+PiAgLSBPbiBhcm02NCB3aGVuIHRo ZSBwcm9jZXNzIGhhcyBtYXJrZWQgdGhlIFZNQSBmb3IgVEhQIChvciB3aGVuCj4+Pj4gdHJhbnNw YXJlbnRfaHVnZXBhZ2U9YWx3YXlzKSBidXQgdGhlIFZNQSBkb2VzIG5vdCBtZWV0IHRoZSByZXF1 aXJlbWVudHMgZm9yIGEKPj4+PiBQTUQtc2l6ZWQgbWFwcGluZyAob3Igd2UgZmFpbGVkIHRvIGFs bG9jYXRlLCAuLi4pIHRoZW4gSSdkIGxpa2UgdG8gbWFwIHVzaW5nCj4+Pj4gY29udHB0ZS4gRm9y IDRLIGJhc2UgcGFnZXMgdGhpcyBpcyA2NEsgKG9yZGVyLTQpLCBmb3IgMTZLIHRoaXMgaXMgMk0g KG9yZGVyLTcpCj4+Pj4gYW5kIGZvciA2NEsgdGhpcyBpcyAyTSAob3JkZXItNSkuIFRoZSA2NEsg YmFzZSBwYWdlIGNhc2UgaXMgdmVyeSBpbXBvcnRhbnQgc2luY2UKPj4+PiB0aGUgUE1EIHNpemUg Zm9yIHRoYXQgYmFzZSBwYWdlIGlzIDUxMk1CIHdoaWNoIGlzIGFsbW9zdCBpbXBvc3NpYmxlIHRv IGFsbG9jYXRlCj4+Pj4gaW4gcHJhY3RpY2UuCj4+Pgo+Pj4gV2hpY2ggY2FzZSAoc2VydmVyIG9y IGNsaWVudCkgYXJlIHlvdSBmb2N1c2luZyBvbiBoZXJlPyBGb3Igb3VyIGNsaWVudAo+Pj4gZGV2 aWNlcywgSSBjYW4gY29uZmlkZW50bHkgc2F5IHRoYXQgNjRLQiBoYXMgdG8gYmUgYWZ0ZXIgMTZL QiwgaWYgaXQKPj4+IGhhcHBlbnMgYXQgYWxsLiBGb3Igc2VydmVycyBpbiBnZW5lcmFsLCBJIGRv bid0IGtub3cgb2YgYW55IG1ham9yCj4+PiBtZW1vcnktaW50ZW5zaXZlIHdvcmtsb2FkcyB0aGF0 IGFyZSBub3QgVEhQLWF3YXJlLCBpLmUuLCBJIGRvbid0IHRoaW5rCj4+PiAiVk1BIGRvZXMgbm90 IG1lZXQgdGhlIHJlcXVpcmVtZW50cyIgaXMgYSBjb25jZXJuLgo+Pgo+PiBGb3IgdGhlIDY0SyBi YXNlIHBhZ2UgY2FzZSwgdGhlIGZvY3VzIGlzIHNlcnZlci4gVGhlIHByb2JsZW0gcmVwb3J0ZWQg Ynkgb3VyCj4+IHBhcnRuZXIgaXMgdGhhdCB0aGUgNTEyTSBodWdlIHBhZ2Ugc2l6ZSBpcyB0b28g YmlnIHRvIHJlbGlhYmx5IGFsbG9jYXRlIGFuZCBzbwo+PiB0aGUgZmF1bHMgYWx3YXlzIGZhbGwg YmFjayB0byA2NEsgYmFzZSBwYWdlcyBpbiBwcmFjdGljZS4gSSB3b3VsZCBhbHNvIHNwZWN1bGF0 ZQo+PiAoaGFwcHkgdG8gYmUgcHJvdmVkIHdyb25nKSB0aGF0IHRoZXJlIGFyZSBtYW55IFRIUC1h d2FyZSB3b3JrbG9hZHMgdGhhdCBhc3N1bWUKPj4gdGhlIFRIUCBzaXplIGlzIDJNLiBJbiB0aGlz IGNhc2UsIHRoZWlyIFZNQXMgbWF5IHdlbGwgYmUgdG9vIHNtYWxsIHRvIGZpdCBhIDUxMk0KPj4g aHVnZSBwYWdlIHdoZW4gcnVubmluZyBvbiA2NEsgYmFzZSBwYWdlIHN5c3RlbS4KPiAKPiBJbnRl cmVzdGluZy4gV2hlbiB5b3UgaGF2ZSBzb21ldGhpbmcgcmVhZHkgdG8gc2hhcmUsIEkgbWlnaHQg YmUgYWJsZQo+IHRvIHRyeSBpdCBvbiBvdXIgQVJNIHNlcnZlcnMgYXMgd2VsbC4KClRoYXQgd291 bGQgYmUgcmVhbGx5IGhlbHBmdWwuIEknbSBjdXJyZW50bHkgdXBkYXRpbmcgbXkgYnJhbmNoIHRo YXQgY29sbGF0ZXMKZXZlcnl0aGluZyB0byByZWZsZWN0IHRoZSByZXZpZXcgY29tbWVudHMgaW4g dGhpcyBwYXRjaCBzZXQgYW5kIHRoZSBjb250cHRlCnBhdGNoIHNldC4gSSdsbCBzaGFyZSBpdCBp biBhIGNvdXBsZSBvZiB3ZWVrcy4KCj4gCj4+IEJ1dCB0aGUgVEw7RFIgaXMgdGhhdCBBcm0gaGFz IGEgcGFydG5lciBmb3Igd2hpY2ggZW5hYmxpbmcgMk0gVEhQIG9uIGEgNjRLIGJhc2UKPj4gcGFn ZSBzeXN0ZW0gaXMgYSB2ZXJ5IHJlYWwgcmVxdWlyZW1lbnQuIE91ciBpbnRlbnQgaXMgdGhhdCB0 aGlzIHdpbGwgYmUgdGhlCj4+IG1lY2hhbmlzbSB3ZSB1c2UgdG8gZW5hYmxlIGl0Lgo+IAo+IFll cywgY29udHB0ZSBtYWtlcyBtb3JlIHNlbnNlIGZvciB3aGF0IHlvdSBkZXNjcmliZWQuIEl0J2Qg Zml0IGluIGEKPiBsb3QgYmV0dGVyIGluIHRoZSBodWdldGxiIGNhc2UsIGJ1dCBJIGd1ZXNzIHlv dXIgcGFydG5lciB1c2VzIGFub24uCgphcm02NCBhbHJlYWR5IHN1cHBvcnRzIGNvbnRwdGUgZm9y IGh1Z2V0bGIsIGJ1dCB0aGV5IG5lZWQgaXQgdG8gd29yayB3aXRoIGFub24KbWVtb3J5IHVzaW5n IFRIUC4KCgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18K bGludXgtYXJtLWtlcm5lbCBtYWlsaW5nIGxpc3QKbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZy YWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGlu dXgtYXJtLWtlcm5lbAo=