From mboxrd@z Thu Jan 1 00:00:00 1970 From: Dmitry Osipenko Subject: Re: [Regression 5.5-rc1] Extremely low GPU performance on NVIDIA Tegra20/30 Date: Tue, 28 Jan 2020 18:43:36 +0300 Message-ID: <8b1a4006-d680-e4a7-dc91-a746c30681e4@gmail.com> References: <20191213151045.GB222809@ulmo> <2f5c6fda-adf9-c6c3-7601-fa912813ce1f@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Return-path: In-Reply-To: <2f5c6fda-adf9-c6c3-7601-fa912813ce1f-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> Content-Language: en-US Sender: linux-tegra-owner-u79uwXL29TY76Z2rM5mHXA@public.gmane.org To: Thierry Reding Cc: "linux-tegra-u79uwXL29TY76Z2rM5mHXA@public.gmane.org" , DRI Development , Daniel Vetter , Dave Airlie List-Id: linux-tegra@vger.kernel.org 20.01.2020 05:53, Dmitry Osipenko пишет: > 13.12.2019 18:35, Dmitry Osipenko пишет: >> 13.12.2019 18:10, Thierry Reding пишет: >>> On Fri, Dec 13, 2019 at 12:25:33AM +0300, Dmitry Osipenko wrote: >>>> Hello Thierry, >>>> >>>> Commit [1] introduced a severe GPU performance regression on Tegra20 and >>>> Tegra30 using. >>>> >>>> [1] >>>> https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?h=v5.5-rc1&id=fa6661b7aa0b52073681b0d26742650c8cbd30f3 >>>> >>>> Interestingly the performance is okay on Tegra30 if >>>> CONFIG_TEGRA_HOST1X_FIREWALL=n, but that doesn't make difference for >>>> Tegra20. >>>> >>>> I was telling you about this problem on the #tegra IRC sometime ago and >>>> you asked to report it in a trackable form, so finally here it is. >>>> >>>> You could reproduce the problem by running [2] like this >>>> `grate/texture-filter -f -s` which should produce over 100 FPS for 720p >>>> display resolution and currently it's ~11 FPS. >>>> >>>> [2] >>>> https://github.com/grate-driver/grate/blob/master/tests/grate/texture-filter.c >>>> >>>> Previously I was seeing some memory errors coming from Host1x DMA, but >>>> don't see any errors at all right now. >>>> >>>> I don't see anything done horribly wrong in the offending commit. >>>> >>>> Unfortunately I couldn't dedicate enough time to sit down and debug the >>>> problem thoroughly yet. Please let me know if you'll find a solution, >>>> I'll be happy to test it. Thanks in advance! >>> >>> I suspect that the problem here is that we're now using the DMA API, >>> which causes the 32-bit ARM DMA/IOMMU glue to be used. I vaguely recall >>> that that code doesn't coalesce entries in the SG table, so we may end >>> up calling iommu_map() a lot of times, and miss out on much of the >>> advantages that the ->iotlb_sync_map() gives us on Tegra20. >>> >>> At the same time dma_map_sg() will flush caches, which we didn't do >>> before. This we should be able to improve by passing the attribute >>> DMA_ATTR_SKIP_CPU_SYNC to dma_map_sg() when we know that the cache >>> maintenance isn't needed. >>> >>> And while thinking about it, one other difference is that with the DMA >>> API we actually map/unmap the buffers for every submission. This is >>> because the DMA API semantics require that buffers be mapped/unmapped >>> every time you use them. Previously we would basically only map each >>> buffer once (at allocation time) and only have to deal with cache >>> maintenance, so the overhead per submission was drastically lower. >>> >>> If DMA_ATTR_SKIP_CPU_SYNC doesn't give us enough of an improvement, we >>> may want to restore explicit IOMMU usage, at least on anything prior to >>> Tegra124 where we're unlikely to ever use different IOMMU domains anyway >>> (because they are such a scarce resource). >> >> Tegra20 doesn't use IOMMU in a vanilla upstream kernel (yet), so I don't >> think that it's the root of the problem. Disabling IOMMU for Tegra30 >> also didn't help (IIRC). >> >> The offending patch shouldn't change anything in regards to the DMA API, >> if I'm not missing something. Strange.. >> >> Please keep me up-to-date! >> > > Hello Thierry, > > I took another look at the problem and here what was found: > > 1) The "Optionally attach clients to the IOMMU" patch is wrong because: > > 1. host1x_drm_probe() is invoked *before* any of the > host1x_client_iommu_attach() happens, so there is no way > on earth the 'use_explicit_iommu' could ever be true. > > 2. Not attaching DRM clients to IOMMU if HOST1x isn't > attached is wrong because it never attached in the case > of CONFIG_TEGRA_HOST1X_FIREWALL=y [1] and this also > makes no sense for T20/30 that do not support LPAE. > > [1] > https://elixir.bootlin.com/linux/v5.5-rc6/source/drivers/gpu/host1x/dev.c#L205 > > 2) Because of the above problems, the DRM clients are erroneously not > getting attached to IOMMU at all and thus CMA is getting used for the BO > allocations. Here comes the problems introduced by the "gpu: host1x: > Support DMA mapping of buffers" patch, which makes DMA API to perform > CPU cache maintenance on each job submission and apparently this is > super bad for performance. This also makes no sense in comparison to the > case of enabled IOMMU, where cache maintenance isn't performed at all > (like it should be). > > Please let me know if you're going to fix the problems or if you'd > prefer me to create the patches. > > Here is a draft of the fix for #2, it doesn't cover case of imported > buffers (which should be statically mapped, IIUC): ... The v5.5 is released now with the unusable GPU driver. Thierry, could please let me know if you're planning to do something about it? Should I help? 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 X-Spam-Level: X-Spam-Status: No, score=-6.8 required=3.0 tests=DKIM_ADSP_CUSTOM_MED, DKIM_INVALID,DKIM_SIGNED,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,MENTIONS_GIT_HOSTING, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id D082CC33CB2 for ; Wed, 29 Jan 2020 08:06:26 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id A819220702 for ; Wed, 29 Jan 2020 08:06:26 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="a0Z8FyCO" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org A819220702 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 726626F471; Wed, 29 Jan 2020 08:06:23 +0000 (UTC) Received: from mail-lf1-x141.google.com (mail-lf1-x141.google.com [IPv6:2a00:1450:4864:20::141]) by gabe.freedesktop.org (Postfix) with ESMTPS id 3C8D76EE86 for ; Tue, 28 Jan 2020 15:43:39 +0000 (UTC) Received: by mail-lf1-x141.google.com with SMTP id l18so9462901lfc.1 for ; Tue, 28 Jan 2020 07:43:39 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=subject:from:to:cc:references:message-id:date:user-agent :mime-version:in-reply-to:content-language:content-transfer-encoding; bh=R5kBMh4d+jF6Iwky3860+MgFWMq82eO07pKtL2+tzsM=; b=a0Z8FyCOuJQvUGgNYXLxA+nsU5OiE2CApN7uYm1l2MMj+oLoMuD1Y4Dm2qLddOwL3U 6y9LNcq4De2dvyrqkNpqYz30rmDHqy4ihIQ1DLsx/wyci8n9nJNyzynhGBG8nbHx1frl s9P7Y/RhODHOt5tugCfFjm7eSygyquDFqa/9dz8F4+JaOmJID6vaS4WMkCncnMfemrYF B4DurJqTDQhlA6usS0sDaRplkxl8k6DxD4pzhkq104NZKbYfK8VOxHdJ/+2BTdHvtVtR gRtu1FFZ4f/PsGclIIxlQ0M45/tZMn73eTGu59Yx0rcg5OINHONKBzoiFWnYaRFxIJjt hZvQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:from:to:cc:references:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=R5kBMh4d+jF6Iwky3860+MgFWMq82eO07pKtL2+tzsM=; b=MNRPXCIKT07myF4iXX3mhvYsx8w9251tpVzm+xxjgMRS0nJxRc3LIL9zu77VTflgoc lU5BACpb3H/9o4tMxj+P9y0lv3t4oG7D7qZsUfTX8t4L1OGoR3QNgMDwOfysK/3Worgk z4wPEVst4CA67IHqpJx1cNEDt2AGmw67RmTIffqPKmqGrwlECeVV9oBaDJtAuhDsWS4+ kf/3YJIsCwYbfHOOp4+hHeXch9UoVhclR2k9L8dXtQwb95W95QNoM8p0gu3VKBdlN2EF /t5ExvZ4kZhO38zZs856fCEoyt//4QslogibNramNNoEZocDI5JJlvVMAeY9AvJIEiWA CwJA== X-Gm-Message-State: APjAAAVH8sA/+3ZuufFoA1nPcJRoZKwL6XTmG2dqHQ0LtFylssAt/aEF 7+wpnZSwH7Ts1L2HOp6vWwk= X-Google-Smtp-Source: APXvYqxF6M/0B/ST9lUthVvxoetkET/HLrNq11A1249kcdoCCadAHqoszgPAL/oVpnZHgMf2ehBP7A== X-Received: by 2002:a19:3f07:: with SMTP id m7mr2748099lfa.61.1580226217514; Tue, 28 Jan 2020 07:43:37 -0800 (PST) Received: from [192.168.2.145] (79-139-233-37.dynamic.spd-mgts.ru. [79.139.233.37]) by smtp.googlemail.com with ESMTPSA id f11sm12347370lfa.9.2020.01.28.07.43.36 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Tue, 28 Jan 2020 07:43:36 -0800 (PST) Subject: Re: [Regression 5.5-rc1] Extremely low GPU performance on NVIDIA Tegra20/30 From: Dmitry Osipenko To: Thierry Reding References: <20191213151045.GB222809@ulmo> <2f5c6fda-adf9-c6c3-7601-fa912813ce1f@gmail.com> Message-ID: <8b1a4006-d680-e4a7-dc91-a746c30681e4@gmail.com> Date: Tue, 28 Jan 2020 18:43:36 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.3.0 MIME-Version: 1.0 In-Reply-To: <2f5c6fda-adf9-c6c3-7601-fa912813ce1f@gmail.com> Content-Language: en-US X-Mailman-Approved-At: Wed, 29 Jan 2020 08:06:22 +0000 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: "linux-tegra@vger.kernel.org" , DRI Development Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" MjAuMDEuMjAyMCAwNTo1MywgRG1pdHJ5IE9zaXBlbmtvINC/0LjRiNC10YI6Cj4gMTMuMTIuMjAx OSAxODozNSwgRG1pdHJ5IE9zaXBlbmtvINC/0LjRiNC10YI6Cj4+IDEzLjEyLjIwMTkgMTg6MTAs IFRoaWVycnkgUmVkaW5nINC/0LjRiNC10YI6Cj4+PiBPbiBGcmksIERlYyAxMywgMjAxOSBhdCAx MjoyNTozM0FNICswMzAwLCBEbWl0cnkgT3NpcGVua28gd3JvdGU6Cj4+Pj4gSGVsbG8gVGhpZXJy eSwKPj4+Pgo+Pj4+IENvbW1pdCBbMV0gaW50cm9kdWNlZCBhIHNldmVyZSBHUFUgcGVyZm9ybWFu Y2UgcmVncmVzc2lvbiBvbiBUZWdyYTIwIGFuZAo+Pj4+IFRlZ3JhMzAgdXNpbmcuCj4+Pj4KPj4+ PiBbMV0KPj4+PiBodHRwczovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dp dC90b3J2YWxkcy9saW51eC5naXQvY29tbWl0Lz9oPXY1LjUtcmMxJmlkPWZhNjY2MWI3YWEwYjUy MDczNjgxYjBkMjY3NDI2NTBjOGNiZDMwZjMKPj4+Pgo+Pj4+IEludGVyZXN0aW5nbHkgdGhlIHBl cmZvcm1hbmNlIGlzIG9rYXkgb24gVGVncmEzMCBpZgo+Pj4+IENPTkZJR19URUdSQV9IT1NUMVhf RklSRVdBTEw9biwgYnV0IHRoYXQgZG9lc24ndCBtYWtlIGRpZmZlcmVuY2UgZm9yCj4+Pj4gVGVn cmEyMC4KPj4+Pgo+Pj4+IEkgd2FzIHRlbGxpbmcgeW91IGFib3V0IHRoaXMgcHJvYmxlbSBvbiB0 aGUgI3RlZ3JhIElSQyBzb21ldGltZSBhZ28gYW5kCj4+Pj4geW91IGFza2VkIHRvIHJlcG9ydCBp dCBpbiBhIHRyYWNrYWJsZSBmb3JtLCBzbyBmaW5hbGx5IGhlcmUgaXQgaXMuCj4+Pj4KPj4+PiBZ b3UgY291bGQgcmVwcm9kdWNlIHRoZSBwcm9ibGVtIGJ5IHJ1bm5pbmcgWzJdIGxpa2UgdGhpcwo+ Pj4+IGBncmF0ZS90ZXh0dXJlLWZpbHRlciAtZiAtc2Agd2hpY2ggc2hvdWxkIHByb2R1Y2Ugb3Zl ciAxMDAgRlBTIGZvciA3MjBwCj4+Pj4gZGlzcGxheSByZXNvbHV0aW9uIGFuZCBjdXJyZW50bHkg aXQncyB+MTEgRlBTLgo+Pj4+Cj4+Pj4gWzJdCj4+Pj4gaHR0cHM6Ly9naXRodWIuY29tL2dyYXRl LWRyaXZlci9ncmF0ZS9ibG9iL21hc3Rlci90ZXN0cy9ncmF0ZS90ZXh0dXJlLWZpbHRlci5jCj4+ Pj4KPj4+PiBQcmV2aW91c2x5IEkgd2FzIHNlZWluZyBzb21lIG1lbW9yeSBlcnJvcnMgY29taW5n IGZyb20gSG9zdDF4IERNQSwgYnV0Cj4+Pj4gZG9uJ3Qgc2VlIGFueSBlcnJvcnMgYXQgYWxsIHJp Z2h0IG5vdy4KPj4+Pgo+Pj4+IEkgZG9uJ3Qgc2VlIGFueXRoaW5nIGRvbmUgaG9ycmlibHkgd3Jv bmcgaW4gdGhlIG9mZmVuZGluZyBjb21taXQuCj4+Pj4KPj4+PiBVbmZvcnR1bmF0ZWx5IEkgY291 bGRuJ3QgZGVkaWNhdGUgZW5vdWdoIHRpbWUgdG8gc2l0IGRvd24gYW5kIGRlYnVnIHRoZQo+Pj4+ IHByb2JsZW0gdGhvcm91Z2hseSB5ZXQuIFBsZWFzZSBsZXQgbWUga25vdyBpZiB5b3UnbGwgZmlu ZCBhIHNvbHV0aW9uLAo+Pj4+IEknbGwgYmUgaGFwcHkgdG8gdGVzdCBpdC4gVGhhbmtzIGluIGFk dmFuY2UhCj4+Pgo+Pj4gSSBzdXNwZWN0IHRoYXQgdGhlIHByb2JsZW0gaGVyZSBpcyB0aGF0IHdl J3JlIG5vdyB1c2luZyB0aGUgRE1BIEFQSSwKPj4+IHdoaWNoIGNhdXNlcyB0aGUgMzItYml0IEFS TSBETUEvSU9NTVUgZ2x1ZSB0byBiZSB1c2VkLiBJIHZhZ3VlbHkgcmVjYWxsCj4+PiB0aGF0IHRo YXQgY29kZSBkb2Vzbid0IGNvYWxlc2NlIGVudHJpZXMgaW4gdGhlIFNHIHRhYmxlLCBzbyB3ZSBt YXkgZW5kCj4+PiB1cCBjYWxsaW5nIGlvbW11X21hcCgpIGEgbG90IG9mIHRpbWVzLCBhbmQgbWlz cyBvdXQgb24gbXVjaCBvZiB0aGUKPj4+IGFkdmFudGFnZXMgdGhhdCB0aGUgLT5pb3RsYl9zeW5j X21hcCgpIGdpdmVzIHVzIG9uIFRlZ3JhMjAuCj4+Pgo+Pj4gQXQgdGhlIHNhbWUgdGltZSBkbWFf bWFwX3NnKCkgd2lsbCBmbHVzaCBjYWNoZXMsIHdoaWNoIHdlIGRpZG4ndCBkbwo+Pj4gYmVmb3Jl LiBUaGlzIHdlIHNob3VsZCBiZSBhYmxlIHRvIGltcHJvdmUgYnkgcGFzc2luZyB0aGUgYXR0cmli dXRlCj4+PiBETUFfQVRUUl9TS0lQX0NQVV9TWU5DIHRvIGRtYV9tYXBfc2coKSB3aGVuIHdlIGtu b3cgdGhhdCB0aGUgY2FjaGUKPj4+IG1haW50ZW5hbmNlIGlzbid0IG5lZWRlZC4KPj4+Cj4+PiBB bmQgd2hpbGUgdGhpbmtpbmcgYWJvdXQgaXQsIG9uZSBvdGhlciBkaWZmZXJlbmNlIGlzIHRoYXQg d2l0aCB0aGUgRE1BCj4+PiBBUEkgd2UgYWN0dWFsbHkgbWFwL3VubWFwIHRoZSBidWZmZXJzIGZv ciBldmVyeSBzdWJtaXNzaW9uLiBUaGlzIGlzCj4+PiBiZWNhdXNlIHRoZSBETUEgQVBJIHNlbWFu dGljcyByZXF1aXJlIHRoYXQgYnVmZmVycyBiZSBtYXBwZWQvdW5tYXBwZWQKPj4+IGV2ZXJ5IHRp bWUgeW91IHVzZSB0aGVtLiBQcmV2aW91c2x5IHdlIHdvdWxkIGJhc2ljYWxseSBvbmx5IG1hcCBl YWNoCj4+PiBidWZmZXIgb25jZSAoYXQgYWxsb2NhdGlvbiB0aW1lKSBhbmQgb25seSBoYXZlIHRv IGRlYWwgd2l0aCBjYWNoZQo+Pj4gbWFpbnRlbmFuY2UsIHNvIHRoZSBvdmVyaGVhZCBwZXIgc3Vi bWlzc2lvbiB3YXMgZHJhc3RpY2FsbHkgbG93ZXIuCj4+Pgo+Pj4gSWYgRE1BX0FUVFJfU0tJUF9D UFVfU1lOQyBkb2Vzbid0IGdpdmUgdXMgZW5vdWdoIG9mIGFuIGltcHJvdmVtZW50LCB3ZQo+Pj4g bWF5IHdhbnQgdG8gcmVzdG9yZSBleHBsaWNpdCBJT01NVSB1c2FnZSwgYXQgbGVhc3Qgb24gYW55 dGhpbmcgcHJpb3IgdG8KPj4+IFRlZ3JhMTI0IHdoZXJlIHdlJ3JlIHVubGlrZWx5IHRvIGV2ZXIg dXNlIGRpZmZlcmVudCBJT01NVSBkb21haW5zIGFueXdheQo+Pj4gKGJlY2F1c2UgdGhleSBhcmUg c3VjaCBhIHNjYXJjZSByZXNvdXJjZSkuCj4+Cj4+IFRlZ3JhMjAgZG9lc24ndCB1c2UgSU9NTVUg aW4gYSB2YW5pbGxhIHVwc3RyZWFtIGtlcm5lbCAoeWV0KSwgc28gSSBkb24ndAo+PiB0aGluayB0 aGF0IGl0J3MgdGhlIHJvb3Qgb2YgdGhlIHByb2JsZW0uIERpc2FibGluZyBJT01NVSBmb3IgVGVn cmEzMAo+PiBhbHNvIGRpZG4ndCBoZWxwIChJSVJDKS4KPj4KPj4gVGhlIG9mZmVuZGluZyBwYXRj aCBzaG91bGRuJ3QgY2hhbmdlIGFueXRoaW5nIGluIHJlZ2FyZHMgdG8gdGhlIERNQSBBUEksCj4+ IGlmIEknbSBub3QgbWlzc2luZyBzb21ldGhpbmcuIFN0cmFuZ2UuLgo+Pgo+PiBQbGVhc2Uga2Vl cCBtZSB1cC10by1kYXRlIQo+Pgo+IAo+IEhlbGxvIFRoaWVycnksCj4gCj4gSSB0b29rIGFub3Ro ZXIgbG9vayBhdCB0aGUgcHJvYmxlbSBhbmQgaGVyZSB3aGF0IHdhcyBmb3VuZDoKPiAKPiAxKSBU aGUgIk9wdGlvbmFsbHkgYXR0YWNoIGNsaWVudHMgdG8gdGhlIElPTU1VIiBwYXRjaCBpcyB3cm9u ZyBiZWNhdXNlOgo+IAo+ICAgICAxLiBob3N0MXhfZHJtX3Byb2JlKCkgaXMgaW52b2tlZCAqYmVm b3JlKiBhbnkgb2YgdGhlCj4gICAgICAgIGhvc3QxeF9jbGllbnRfaW9tbXVfYXR0YWNoKCkgaGFw cGVucywgc28gdGhlcmUgaXMgbm8gd2F5Cj4gICAgICAgIG9uIGVhcnRoIHRoZSAndXNlX2V4cGxp Y2l0X2lvbW11JyBjb3VsZCBldmVyIGJlIHRydWUuCj4gCj4gICAgIDIuIE5vdCBhdHRhY2hpbmcg RFJNIGNsaWVudHMgdG8gSU9NTVUgaWYgSE9TVDF4IGlzbid0Cj4gICAgICAgIGF0dGFjaGVkIGlz IHdyb25nIGJlY2F1c2UgaXQgbmV2ZXIgYXR0YWNoZWQgaW4gdGhlIGNhc2UKPiAgICAgICAgb2Yg Q09ORklHX1RFR1JBX0hPU1QxWF9GSVJFV0FMTD15IFsxXSBhbmQgdGhpcyBhbHNvCj4gICAgICAg IG1ha2VzIG5vIHNlbnNlIGZvciBUMjAvMzAgdGhhdCBkbyBub3Qgc3VwcG9ydCBMUEFFLgo+IAo+ IFsxXQo+IGh0dHBzOi8vZWxpeGlyLmJvb3RsaW4uY29tL2xpbnV4L3Y1LjUtcmM2L3NvdXJjZS9k cml2ZXJzL2dwdS9ob3N0MXgvZGV2LmMjTDIwNQo+IAo+IDIpIEJlY2F1c2Ugb2YgdGhlIGFib3Zl IHByb2JsZW1zLCB0aGUgRFJNIGNsaWVudHMgYXJlIGVycm9uZW91c2x5IG5vdAo+IGdldHRpbmcg YXR0YWNoZWQgdG8gSU9NTVUgYXQgYWxsIGFuZCB0aHVzIENNQSBpcyBnZXR0aW5nIHVzZWQgZm9y IHRoZSBCTwo+IGFsbG9jYXRpb25zLiBIZXJlIGNvbWVzIHRoZSBwcm9ibGVtcyBpbnRyb2R1Y2Vk IGJ5IHRoZSAiZ3B1OiBob3N0MXg6Cj4gU3VwcG9ydCBETUEgbWFwcGluZyBvZiBidWZmZXJzIiBw YXRjaCwgd2hpY2ggbWFrZXMgRE1BIEFQSSB0byBwZXJmb3JtCj4gQ1BVIGNhY2hlIG1haW50ZW5h bmNlIG9uIGVhY2ggam9iIHN1Ym1pc3Npb24gYW5kIGFwcGFyZW50bHkgdGhpcyBpcwo+IHN1cGVy IGJhZCBmb3IgcGVyZm9ybWFuY2UuIFRoaXMgYWxzbyBtYWtlcyBubyBzZW5zZSBpbiBjb21wYXJp c29uIHRvIHRoZQo+IGNhc2Ugb2YgZW5hYmxlZCBJT01NVSwgd2hlcmUgY2FjaGUgbWFpbnRlbmFu Y2UgaXNuJ3QgcGVyZm9ybWVkIGF0IGFsbAo+IChsaWtlIGl0IHNob3VsZCBiZSkuCj4gCj4gUGxl YXNlIGxldCBtZSBrbm93IGlmIHlvdSdyZSBnb2luZyB0byBmaXggdGhlIHByb2JsZW1zIG9yIGlm IHlvdSdkCj4gcHJlZmVyIG1lIHRvIGNyZWF0ZSB0aGUgcGF0Y2hlcy4KPiAKPiBIZXJlIGlzIGEg ZHJhZnQgb2YgdGhlIGZpeCBmb3IgIzIsIGl0IGRvZXNuJ3QgY292ZXIgY2FzZSBvZiBpbXBvcnRl ZAo+IGJ1ZmZlcnMgKHdoaWNoIHNob3VsZCBiZSBzdGF0aWNhbGx5IG1hcHBlZCwgSUlVQyk6Ci4u LgoKVGhlIHY1LjUgaXMgcmVsZWFzZWQgbm93IHdpdGggdGhlIHVudXNhYmxlIEdQVSBkcml2ZXIu IFRoaWVycnksIGNvdWxkCnBsZWFzZSBsZXQgbWUga25vdyBpZiB5b3UncmUgcGxhbm5pbmcgdG8g ZG8gc29tZXRoaW5nIGFib3V0IGl0PyBTaG91bGQgSQpoZWxwPwpfX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fXwpkcmktZGV2ZWwgbWFpbGluZyBsaXN0CmRyaS1k ZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcv bWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWwK