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 1FD475D8F8 for ; Thu, 14 Dec 2023 15:45:38 +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 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 9BF2AC15; Thu, 14 Dec 2023 07:46:22 -0800 (PST) Received: from raptor (unknown [172.31.20.19]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id EA4D93F5A1; Thu, 14 Dec 2023 07:45:31 -0800 (PST) Date: Thu, 14 Dec 2023 15:45:25 +0000 From: Alexandru Elisei To: Rob Herring 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, pcc@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 11/27] arm64: mte: Reserve tag storage memory Message-ID: References: <20231119165721.9849-12-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, On Wed, Dec 13, 2023 at 02:30:42PM -0600, Rob Herring wrote: > On Wed, Dec 13, 2023 at 11:44 AM Alexandru Elisei > wrote: > > > > On Wed, Dec 13, 2023 at 11:22:17AM -0600, Rob Herring wrote: > > > On Wed, Dec 13, 2023 at 8:51 AM Alexandru Elisei > > > wrote: > > > > > > > > Hi, > > > > > > > > On Wed, Dec 13, 2023 at 08:06:44AM -0600, Rob Herring wrote: > > > > > On Wed, Dec 13, 2023 at 7:05 AM Alexandru Elisei > > > > > wrote: > > > > > > > > > > > > Hi Rob, > > > > > > > > > > > > On Tue, Dec 12, 2023 at 12:44:06PM -0600, Rob Herring wrote: > > > > > > > On Tue, Dec 12, 2023 at 10:38 AM Alexandru Elisei > > > > > > > wrote: > > > > > > > > > > > > > > > > Hi Rob, > > > > > > > > > > > > > > > > Thank you so much for the feedback, I'm not very familiar with device tree, > > > > > > > > and any comments are very useful. > > > > > > > > > > > > > > > > On Mon, Dec 11, 2023 at 11:29:40AM -0600, Rob Herring wrote: > > > > > > > > > On Sun, Nov 19, 2023 at 10:59 AM Alexandru Elisei > > > > > > > > > wrote: > > > > > > > > > > > > > > > > > > > > Allow the kernel to get the size and location of the MTE tag storage > > > > > > > > > > regions from the DTB. This memory is marked as reserved for now. > > > > > > > > > > > > > > > > > > > > The DTB node for the tag storage region is defined as: > > > > > > > > > > > > > > > > > > > > tags0: tag-storage@8f8000000 { > > > > > > > > > > compatible = "arm,mte-tag-storage"; > > > > > > > > > > reg = <0x08 0xf8000000 0x00 0x4000000>; > > > > > > > > > > block-size = <0x1000>; > > > > > > > > > > memory = <&memory0>; // Associated tagged memory node > > > > > > > > > > }; > > > > > > > > > > > > > > > > > > I skimmed thru the discussion some. If this memory range is within > > > > > > > > > main RAM, then it definitely belongs in /reserved-memory. > > > > > > > > > > > > > > > > Ok, will do that. > > > > > > > > > > > > > > > > If you don't mind, why do you say that it definitely belongs in > > > > > > > > reserved-memory? I'm not trying to argue otherwise, I'm curious about the > > > > > > > > motivation. > > > > > > > > > > > > > > Simply so that /memory nodes describe all possible memory and > > > > > > > /reserved-memory is just adding restrictions. It's also because > > > > > > > /reserved-memory is what gets handled early, and we don't need > > > > > > > multiple things to handle early. > > > > > > > > > > > > > > > Tag storage is not DMA and can live anywhere in memory. > > > > > > > > > > > > > > Then why put it in DT at all? The only reason CMA is there is to set > > > > > > > the size. It's not even clear to me we need CMA in DT either. The > > > > > > > reasoning long ago was the kernel didn't do a good job of moving and > > > > > > > reclaiming contiguous space, but that's supposed to be better now (and > > > > > > > most h/w figured out they need IOMMUs). > > > > > > > > > > > > > > But for tag storage you know the size as it is a function of the > > > > > > > memory size, right? After all, you are validating the size is correct. > > > > > > > I guess there is still the aspect of whether you want enable MTE or > > > > > > > not which could be done in a variety of ways. > > > > > > > > > > > > Oh, sorry, my bad, I should have been clearer about this. I don't want to > > > > > > put it in the DT as a "linux,cma" node. But I want it to be managed by CMA. > > > > > > > > > > Yes, I understand, but my point remains. Why do you need this in DT? > > > > > If the location doesn't matter and you can calculate the size from the > > > > > memory size, what else is there to add to the DT? > > > > > > > > I am afraid there has been a misunderstanding. What do you mean by > > > > "location doesn't matter"? > > > > > > You said: > > > > Tag storage is not DMA and can live anywhere in memory. > > > > > > Which I took as the kernel can figure out where to put it. But maybe > > > you meant the h/w platform can hard code it to be anywhere in memory? > > > If so, then yes, DT is needed. > > > > Ah, I see, sorry for not being clear enough, you are correct: tag storage > > is a hardware property, and software needs a mechanism (in this case, the > > dt) to discover its properties. > > > > > > > > > At the very least, Linux needs to know the address and size of a memory > > > > region to use it. The series is about using the tag storage memory for > > > > data. Tag storage cannot be described as a regular memory node because it > > > > cannot be tagged (and normal memory can). > > > > > > If the tag storage lives in the middle of memory, then it would be > > > described in the memory node, but removed by being in reserved-memory > > > node. > > > > I don't follow. Would you mind going into more details? > > It goes back to what I said earlier about /memory nodes describing all > the memory. There's no reason to reserve memory if you haven't > described that range as memory to begin with. One could presumably > just have a memory node for each contiguous chunk and not need > /reserved-memory (ignoring the need to say what things are reserved > for). That would become very difficult to adjust. Note that the kernel > has a hardcoded limit of 64 reserved regions currently and that is not > enough for some people. Seems like a lot, but I have no idea how they > are (ab)using /reserved-memory. Ah, I see what you mean, reserved memory is about marking existing memory (from a /memory node) as special, not about adding new memory. After the memblock allocator is initialized, the kernel can use it for its own allocations. Kernel allocations are not movable. When a page is allocated as tagged, the associated tag storage cannot be used for data, otherwise the tags would corrupt that data. To avoid this, the requirement is that tag storage pages are only used for movable allocations. When a page is allocated as tagged, the data in the associated tag storage is migrated and the tag storage is taken from the page allocator (via alloc_contig_range()). My understanding is that the memblock allocator can use all the memory from a /memory node. If the tags storage memory is declared in a /memory node, there exists the possibility that Linux will use tag storage memory for its own allocation, which would make that tags storage memory unmovable, and thus unusable for storing tags. Looking at early_init_dt_scan_memory(), even if a /memory node if marked at hotpluggable, memblock will still use it, unless "movable_node" is set on the kernel command line. That's the reason why I'm not describing tag storage in a /memory node. Is there way to tell the memblock allocator not to use memory from a /memory node? > > Let me give an example. Presumably using MTE at all is configurable. > If you boot a kernel with MTE disabled (or older and not supporting > it), then I'd assume you'd want to use the tag storage for regular > memory. Well, If tag storage is already part of /memory, then all you > have to do is ignore the tag reserved-memory region. Tweaking the > memory nodes would be more work. Right now, memory is added via memblock_reserve(), and if MTE is disabled (for example, via the kernel command line), the code calls free_reserved_page() for each tag storage page. I find that straightfoward to implement. Thanks, Alex > > > Also, I should point out that /memory and /reserved-memory nodes are > not used for UEFI boot. > > Rob > 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 05E66C4332F for ; Thu, 14 Dec 2023 15:46:13 +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=wH9kKOsMJ0/P9vVg9LmedNBM4ONdbmztEJI4TPlwWMw=; b=q56i+dlAlx39G2 6q9/lkF/+J3EFlusODrqCa9y57ohQTZikHlfxgaGIbcU4ue4+tFsml45QDegp7wVTCiek+NZvJ5qy x6+E4cKm1Wz3uOksWVxoh3FjqYuQMN+J/yXq62tyWwDAOtWvq0f4LefroRj8XM8hlIQTuY7hzUO5X VhIcJ6E+E0uYHjrA0m4kNWuD1XQ7PiqkjLJm6JNFGUDC7kBUiWnSmndgXfJxWNyv8/piTpSc2BRMx OHj/XlwzG/UW6muHSb2jCkLkiL6T+uhlgxzjxqBCyc+Spq7uW6ctBifEQbTn+cM0p2Bt03Bs37MTO C6E4HorMAkqHKqEfiYYg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1rDnuB-000hy4-2E; Thu, 14 Dec 2023 15:45:43 +0000 Received: from foss.arm.com ([217.140.110.172]) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1rDnu7-000hw4-3D for linux-arm-kernel@lists.infradead.org; Thu, 14 Dec 2023 15:45:42 +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 9BF2AC15; Thu, 14 Dec 2023 07:46:22 -0800 (PST) Received: from raptor (unknown [172.31.20.19]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id EA4D93F5A1; Thu, 14 Dec 2023 07:45:31 -0800 (PST) Date: Thu, 14 Dec 2023 15:45:25 +0000 From: Alexandru Elisei To: Rob Herring 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, pcc@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 11/27] arm64: mte: Reserve tag storage memory Message-ID: References: <20231119165721.9849-12-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-20231214_074540_130905_E0AD2633 X-CRM114-Status: GOOD ( 57.86 ) 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 SGksCgpPbiBXZWQsIERlYyAxMywgMjAyMyBhdCAwMjozMDo0MlBNIC0wNjAwLCBSb2IgSGVycmlu ZyB3cm90ZToKPiBPbiBXZWQsIERlYyAxMywgMjAyMyBhdCAxMTo0NOKAr0FNIEFsZXhhbmRydSBF bGlzZWkKPiA8YWxleGFuZHJ1LmVsaXNlaUBhcm0uY29tPiB3cm90ZToKPiA+Cj4gPiBPbiBXZWQs IERlYyAxMywgMjAyMyBhdCAxMToyMjoxN0FNIC0wNjAwLCBSb2IgSGVycmluZyB3cm90ZToKPiA+ ID4gT24gV2VkLCBEZWMgMTMsIDIwMjMgYXQgODo1MeKAr0FNIEFsZXhhbmRydSBFbGlzZWkKPiA+ ID4gPGFsZXhhbmRydS5lbGlzZWlAYXJtLmNvbT4gd3JvdGU6Cj4gPiA+ID4KPiA+ID4gPiBIaSwK PiA+ID4gPgo+ID4gPiA+IE9uIFdlZCwgRGVjIDEzLCAyMDIzIGF0IDA4OjA2OjQ0QU0gLTA2MDAs IFJvYiBIZXJyaW5nIHdyb3RlOgo+ID4gPiA+ID4gT24gV2VkLCBEZWMgMTMsIDIwMjMgYXQgNzow NeKAr0FNIEFsZXhhbmRydSBFbGlzZWkKPiA+ID4gPiA+IDxhbGV4YW5kcnUuZWxpc2VpQGFybS5j b20+IHdyb3RlOgo+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiBIaSBSb2IsCj4gPiA+ID4gPiA+Cj4g PiA+ID4gPiA+IE9uIFR1ZSwgRGVjIDEyLCAyMDIzIGF0IDEyOjQ0OjA2UE0gLTA2MDAsIFJvYiBI ZXJyaW5nIHdyb3RlOgo+ID4gPiA+ID4gPiA+IE9uIFR1ZSwgRGVjIDEyLCAyMDIzIGF0IDEwOjM4 4oCvQU0gQWxleGFuZHJ1IEVsaXNlaQo+ID4gPiA+ID4gPiA+IDxhbGV4YW5kcnUuZWxpc2VpQGFy bS5jb20+IHdyb3RlOgo+ID4gPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gPiA+IEhpIFJvYiwKPiA+ ID4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+ID4gPiBUaGFuayB5b3Ugc28gbXVjaCBmb3IgdGhlIGZl ZWRiYWNrLCBJJ20gbm90IHZlcnkgZmFtaWxpYXIgd2l0aCBkZXZpY2UgdHJlZSwKPiA+ID4gPiA+ ID4gPiA+IGFuZCBhbnkgY29tbWVudHMgYXJlIHZlcnkgdXNlZnVsLgo+ID4gPiA+ID4gPiA+ID4K PiA+ID4gPiA+ID4gPiA+IE9uIE1vbiwgRGVjIDExLCAyMDIzIGF0IDExOjI5OjQwQU0gLTA2MDAs IFJvYiBIZXJyaW5nIHdyb3RlOgo+ID4gPiA+ID4gPiA+ID4gPiBPbiBTdW4sIE5vdiAxOSwgMjAy MyBhdCAxMDo1OeKAr0FNIEFsZXhhbmRydSBFbGlzZWkKPiA+ID4gPiA+ID4gPiA+ID4gPGFsZXhh bmRydS5lbGlzZWlAYXJtLmNvbT4gd3JvdGU6Cj4gPiA+ID4gPiA+ID4gPiA+ID4KPiA+ID4gPiA+ ID4gPiA+ID4gPiBBbGxvdyB0aGUga2VybmVsIHRvIGdldCB0aGUgc2l6ZSBhbmQgbG9jYXRpb24g b2YgdGhlIE1URSB0YWcgc3RvcmFnZQo+ID4gPiA+ID4gPiA+ID4gPiA+IHJlZ2lvbnMgZnJvbSB0 aGUgRFRCLiBUaGlzIG1lbW9yeSBpcyBtYXJrZWQgYXMgcmVzZXJ2ZWQgZm9yIG5vdy4KPiA+ID4g PiA+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiA+ID4gPiA+IFRoZSBEVEIgbm9kZSBmb3IgdGhlIHRh ZyBzdG9yYWdlIHJlZ2lvbiBpcyBkZWZpbmVkIGFzOgo+ID4gPiA+ID4gPiA+ID4gPiA+Cj4gPiA+ ID4gPiA+ID4gPiA+ID4gICAgICAgICB0YWdzMDogdGFnLXN0b3JhZ2VAOGY4MDAwMDAwIHsKPiA+ ID4gPiA+ID4gPiA+ID4gPiAgICAgICAgICAgICAgICAgY29tcGF0aWJsZSA9ICJhcm0sbXRlLXRh Zy1zdG9yYWdlIjsKPiA+ID4gPiA+ID4gPiA+ID4gPiAgICAgICAgICAgICAgICAgcmVnID0gPDB4 MDggMHhmODAwMDAwMCAweDAwIDB4NDAwMDAwMD47Cj4gPiA+ID4gPiA+ID4gPiA+ID4gICAgICAg ICAgICAgICAgIGJsb2NrLXNpemUgPSA8MHgxMDAwPjsKPiA+ID4gPiA+ID4gPiA+ID4gPiAgICAg ICAgICAgICAgICAgbWVtb3J5ID0gPCZtZW1vcnkwPjsgICAgLy8gQXNzb2NpYXRlZCB0YWdnZWQg bWVtb3J5IG5vZGUKPiA+ID4gPiA+ID4gPiA+ID4gPiAgICAgICAgIH07Cj4gPiA+ID4gPiA+ID4g PiA+Cj4gPiA+ID4gPiA+ID4gPiA+IEkgc2tpbW1lZCB0aHJ1IHRoZSBkaXNjdXNzaW9uIHNvbWUu IElmIHRoaXMgbWVtb3J5IHJhbmdlIGlzIHdpdGhpbgo+ID4gPiA+ID4gPiA+ID4gPiBtYWluIFJB TSwgdGhlbiBpdCBkZWZpbml0ZWx5IGJlbG9uZ3MgaW4gL3Jlc2VydmVkLW1lbW9yeS4KPiA+ID4g PiA+ID4gPiA+Cj4gPiA+ID4gPiA+ID4gPiBPaywgd2lsbCBkbyB0aGF0Lgo+ID4gPiA+ID4gPiA+ ID4KPiA+ID4gPiA+ID4gPiA+IElmIHlvdSBkb24ndCBtaW5kLCB3aHkgZG8geW91IHNheSB0aGF0 IGl0IGRlZmluaXRlbHkgYmVsb25ncyBpbgo+ID4gPiA+ID4gPiA+ID4gcmVzZXJ2ZWQtbWVtb3J5 PyBJJ20gbm90IHRyeWluZyB0byBhcmd1ZSBvdGhlcndpc2UsIEknbSBjdXJpb3VzIGFib3V0IHRo ZQo+ID4gPiA+ID4gPiA+ID4gbW90aXZhdGlvbi4KPiA+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiA+ IFNpbXBseSBzbyB0aGF0IC9tZW1vcnkgbm9kZXMgZGVzY3JpYmUgYWxsIHBvc3NpYmxlIG1lbW9y eSBhbmQKPiA+ID4gPiA+ID4gPiAvcmVzZXJ2ZWQtbWVtb3J5IGlzIGp1c3QgYWRkaW5nIHJlc3Ry aWN0aW9ucy4gSXQncyBhbHNvIGJlY2F1c2UKPiA+ID4gPiA+ID4gPiAvcmVzZXJ2ZWQtbWVtb3J5 IGlzIHdoYXQgZ2V0cyBoYW5kbGVkIGVhcmx5LCBhbmQgd2UgZG9uJ3QgbmVlZAo+ID4gPiA+ID4g PiA+IG11bHRpcGxlIHRoaW5ncyB0byBoYW5kbGUgZWFybHkuCj4gPiA+ID4gPiA+ID4KPiA+ID4g PiA+ID4gPiA+IFRhZyBzdG9yYWdlIGlzIG5vdCBETUEgYW5kIGNhbiBsaXZlIGFueXdoZXJlIGlu IG1lbW9yeS4KPiA+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiA+IFRoZW4gd2h5IHB1dCBpdCBpbiBE VCBhdCBhbGw/IFRoZSBvbmx5IHJlYXNvbiBDTUEgaXMgdGhlcmUgaXMgdG8gc2V0Cj4gPiA+ID4g PiA+ID4gdGhlIHNpemUuIEl0J3Mgbm90IGV2ZW4gY2xlYXIgdG8gbWUgd2UgbmVlZCBDTUEgaW4g RFQgZWl0aGVyLiBUaGUKPiA+ID4gPiA+ID4gPiByZWFzb25pbmcgbG9uZyBhZ28gd2FzIHRoZSBr ZXJuZWwgZGlkbid0IGRvIGEgZ29vZCBqb2Igb2YgbW92aW5nIGFuZAo+ID4gPiA+ID4gPiA+IHJl Y2xhaW1pbmcgY29udGlndW91cyBzcGFjZSwgYnV0IHRoYXQncyBzdXBwb3NlZCB0byBiZSBiZXR0 ZXIgbm93IChhbmQKPiA+ID4gPiA+ID4gPiBtb3N0IGgvdyBmaWd1cmVkIG91dCB0aGV5IG5lZWQg SU9NTVVzKS4KPiA+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiA+IEJ1dCBmb3IgdGFnIHN0b3JhZ2Ug eW91IGtub3cgdGhlIHNpemUgYXMgaXQgaXMgYSBmdW5jdGlvbiBvZiB0aGUKPiA+ID4gPiA+ID4g PiBtZW1vcnkgc2l6ZSwgcmlnaHQ/IEFmdGVyIGFsbCwgeW91IGFyZSB2YWxpZGF0aW5nIHRoZSBz aXplIGlzIGNvcnJlY3QuCj4gPiA+ID4gPiA+ID4gSSBndWVzcyB0aGVyZSBpcyBzdGlsbCB0aGUg YXNwZWN0IG9mIHdoZXRoZXIgeW91IHdhbnQgZW5hYmxlIE1URSBvcgo+ID4gPiA+ID4gPiA+IG5v dCB3aGljaCBjb3VsZCBiZSBkb25lIGluIGEgdmFyaWV0eSBvZiB3YXlzLgo+ID4gPiA+ID4gPgo+ ID4gPiA+ID4gPiBPaCwgc29ycnksIG15IGJhZCwgSSBzaG91bGQgaGF2ZSBiZWVuIGNsZWFyZXIg YWJvdXQgdGhpcy4gSSBkb24ndCB3YW50IHRvCj4gPiA+ID4gPiA+IHB1dCBpdCBpbiB0aGUgRFQg YXMgYSAibGludXgsY21hIiBub2RlLiBCdXQgSSB3YW50IGl0IHRvIGJlIG1hbmFnZWQgYnkgQ01B Lgo+ID4gPiA+ID4KPiA+ID4gPiA+IFllcywgSSB1bmRlcnN0YW5kLCBidXQgbXkgcG9pbnQgcmVt YWlucy4gV2h5IGRvIHlvdSBuZWVkIHRoaXMgaW4gRFQ/Cj4gPiA+ID4gPiBJZiB0aGUgbG9jYXRp b24gZG9lc24ndCBtYXR0ZXIgYW5kIHlvdSBjYW4gY2FsY3VsYXRlIHRoZSBzaXplIGZyb20gdGhl Cj4gPiA+ID4gPiBtZW1vcnkgc2l6ZSwgd2hhdCBlbHNlIGlzIHRoZXJlIHRvIGFkZCB0byB0aGUg RFQ/Cj4gPiA+ID4KPiA+ID4gPiBJIGFtIGFmcmFpZCB0aGVyZSBoYXMgYmVlbiBhIG1pc3VuZGVy c3RhbmRpbmcuIFdoYXQgZG8geW91IG1lYW4gYnkKPiA+ID4gPiAibG9jYXRpb24gZG9lc24ndCBt YXR0ZXIiPwo+ID4gPgo+ID4gPiBZb3Ugc2FpZDoKPiA+ID4gPiBUYWcgc3RvcmFnZSBpcyBub3Qg RE1BIGFuZCBjYW4gbGl2ZSBhbnl3aGVyZSBpbiBtZW1vcnkuCj4gPiA+Cj4gPiA+IFdoaWNoIEkg dG9vayBhcyB0aGUga2VybmVsIGNhbiBmaWd1cmUgb3V0IHdoZXJlIHRvIHB1dCBpdC4gQnV0IG1h eWJlCj4gPiA+IHlvdSBtZWFudCB0aGUgaC93IHBsYXRmb3JtIGNhbiBoYXJkIGNvZGUgaXQgdG8g YmUgYW55d2hlcmUgaW4gbWVtb3J5Pwo+ID4gPiBJZiBzbywgdGhlbiB5ZXMsIERUIGlzIG5lZWRl ZC4KPiA+Cj4gPiBBaCwgSSBzZWUsIHNvcnJ5IGZvciBub3QgYmVpbmcgY2xlYXIgZW5vdWdoLCB5 b3UgYXJlIGNvcnJlY3Q6IHRhZyBzdG9yYWdlCj4gPiBpcyBhIGhhcmR3YXJlIHByb3BlcnR5LCBh bmQgc29mdHdhcmUgbmVlZHMgYSBtZWNoYW5pc20gKGluIHRoaXMgY2FzZSwgdGhlCj4gPiBkdCkg dG8gZGlzY292ZXIgaXRzIHByb3BlcnRpZXMuCj4gPgo+ID4gPgo+ID4gPiA+IEF0IHRoZSB2ZXJ5 IGxlYXN0LCBMaW51eCBuZWVkcyB0byBrbm93IHRoZSBhZGRyZXNzIGFuZCBzaXplIG9mIGEgbWVt b3J5Cj4gPiA+ID4gcmVnaW9uIHRvIHVzZSBpdC4gVGhlIHNlcmllcyBpcyBhYm91dCB1c2luZyB0 aGUgdGFnIHN0b3JhZ2UgbWVtb3J5IGZvcgo+ID4gPiA+IGRhdGEuIFRhZyBzdG9yYWdlIGNhbm5v dCBiZSBkZXNjcmliZWQgYXMgYSByZWd1bGFyIG1lbW9yeSBub2RlIGJlY2F1c2UgaXQKPiA+ID4g PiBjYW5ub3QgYmUgdGFnZ2VkIChhbmQgbm9ybWFsIG1lbW9yeSBjYW4pLgo+ID4gPgo+ID4gPiBJ ZiB0aGUgdGFnIHN0b3JhZ2UgbGl2ZXMgaW4gdGhlIG1pZGRsZSBvZiBtZW1vcnksIHRoZW4gaXQg d291bGQgYmUKPiA+ID4gZGVzY3JpYmVkIGluIHRoZSBtZW1vcnkgbm9kZSwgYnV0IHJlbW92ZWQg YnkgYmVpbmcgaW4gcmVzZXJ2ZWQtbWVtb3J5Cj4gPiA+IG5vZGUuCj4gPgo+ID4gSSBkb24ndCBm b2xsb3cuIFdvdWxkIHlvdSBtaW5kIGdvaW5nIGludG8gbW9yZSBkZXRhaWxzPwo+IAo+IEl0IGdv ZXMgYmFjayB0byB3aGF0IEkgc2FpZCBlYXJsaWVyIGFib3V0IC9tZW1vcnkgbm9kZXMgZGVzY3Jp YmluZyBhbGwKPiB0aGUgbWVtb3J5LiBUaGVyZSdzIG5vIHJlYXNvbiB0byByZXNlcnZlIG1lbW9y eSBpZiB5b3UgaGF2ZW4ndAo+IGRlc2NyaWJlZCB0aGF0IHJhbmdlIGFzIG1lbW9yeSB0byBiZWdp biB3aXRoLiBPbmUgY291bGQgcHJlc3VtYWJseQo+IGp1c3QgaGF2ZSBhIG1lbW9yeSBub2RlIGZv ciBlYWNoIGNvbnRpZ3VvdXMgY2h1bmsgYW5kIG5vdCBuZWVkCj4gL3Jlc2VydmVkLW1lbW9yeSAo aWdub3JpbmcgdGhlIG5lZWQgdG8gc2F5IHdoYXQgdGhpbmdzIGFyZSByZXNlcnZlZAo+IGZvciku IFRoYXQgd291bGQgYmVjb21lIHZlcnkgZGlmZmljdWx0IHRvIGFkanVzdC4gTm90ZSB0aGF0IHRo ZSBrZXJuZWwKPiBoYXMgYSBoYXJkY29kZWQgbGltaXQgb2YgNjQgcmVzZXJ2ZWQgcmVnaW9ucyBj dXJyZW50bHkgYW5kIHRoYXQgaXMgbm90Cj4gZW5vdWdoIGZvciBzb21lIHBlb3BsZS4gU2VlbXMg bGlrZSBhIGxvdCwgYnV0IEkgaGF2ZSBubyBpZGVhIGhvdyB0aGV5Cj4gYXJlIChhYil1c2luZyAv cmVzZXJ2ZWQtbWVtb3J5LgoKQWgsIEkgc2VlIHdoYXQgeW91IG1lYW4sIHJlc2VydmVkIG1lbW9y eSBpcyBhYm91dCBtYXJraW5nIGV4aXN0aW5nIG1lbW9yeQooZnJvbSBhIC9tZW1vcnkgbm9kZSkg YXMgc3BlY2lhbCwgbm90IGFib3V0IGFkZGluZyBuZXcgbWVtb3J5LgoKQWZ0ZXIgdGhlIG1lbWJs b2NrIGFsbG9jYXRvciBpcyBpbml0aWFsaXplZCwgdGhlIGtlcm5lbCBjYW4gdXNlIGl0IGZvciBp dHMKb3duIGFsbG9jYXRpb25zLiBLZXJuZWwgYWxsb2NhdGlvbnMgYXJlIG5vdCBtb3ZhYmxlLgoK V2hlbiBhIHBhZ2UgaXMgYWxsb2NhdGVkIGFzIHRhZ2dlZCwgdGhlIGFzc29jaWF0ZWQgdGFnIHN0 b3JhZ2UgY2Fubm90IGJlCnVzZWQgZm9yIGRhdGEsIG90aGVyd2lzZSB0aGUgdGFncyB3b3VsZCBj b3JydXB0IHRoYXQgZGF0YS4gVG8gYXZvaWQgdGhpcywKdGhlIHJlcXVpcmVtZW50IGlzIHRoYXQg dGFnIHN0b3JhZ2UgcGFnZXMgYXJlIG9ubHkgdXNlZCBmb3IgbW92YWJsZQphbGxvY2F0aW9ucy4g V2hlbiBhIHBhZ2UgaXMgYWxsb2NhdGVkIGFzIHRhZ2dlZCwgdGhlIGRhdGEgaW4gdGhlIGFzc29j aWF0ZWQKdGFnIHN0b3JhZ2UgaXMgbWlncmF0ZWQgYW5kIHRoZSB0YWcgc3RvcmFnZSBpcyB0YWtl biBmcm9tIHRoZSBwYWdlCmFsbG9jYXRvciAodmlhIGFsbG9jX2NvbnRpZ19yYW5nZSgpKS4KCk15 IHVuZGVyc3RhbmRpbmcgaXMgdGhhdCB0aGUgbWVtYmxvY2sgYWxsb2NhdG9yIGNhbiB1c2UgYWxs IHRoZSBtZW1vcnkgZnJvbQphIC9tZW1vcnkgbm9kZS4gSWYgdGhlIHRhZ3Mgc3RvcmFnZSBtZW1v cnkgaXMgZGVjbGFyZWQgaW4gYSAvbWVtb3J5IG5vZGUsCnRoZXJlIGV4aXN0cyB0aGUgcG9zc2li aWxpdHkgdGhhdCBMaW51eCB3aWxsIHVzZSB0YWcgc3RvcmFnZSBtZW1vcnkgZm9yIGl0cwpvd24g YWxsb2NhdGlvbiwgd2hpY2ggd291bGQgbWFrZSB0aGF0IHRhZ3Mgc3RvcmFnZSBtZW1vcnkgdW5t b3ZhYmxlLCBhbmQKdGh1cyB1bnVzYWJsZSBmb3Igc3RvcmluZyB0YWdzLgoKTG9va2luZyBhdCBl YXJseV9pbml0X2R0X3NjYW5fbWVtb3J5KCksIGV2ZW4gaWYgYSAvbWVtb3J5IG5vZGUgaWYgbWFy a2VkIGF0CmhvdHBsdWdnYWJsZSwgbWVtYmxvY2sgd2lsbCBzdGlsbCB1c2UgaXQsIHVubGVzcyAi bW92YWJsZV9ub2RlIiBpcyBzZXQgb24KdGhlIGtlcm5lbCBjb21tYW5kIGxpbmUuCgpUaGF0J3Mg dGhlIHJlYXNvbiB3aHkgSSdtIG5vdCBkZXNjcmliaW5nIHRhZyBzdG9yYWdlIGluIGEgL21lbW9y eSBub2RlLiAgSXMKdGhlcmUgd2F5IHRvIHRlbGwgdGhlIG1lbWJsb2NrIGFsbG9jYXRvciBub3Qg dG8gdXNlIG1lbW9yeSBmcm9tIGEgL21lbW9yeQpub2RlPwoKPiAKPiBMZXQgbWUgZ2l2ZSBhbiBl eGFtcGxlLiBQcmVzdW1hYmx5IHVzaW5nIE1URSBhdCBhbGwgaXMgY29uZmlndXJhYmxlLgo+IElm IHlvdSBib290IGEga2VybmVsIHdpdGggTVRFIGRpc2FibGVkIChvciBvbGRlciBhbmQgbm90IHN1 cHBvcnRpbmcKPiBpdCksIHRoZW4gSSdkIGFzc3VtZSB5b3UnZCB3YW50IHRvIHVzZSB0aGUgdGFn IHN0b3JhZ2UgZm9yIHJlZ3VsYXIKPiBtZW1vcnkuIFdlbGwsIElmIHRhZyBzdG9yYWdlIGlzIGFs cmVhZHkgcGFydCBvZiAvbWVtb3J5LCB0aGVuIGFsbCB5b3UKPiBoYXZlIHRvIGRvIGlzIGlnbm9y ZSB0aGUgdGFnIHJlc2VydmVkLW1lbW9yeSByZWdpb24uIFR3ZWFraW5nIHRoZQo+IG1lbW9yeSBu b2RlcyB3b3VsZCBiZSBtb3JlIHdvcmsuCgpSaWdodCBub3csIG1lbW9yeSBpcyBhZGRlZCB2aWEg bWVtYmxvY2tfcmVzZXJ2ZSgpLCBhbmQgaWYgTVRFIGlzIGRpc2FibGVkCihmb3IgZXhhbXBsZSwg dmlhIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lKSwgdGhlIGNvZGUgY2FsbHMKZnJlZV9yZXNlcnZl ZF9wYWdlKCkgZm9yIGVhY2ggdGFnIHN0b3JhZ2UgcGFnZS4gSSBmaW5kIHRoYXQgc3RyYWlnaHRm b3dhcmQKdG8gaW1wbGVtZW50LgoKVGhhbmtzLApBbGV4Cgo+IAo+IAo+IEFsc28sIEkgc2hvdWxk IHBvaW50IG91dCB0aGF0IC9tZW1vcnkgYW5kIC9yZXNlcnZlZC1tZW1vcnkgbm9kZXMgYXJlCj4g bm90IHVzZWQgZm9yIFVFRkkgYm9vdC4KPiAKPiBSb2IKPiAKCl9fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0 CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFk ZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK