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: Mon, 20 Jan 2020 05:53:03 +0300 Message-ID: <2f5c6fda-adf9-c6c3-7601-fa912813ce1f@gmail.com> References: <20191213151045.GB222809@ulmo> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Return-path: In-Reply-To: Content-Language: en-US Sender: linux-tegra-owner-u79uwXL29TY76Z2rM5mHXA@public.gmane.org To: Thierry Reding Cc: "linux-tegra-u79uwXL29TY76Z2rM5mHXA@public.gmane.org" , DRI Development List-Id: linux-tegra@vger.kernel.org 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): @@ -38,7 +38,7 @@ static struct sg_table *tegra_bo_pin(struct device *dev, struct host1x_bo *bo, * If we've manually mapped the buffer object through the IOMMU, make * sure to return the IOVA address of our mapping. */ - if (phys && obj->mm) { + if (phys && (obj->mm || obj->vaddr)) { *phys = obj->iova; return NULL; } diff --git a/drivers/gpu/host1x/job.c b/drivers/gpu/host1x/job.c index 25ca54de8fc5..69adfd66196b 100644 --- a/drivers/gpu/host1x/job.c +++ b/drivers/gpu/host1x/job.c @@ -108,7 +108,7 @@ static unsigned int pin_job(struct host1x *host, struct host1x_job *job) for (i = 0; i < job->num_relocs; i++) { struct host1x_reloc *reloc = &job->relocs[i]; - dma_addr_t phys_addr, *phys; + dma_addr_t phys_addr; struct sg_table *sgt; reloc->target.bo = host1x_bo_get(reloc->target.bo); @@ -117,12 +117,7 @@ static unsigned int pin_job(struct host1x *host, struct host1x_job *job) goto unpin; } - if (client->group) - phys = &phys_addr; - else - phys = NULL; - - sgt = host1x_bo_pin(dev, reloc->target.bo, phys); + sgt = host1x_bo_pin(dev, reloc->target.bo, &phys_addr); if (IS_ERR(sgt)) { err = PTR_ERR(sgt); goto unpin; @@ -184,7 +179,7 @@ static unsigned int pin_job(struct host1x *host, struct host1x_job *job) goto unpin; } - sgt = host1x_bo_pin(host->dev, g->bo, NULL); + sgt = host1x_bo_pin(host->dev, g->bo, &phys_addr); if (IS_ERR(sgt)) { err = PTR_ERR(sgt); goto unpin; @@ -214,7 +209,7 @@ static unsigned int pin_job(struct host1x *host, struct host1x_job *job) job->unpins[job->num_unpins].size = gather_size; phys_addr = iova_dma_addr(&host->iova, alloc); - } else { + } else if (sgt) { err = dma_map_sg(host->dev, sgt->sgl, sgt->nents, DMA_TO_DEVICE); if (!err) { 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=-9.8 required=3.0 tests=DKIM_ADSP_CUSTOM_MED, DKIM_INVALID,DKIM_SIGNED,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, MENTIONS_GIT_HOSTING,SPF_HELO_NONE,SPF_PASS,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 03A4BC33CA1 for ; Mon, 20 Jan 2020 08:59:02 +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 CF3D92077C for ; Mon, 20 Jan 2020 08:59:01 +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="Fmg3r5zJ" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org CF3D92077C 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 A31F66E874; Mon, 20 Jan 2020 08:58:39 +0000 (UTC) Received: from mail-lf1-x142.google.com (mail-lf1-x142.google.com [IPv6:2a00:1450:4864:20::142]) by gabe.freedesktop.org (Postfix) with ESMTPS id A9C116E07B for ; Mon, 20 Jan 2020 02:53:09 +0000 (UTC) Received: by mail-lf1-x142.google.com with SMTP id v201so22762124lfa.11 for ; Sun, 19 Jan 2020 18:53:09 -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=o99oVRR+Gozy0Lsfxk3TOE1JXeY9TtYm9oIacziyd+c=; b=Fmg3r5zJwmStvkvSE6CYIx5DAV7ue5NoH+pbDkw2RCK/0qIIm3L9yfzzr3AoIdLpz+ G25EYju2wW16V0B7bO7QpaHdy/27UCuh0hEEHzX230R0aIITAzM8XCEVGBwNUySMd/Qp rSx1NPmEEErdn5/rG13XfVLV10ep8C0ggu+0X+Gfj9puUXRtuPm8+ZGJ96LpJCKfCnBi FqYgQlSG5mgj1St1XqDEbO+Xc3APjbg2KJ1CR7KpbuJmlTAl+5mMEMIKRq/BiS0enyXz 5RI6jiU4Y9sdLgAF/Ze2Faq+njZdk+eKuKl8oeEHJAn2Pm79oITGdxlvsg1+ELeVmtjP tYog== 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=o99oVRR+Gozy0Lsfxk3TOE1JXeY9TtYm9oIacziyd+c=; b=cW5If8yMPszLasqneTNcsIbMf9a0/AyfSkcNrYcr6wFQopFL/KkLnPX4KNojdF2/2R Prbtr8U/Iw439awjPeErfaA98EINnQIp+7Td2NNRVDOlNR7WIYS9hIBm5GdfWG7QVMHc X63y9nXpaybnIRgvj/XUWbY4LU6HeWB2HYth0l2bxrbErlA6V2CBNYZ0WUjNIiskikzi pQF1fTa6bS+8uSgn7gS8yabB+PiMmbTStuca6U8TkP2prdy4k/Kx4MJfjelcDtGf1tE3 hdEKNFtCzgxvCKn65sLkgkgbUVdLIYXouEt+rlVu/pqHI3QfHdV5sz9mh4Ri9XBkOLC8 Jp4g== X-Gm-Message-State: APjAAAXBhRwRtvdaEnLg1B78sxRF/vzsLL7B/5jZelpueFjccrLiN99Q cstFkxcQRT/YXThLeaOytOCFQoGj X-Google-Smtp-Source: APXvYqzK9wX6F5+UIF2TOH7GYUJkjQCAQ7oXKTcxm1fHMOG1qsv0TifemPYWTMw5ZN0JpzXnVZTyZg== X-Received: by 2002:a19:491a:: with SMTP id w26mr11569593lfa.98.1579488787677; Sun, 19 Jan 2020 18:53:07 -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 b190sm15987206lfd.39.2020.01.19.18.53.06 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Sun, 19 Jan 2020 18:53:06 -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> Message-ID: <2f5c6fda-adf9-c6c3-7601-fa912813ce1f@gmail.com> Date: Mon, 20 Jan 2020 05:53:03 +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: Content-Language: en-US X-Mailman-Approved-At: Mon, 20 Jan 2020 08:58:36 +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" MTMuMTIuMjAxOSAxODozNSwgRG1pdHJ5IE9zaXBlbmtvINC/0LjRiNC10YI6Cj4gMTMuMTIuMjAx OSAxODoxMCwgVGhpZXJyeSBSZWRpbmcg0L/QuNGI0LXRgjoKPj4gT24gRnJpLCBEZWMgMTMsIDIw MTkgYXQgMTI6MjU6MzNBTSArMDMwMCwgRG1pdHJ5IE9zaXBlbmtvIHdyb3RlOgo+Pj4gSGVsbG8g VGhpZXJyeSwKPj4+Cj4+PiBDb21taXQgWzFdIGludHJvZHVjZWQgYSBzZXZlcmUgR1BVIHBlcmZv cm1hbmNlIHJlZ3Jlc3Npb24gb24gVGVncmEyMCBhbmQKPj4+IFRlZ3JhMzAgdXNpbmcuCj4+Pgo+ Pj4gWzFdCj4+PiBodHRwczovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dp dC90b3J2YWxkcy9saW51eC5naXQvY29tbWl0Lz9oPXY1LjUtcmMxJmlkPWZhNjY2MWI3YWEwYjUy MDczNjgxYjBkMjY3NDI2NTBjOGNiZDMwZjMKPj4+Cj4+PiBJbnRlcmVzdGluZ2x5IHRoZSBwZXJm b3JtYW5jZSBpcyBva2F5IG9uIFRlZ3JhMzAgaWYKPj4+IENPTkZJR19URUdSQV9IT1NUMVhfRklS RVdBTEw9biwgYnV0IHRoYXQgZG9lc24ndCBtYWtlIGRpZmZlcmVuY2UgZm9yCj4+PiBUZWdyYTIw Lgo+Pj4KPj4+IEkgd2FzIHRlbGxpbmcgeW91IGFib3V0IHRoaXMgcHJvYmxlbSBvbiB0aGUgI3Rl Z3JhIElSQyBzb21ldGltZSBhZ28gYW5kCj4+PiB5b3UgYXNrZWQgdG8gcmVwb3J0IGl0IGluIGEg dHJhY2thYmxlIGZvcm0sIHNvIGZpbmFsbHkgaGVyZSBpdCBpcy4KPj4+Cj4+PiBZb3UgY291bGQg cmVwcm9kdWNlIHRoZSBwcm9ibGVtIGJ5IHJ1bm5pbmcgWzJdIGxpa2UgdGhpcwo+Pj4gYGdyYXRl L3RleHR1cmUtZmlsdGVyIC1mIC1zYCB3aGljaCBzaG91bGQgcHJvZHVjZSBvdmVyIDEwMCBGUFMg Zm9yIDcyMHAKPj4+IGRpc3BsYXkgcmVzb2x1dGlvbiBhbmQgY3VycmVudGx5IGl0J3MgfjExIEZQ Uy4KPj4+Cj4+PiBbMl0KPj4+IGh0dHBzOi8vZ2l0aHViLmNvbS9ncmF0ZS1kcml2ZXIvZ3JhdGUv YmxvYi9tYXN0ZXIvdGVzdHMvZ3JhdGUvdGV4dHVyZS1maWx0ZXIuYwo+Pj4KPj4+IFByZXZpb3Vz bHkgSSB3YXMgc2VlaW5nIHNvbWUgbWVtb3J5IGVycm9ycyBjb21pbmcgZnJvbSBIb3N0MXggRE1B LCBidXQKPj4+IGRvbid0IHNlZSBhbnkgZXJyb3JzIGF0IGFsbCByaWdodCBub3cuCj4+Pgo+Pj4g SSBkb24ndCBzZWUgYW55dGhpbmcgZG9uZSBob3JyaWJseSB3cm9uZyBpbiB0aGUgb2ZmZW5kaW5n IGNvbW1pdC4KPj4+Cj4+PiBVbmZvcnR1bmF0ZWx5IEkgY291bGRuJ3QgZGVkaWNhdGUgZW5vdWdo IHRpbWUgdG8gc2l0IGRvd24gYW5kIGRlYnVnIHRoZQo+Pj4gcHJvYmxlbSB0aG9yb3VnaGx5IHll dC4gUGxlYXNlIGxldCBtZSBrbm93IGlmIHlvdSdsbCBmaW5kIGEgc29sdXRpb24sCj4+PiBJJ2xs IGJlIGhhcHB5IHRvIHRlc3QgaXQuIFRoYW5rcyBpbiBhZHZhbmNlIQo+Pgo+PiBJIHN1c3BlY3Qg dGhhdCB0aGUgcHJvYmxlbSBoZXJlIGlzIHRoYXQgd2UncmUgbm93IHVzaW5nIHRoZSBETUEgQVBJ LAo+PiB3aGljaCBjYXVzZXMgdGhlIDMyLWJpdCBBUk0gRE1BL0lPTU1VIGdsdWUgdG8gYmUgdXNl ZC4gSSB2YWd1ZWx5IHJlY2FsbAo+PiB0aGF0IHRoYXQgY29kZSBkb2Vzbid0IGNvYWxlc2NlIGVu dHJpZXMgaW4gdGhlIFNHIHRhYmxlLCBzbyB3ZSBtYXkgZW5kCj4+IHVwIGNhbGxpbmcgaW9tbXVf bWFwKCkgYSBsb3Qgb2YgdGltZXMsIGFuZCBtaXNzIG91dCBvbiBtdWNoIG9mIHRoZQo+PiBhZHZh bnRhZ2VzIHRoYXQgdGhlIC0+aW90bGJfc3luY19tYXAoKSBnaXZlcyB1cyBvbiBUZWdyYTIwLgo+ Pgo+PiBBdCB0aGUgc2FtZSB0aW1lIGRtYV9tYXBfc2coKSB3aWxsIGZsdXNoIGNhY2hlcywgd2hp Y2ggd2UgZGlkbid0IGRvCj4+IGJlZm9yZS4gVGhpcyB3ZSBzaG91bGQgYmUgYWJsZSB0byBpbXBy b3ZlIGJ5IHBhc3NpbmcgdGhlIGF0dHJpYnV0ZQo+PiBETUFfQVRUUl9TS0lQX0NQVV9TWU5DIHRv IGRtYV9tYXBfc2coKSB3aGVuIHdlIGtub3cgdGhhdCB0aGUgY2FjaGUKPj4gbWFpbnRlbmFuY2Ug aXNuJ3QgbmVlZGVkLgo+Pgo+PiBBbmQgd2hpbGUgdGhpbmtpbmcgYWJvdXQgaXQsIG9uZSBvdGhl ciBkaWZmZXJlbmNlIGlzIHRoYXQgd2l0aCB0aGUgRE1BCj4+IEFQSSB3ZSBhY3R1YWxseSBtYXAv dW5tYXAgdGhlIGJ1ZmZlcnMgZm9yIGV2ZXJ5IHN1Ym1pc3Npb24uIFRoaXMgaXMKPj4gYmVjYXVz ZSB0aGUgRE1BIEFQSSBzZW1hbnRpY3MgcmVxdWlyZSB0aGF0IGJ1ZmZlcnMgYmUgbWFwcGVkL3Vu bWFwcGVkCj4+IGV2ZXJ5IHRpbWUgeW91IHVzZSB0aGVtLiBQcmV2aW91c2x5IHdlIHdvdWxkIGJh c2ljYWxseSBvbmx5IG1hcCBlYWNoCj4+IGJ1ZmZlciBvbmNlIChhdCBhbGxvY2F0aW9uIHRpbWUp IGFuZCBvbmx5IGhhdmUgdG8gZGVhbCB3aXRoIGNhY2hlCj4+IG1haW50ZW5hbmNlLCBzbyB0aGUg b3ZlcmhlYWQgcGVyIHN1Ym1pc3Npb24gd2FzIGRyYXN0aWNhbGx5IGxvd2VyLgo+Pgo+PiBJZiBE TUFfQVRUUl9TS0lQX0NQVV9TWU5DIGRvZXNuJ3QgZ2l2ZSB1cyBlbm91Z2ggb2YgYW4gaW1wcm92 ZW1lbnQsIHdlCj4+IG1heSB3YW50IHRvIHJlc3RvcmUgZXhwbGljaXQgSU9NTVUgdXNhZ2UsIGF0 IGxlYXN0IG9uIGFueXRoaW5nIHByaW9yIHRvCj4+IFRlZ3JhMTI0IHdoZXJlIHdlJ3JlIHVubGlr ZWx5IHRvIGV2ZXIgdXNlIGRpZmZlcmVudCBJT01NVSBkb21haW5zIGFueXdheQo+PiAoYmVjYXVz ZSB0aGV5IGFyZSBzdWNoIGEgc2NhcmNlIHJlc291cmNlKS4KPiAKPiBUZWdyYTIwIGRvZXNuJ3Qg dXNlIElPTU1VIGluIGEgdmFuaWxsYSB1cHN0cmVhbSBrZXJuZWwgKHlldCksIHNvIEkgZG9uJ3QK PiB0aGluayB0aGF0IGl0J3MgdGhlIHJvb3Qgb2YgdGhlIHByb2JsZW0uIERpc2FibGluZyBJT01N VSBmb3IgVGVncmEzMAo+IGFsc28gZGlkbid0IGhlbHAgKElJUkMpLgo+IAo+IFRoZSBvZmZlbmRp bmcgcGF0Y2ggc2hvdWxkbid0IGNoYW5nZSBhbnl0aGluZyBpbiByZWdhcmRzIHRvIHRoZSBETUEg QVBJLAo+IGlmIEknbSBub3QgbWlzc2luZyBzb21ldGhpbmcuIFN0cmFuZ2UuLgo+IAo+IFBsZWFz ZSBrZWVwIG1lIHVwLXRvLWRhdGUhCj4gCgpIZWxsbyBUaGllcnJ5LAoKSSB0b29rIGFub3RoZXIg bG9vayBhdCB0aGUgcHJvYmxlbSBhbmQgaGVyZSB3aGF0IHdhcyBmb3VuZDoKCjEpIFRoZSAiT3B0 aW9uYWxseSBhdHRhY2ggY2xpZW50cyB0byB0aGUgSU9NTVUiIHBhdGNoIGlzIHdyb25nIGJlY2F1 c2U6CgogICAgMS4gaG9zdDF4X2RybV9wcm9iZSgpIGlzIGludm9rZWQgKmJlZm9yZSogYW55IG9m IHRoZQogICAgICAgaG9zdDF4X2NsaWVudF9pb21tdV9hdHRhY2goKSBoYXBwZW5zLCBzbyB0aGVy ZSBpcyBubyB3YXkKICAgICAgIG9uIGVhcnRoIHRoZSAndXNlX2V4cGxpY2l0X2lvbW11JyBjb3Vs ZCBldmVyIGJlIHRydWUuCgogICAgMi4gTm90IGF0dGFjaGluZyBEUk0gY2xpZW50cyB0byBJT01N VSBpZiBIT1NUMXggaXNuJ3QKICAgICAgIGF0dGFjaGVkIGlzIHdyb25nIGJlY2F1c2UgaXQgbmV2 ZXIgYXR0YWNoZWQgaW4gdGhlIGNhc2UKICAgICAgIG9mIENPTkZJR19URUdSQV9IT1NUMVhfRklS RVdBTEw9eSBbMV0gYW5kIHRoaXMgYWxzbwogICAgICAgbWFrZXMgbm8gc2Vuc2UgZm9yIFQyMC8z MCB0aGF0IGRvIG5vdCBzdXBwb3J0IExQQUUuCgpbMV0KaHR0cHM6Ly9lbGl4aXIuYm9vdGxpbi5j b20vbGludXgvdjUuNS1yYzYvc291cmNlL2RyaXZlcnMvZ3B1L2hvc3QxeC9kZXYuYyNMMjA1Cgoy KSBCZWNhdXNlIG9mIHRoZSBhYm92ZSBwcm9ibGVtcywgdGhlIERSTSBjbGllbnRzIGFyZSBlcnJv bmVvdXNseSBub3QKZ2V0dGluZyBhdHRhY2hlZCB0byBJT01NVSBhdCBhbGwgYW5kIHRodXMgQ01B IGlzIGdldHRpbmcgdXNlZCBmb3IgdGhlIEJPCmFsbG9jYXRpb25zLiBIZXJlIGNvbWVzIHRoZSBw cm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IHRoZSAiZ3B1OiBob3N0MXg6ClN1cHBvcnQgRE1BIG1hcHBp bmcgb2YgYnVmZmVycyIgcGF0Y2gsIHdoaWNoIG1ha2VzIERNQSBBUEkgdG8gcGVyZm9ybQpDUFUg Y2FjaGUgbWFpbnRlbmFuY2Ugb24gZWFjaCBqb2Igc3VibWlzc2lvbiBhbmQgYXBwYXJlbnRseSB0 aGlzIGlzCnN1cGVyIGJhZCBmb3IgcGVyZm9ybWFuY2UuIFRoaXMgYWxzbyBtYWtlcyBubyBzZW5z ZSBpbiBjb21wYXJpc29uIHRvIHRoZQpjYXNlIG9mIGVuYWJsZWQgSU9NTVUsIHdoZXJlIGNhY2hl IG1haW50ZW5hbmNlIGlzbid0IHBlcmZvcm1lZCBhdCBhbGwKKGxpa2UgaXQgc2hvdWxkIGJlKS4K ClBsZWFzZSBsZXQgbWUga25vdyBpZiB5b3UncmUgZ29pbmcgdG8gZml4IHRoZSBwcm9ibGVtcyBv ciBpZiB5b3UnZApwcmVmZXIgbWUgdG8gY3JlYXRlIHRoZSBwYXRjaGVzLgoKSGVyZSBpcyBhIGRy YWZ0IG9mIHRoZSBmaXggZm9yICMyLCBpdCBkb2Vzbid0IGNvdmVyIGNhc2Ugb2YgaW1wb3J0ZWQK YnVmZmVycyAod2hpY2ggc2hvdWxkIGJlIHN0YXRpY2FsbHkgbWFwcGVkLCBJSVVDKToKCkBAIC0z OCw3ICszOCw3IEBAIHN0YXRpYyBzdHJ1Y3Qgc2dfdGFibGUgKnRlZ3JhX2JvX3BpbihzdHJ1Y3Qg ZGV2aWNlCipkZXYsIHN0cnVjdCBob3N0MXhfYm8gKmJvLAogICAgICAgICAqIElmIHdlJ3ZlIG1h bnVhbGx5IG1hcHBlZCB0aGUgYnVmZmVyIG9iamVjdCB0aHJvdWdoIHRoZSBJT01NVSwKbWFrZQog ICAgICAgICAqIHN1cmUgdG8gcmV0dXJuIHRoZSBJT1ZBIGFkZHJlc3Mgb2Ygb3VyIG1hcHBpbmcu CiAgICAgICAgICovCi0gICAgICAgaWYgKHBoeXMgJiYgb2JqLT5tbSkgeworICAgICAgIGlmIChw aHlzICYmIChvYmotPm1tIHx8IG9iai0+dmFkZHIpKSB7CiAgICAgICAgICAgICAgICAqcGh5cyA9 IG9iai0+aW92YTsKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgIH0KZGlmZiAt LWdpdCBhL2RyaXZlcnMvZ3B1L2hvc3QxeC9qb2IuYyBiL2RyaXZlcnMvZ3B1L2hvc3QxeC9qb2Iu YwppbmRleCAyNWNhNTRkZThmYzUuLjY5YWRmZDY2MTk2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9n cHUvaG9zdDF4L2pvYi5jCisrKyBiL2RyaXZlcnMvZ3B1L2hvc3QxeC9qb2IuYwpAQCAtMTA4LDcg KzEwOCw3IEBAIHN0YXRpYyB1bnNpZ25lZCBpbnQgcGluX2pvYihzdHJ1Y3QgaG9zdDF4ICpob3N0 LApzdHJ1Y3QgaG9zdDF4X2pvYiAqam9iKQoKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgam9iLT5u dW1fcmVsb2NzOyBpKyspIHsKICAgICAgICAgICAgICAgIHN0cnVjdCBob3N0MXhfcmVsb2MgKnJl bG9jID0gJmpvYi0+cmVsb2NzW2ldOwotICAgICAgICAgICAgICAgZG1hX2FkZHJfdCBwaHlzX2Fk ZHIsICpwaHlzOworICAgICAgICAgICAgICAgZG1hX2FkZHJfdCBwaHlzX2FkZHI7CiAgICAgICAg ICAgICAgICBzdHJ1Y3Qgc2dfdGFibGUgKnNndDsKCiAgICAgICAgICAgICAgICByZWxvYy0+dGFy Z2V0LmJvID0gaG9zdDF4X2JvX2dldChyZWxvYy0+dGFyZ2V0LmJvKTsKQEAgLTExNywxMiArMTE3 LDcgQEAgc3RhdGljIHVuc2lnbmVkIGludCBwaW5fam9iKHN0cnVjdCBob3N0MXggKmhvc3QsCnN0 cnVjdCBob3N0MXhfam9iICpqb2IpCiAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gdW5waW47 CiAgICAgICAgICAgICAgICB9CgotICAgICAgICAgICAgICAgaWYgKGNsaWVudC0+Z3JvdXApCi0g ICAgICAgICAgICAgICAgICAgICAgIHBoeXMgPSAmcGh5c19hZGRyOwotICAgICAgICAgICAgICAg ZWxzZQotICAgICAgICAgICAgICAgICAgICAgICBwaHlzID0gTlVMTDsKLQotICAgICAgICAgICAg ICAgc2d0ID0gaG9zdDF4X2JvX3BpbihkZXYsIHJlbG9jLT50YXJnZXQuYm8sIHBoeXMpOworICAg ICAgICAgICAgICAgc2d0ID0gaG9zdDF4X2JvX3BpbihkZXYsIHJlbG9jLT50YXJnZXQuYm8sICZw aHlzX2FkZHIpOwogICAgICAgICAgICAgICAgaWYgKElTX0VSUihzZ3QpKSB7CiAgICAgICAgICAg ICAgICAgICAgICAgIGVyciA9IFBUUl9FUlIoc2d0KTsKICAgICAgICAgICAgICAgICAgICAgICAg Z290byB1bnBpbjsKQEAgLTE4NCw3ICsxNzksNyBAQCBzdGF0aWMgdW5zaWduZWQgaW50IHBpbl9q b2Ioc3RydWN0IGhvc3QxeCAqaG9zdCwKc3RydWN0IGhvc3QxeF9qb2IgKmpvYikKICAgICAgICAg ICAgICAgICAgICAgICAgZ290byB1bnBpbjsKICAgICAgICAgICAgICAgIH0KCi0gICAgICAgICAg ICAgICBzZ3QgPSBob3N0MXhfYm9fcGluKGhvc3QtPmRldiwgZy0+Ym8sIE5VTEwpOworICAgICAg ICAgICAgICAgc2d0ID0gaG9zdDF4X2JvX3Bpbihob3N0LT5kZXYsIGctPmJvLCAmcGh5c19hZGRy KTsKICAgICAgICAgICAgICAgIGlmIChJU19FUlIoc2d0KSkgewogICAgICAgICAgICAgICAgICAg ICAgICBlcnIgPSBQVFJfRVJSKHNndCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gdW5w aW47CkBAIC0yMTQsNyArMjA5LDcgQEAgc3RhdGljIHVuc2lnbmVkIGludCBwaW5fam9iKHN0cnVj dCBob3N0MXggKmhvc3QsCnN0cnVjdCBob3N0MXhfam9iICpqb2IpCgogICAgICAgICAgICAgICAg ICAgICAgICBqb2ItPnVucGluc1tqb2ItPm51bV91bnBpbnNdLnNpemUgPSBnYXRoZXJfc2l6ZTsK ICAgICAgICAgICAgICAgICAgICAgICAgcGh5c19hZGRyID0gaW92YV9kbWFfYWRkcigmaG9zdC0+ aW92YSwgYWxsb2MpOwotICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgIH0g ZWxzZSBpZiAoc2d0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IGRtYV9tYXBfc2co aG9zdC0+ZGV2LCBzZ3QtPnNnbCwgc2d0LT5uZW50cywKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBETUFfVE9fREVWSUNFKTsKICAgICAgICAgICAgICAgICAgICAgICAg aWYgKCFlcnIpIHsKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3Jn Cmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVs Cg==