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=-15.3 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,NICE_REPLY_A,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 56EA0C47094 for ; Thu, 10 Jun 2021 11:34:06 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 3170B613E9 for ; Thu, 10 Jun 2021 11:34:06 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230033AbhFJLgB (ORCPT ); Thu, 10 Jun 2021 07:36:01 -0400 Received: from foss.arm.com ([217.140.110.172]:57604 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229895AbhFJLgB (ORCPT ); Thu, 10 Jun 2021 07:36:01 -0400 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 76064D6E; Thu, 10 Jun 2021 04:34:04 -0700 (PDT) Received: from [10.57.6.115] (unknown [10.57.6.115]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 21B513F694; Thu, 10 Jun 2021 04:34:03 -0700 (PDT) Subject: Re: [PATCH] iommu/io-pgtable-arm: Optimize partial walk flush for large scatter-gather list To: Sai Prakash Ranjan Cc: linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, iommu@lists.linux-foundation.org, Will Deacon , linux-arm-kernel@lists.infradead.org, Thierry Reding , Krishna Reddy References: <20210609145315.25750-1-saiprakash.ranjan@codeaurora.org> <35bfd245-45e2-8083-b620-330d6dbd7bd7@arm.com> <12067ffb8243b220cf03e83aaac3e823@codeaurora.org> From: Robin Murphy Message-ID: <266f190e-99ae-9175-cf13-7a77730af389@arm.com> Date: Thu, 10 Jun 2021 12:33:56 +0100 User-Agent: Mozilla/5.0 (Windows NT 10.0; rv:78.0) Gecko/20100101 Thunderbird/78.10.1 MIME-Version: 1.0 In-Reply-To: <12067ffb8243b220cf03e83aaac3e823@codeaurora.org> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-GB Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-arm-msm@vger.kernel.org On 2021-06-10 10:36, Sai Prakash Ranjan wrote: > Hi Robin, > > On 2021-06-10 14:38, Robin Murphy wrote: >> On 2021-06-10 06:24, Sai Prakash Ranjan wrote: >>> Hi Robin, >>> >>> On 2021-06-10 00:14, Robin Murphy wrote: >>>> On 2021-06-09 15:53, Sai Prakash Ranjan wrote: >>>>> Currently for iommu_unmap() of large scatter-gather list with page >>>>> size >>>>> elements, the majority of time is spent in flushing of partial >>>>> walks in >>>>> __arm_lpae_unmap() which is a VA based TLB invalidation (TLBIVA for >>>>> arm-smmu). >>>>> >>>>> For example: to unmap a 32MB scatter-gather list with page size >>>>> elements >>>>> (8192 entries), there are 16->2MB buffer unmaps based on the pgsize >>>>> (2MB >>>>> for 4K granule) and each of 2MB will further result in 512 TLBIVAs >>>>> (2MB/4K) >>>>> resulting in a total of 8192 TLBIVAs (512*16) for 16->2MB causing a >>>>> huge >>>>> overhead. >>>>> >>>>> So instead use io_pgtable_tlb_flush_all() to invalidate the entire >>>>> context >>>>> if size (pgsize) is greater than the granule size (4K, 16K, 64K). >>>>> For this >>>>> example of 32MB scatter-gather list unmap, this results in just 16 >>>>> ASID >>>>> based TLB invalidations or tlb_flush_all() callback (TLBIASID in >>>>> case of >>>>> arm-smmu) as opposed to 8192 TLBIVAs thereby increasing the >>>>> performance of >>>>> unmaps drastically. >>>>> >>>>> Condition (size > granule size) is chosen for >>>>> io_pgtable_tlb_flush_all() >>>>> because for any granule with supported pgsizes, we will have at >>>>> least 512 >>>>> TLB invalidations for which tlb_flush_all() is already recommended. >>>>> For >>>>> example, take 4K granule with 2MB pgsize, this will result in 512 >>>>> TLBIVA >>>>> in partial walk flush. >>>>> >>>>> Test on QTI SM8150 SoC for 10 iterations of iommu_{map_sg}/unmap: >>>>> (average over 10 iterations) >>>>> >>>>> Before this optimization: >>>>> >>>>>      size        iommu_map_sg      iommu_unmap >>>>>        4K            2.067 us         1.854 us >>>>>       64K            9.598 us         8.802 us >>>>>        1M          148.890 us       130.718 us >>>>>        2M          305.864 us        67.291 us >>>>>       12M         1793.604 us       390.838 us >>>>>       16M         2386.848 us       518.187 us >>>>>       24M         3563.296 us       775.989 us >>>>>       32M         4747.171 us      1033.364 us >>>>> >>>>> After this optimization: >>>>> >>>>>      size        iommu_map_sg      iommu_unmap >>>>>        4K            1.723 us         1.765 us >>>>>       64K            9.880 us         8.869 us >>>>>        1M          155.364 us       135.223 us >>>>>        2M          303.906 us         5.385 us >>>>>       12M         1786.557 us        21.250 us >>>>>       16M         2391.890 us        27.437 us >>>>>       24M         3570.895 us        39.937 us >>>>>       32M         4755.234 us        51.797 us >>>>> >>>>> This is further reduced once the map/unmap_pages() support gets in >>>>> which >>>>> will result in just 1 tlb_flush_all() as opposed to 16 >>>>> tlb_flush_all(). >>>>> >>>>> Signed-off-by: Sai Prakash Ranjan >>>>> --- >>>>>   drivers/iommu/io-pgtable-arm.c | 7 +++++-- >>>>>   1 file changed, 5 insertions(+), 2 deletions(-) >>>>> >>>>> diff --git a/drivers/iommu/io-pgtable-arm.c >>>>> b/drivers/iommu/io-pgtable-arm.c >>>>> index 87def58e79b5..c3cb9add3179 100644 >>>>> --- a/drivers/iommu/io-pgtable-arm.c >>>>> +++ b/drivers/iommu/io-pgtable-arm.c >>>>> @@ -589,8 +589,11 @@ static size_t __arm_lpae_unmap(struct >>>>> arm_lpae_io_pgtable *data, >>>>>             if (!iopte_leaf(pte, lvl, iop->fmt)) { >>>>>               /* Also flush any partial walks */ >>>>> -            io_pgtable_tlb_flush_walk(iop, iova, size, >>>>> -                          ARM_LPAE_GRANULE(data)); >>>>> +            if (size > ARM_LPAE_GRANULE(data)) >>>>> +                io_pgtable_tlb_flush_all(iop); >>>>> +            else >>>> >>>> Erm, when will the above condition ever not be true? ;) >>>> >>> >>> Ah right, silly me :) >>> >>>> Taking a step back, though, what about the impact to drivers other >>>> than SMMUv2? >>> >>> Other drivers would be msm_iommu.c, qcom_iommu.c which does the same >>> thing as arm-smmu-v2 (page based invalidations), then there is >>> ipmmu-vmsa.c >>> which does tlb_flush_all() for flush walk. >>> >>>> In particular I'm thinking of SMMUv3.2 where the whole >>>> range can be invalidated by VA in a single command anyway, so the >>>> additional penalties of TLBIALL are undesirable. >>>> >>> >>> Right, so I am thinking we can have a new generic quirk >>> IO_PGTABLE_QUIRK_RANGE_INV >>> to choose between range based invalidations(tlb_flush_walk) and >>> tlb_flush_all(). >>> In this case of arm-smmu-v3.2, we can tie up ARM_SMMU_FEAT_RANGE_INV >>> with this quirk >>> and have something like below, thoughts? >>> >>> if (iop->cfg.quirks & IO_PGTABLE_QUIRK_RANGE_INV) >>>          io_pgtable_tlb_flush_walk(iop, iova, size, >>>                                    ARM_LPAE_GRANULE(data)); >>> else >>>          io_pgtable_tlb_flush_all(iop); >> >> The design here has always been that io-pgtable says *what* needs >> invalidating, and we left it up to the drivers to decide exactly >> *how*. Even though things have evolved a bit I don't think that has >> fundamentally changed - tlb_flush_walk is now only used in this one >> place (technically I suppose it could be renamed tlb_flush_table but >> it's not worth the churn), so drivers can implement their own >> preferred table-invalidating behaviour even more easily than choosing >> whether to bounce a quirk through the common code or not. Consider >> what you've already seen for the Renesas IPMMU, or SMMUv1 stage 2... >> > > Thanks for the explanation, makes sense. If I am not mistaken, I see that > you are suggesting to move this logic based on size and granule-size to > arm-smmu-v2 driver and one more thing below.. Simpler than that - following on from my original comment above, tlb_flush_walk already knows it's invalidating at least one full level of table so there's nothing it even needs to check. Adding a size-based heuristic to arm_smmu_inv_range_* for leaf invalidations would be a separate concern (note that changing the non-leaf behaviour might allow cleaning up the "reg" indirection there too). >> I'm instinctively a little twitchy about making this a blanket >> optimisation for SMMUv2 since I still remember the palaver with our >> display and MMU-500 integrations, where it had to implement the dodgy >> "prefetch" register to trigger translations before scanning out a >> frame since it couldn't ever afford a TLB miss, thus TLBIALL when >> freeing an old buffer would be a dangerous hammer to swing. However >> IIRC it also had to ensure everything was mapped as 2MB blocks to >> guarantee fitting everything in the TLBs in the first place, so I >> guess it would still work out OK due to never realistically unmapping >> a whole table at once anyway. >> > > You are also hinting to not do this for all SMMUv2 implementations and make > it QCOM specific? No, I'm really just wary that the performance implication is more complex than a simple unmap latency benefit, possibly even for QCOM. Consider the access latency, power and memory bandwidth hit from all the additional pagetable walks incurred by other ongoing traffic fighting against those 16 successive TLBIASIDs. Whether it's an overall win really depends on the specific workload and system conditions as much as the SMMU implementation. Thinking some more, I wonder if the Tegra folks might have an opinion to add here, given that their multiple-SMMU solution was seemingly about trying to get enough TLB and pagetable walk bandwidth in the first place? Robin. 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=-15.3 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,NICE_REPLY_A,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 7F805C47094 for ; Thu, 10 Jun 2021 11:34:10 +0000 (UTC) Received: from smtp4.osuosl.org (smtp4.osuosl.org [140.211.166.137]) (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 20CD1613FF for ; Thu, 10 Jun 2021 11:34:10 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 20CD1613FF Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=arm.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=iommu-bounces@lists.linux-foundation.org Received: from localhost (localhost [127.0.0.1]) by smtp4.osuosl.org (Postfix) with ESMTP id DA4A0405F1; Thu, 10 Jun 2021 11:34:09 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp4.osuosl.org ([127.0.0.1]) by localhost (smtp4.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id kYu2ikUHMUWx; Thu, 10 Jun 2021 11:34:08 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by smtp4.osuosl.org (Postfix) with ESMTPS id 3881C405E8; Thu, 10 Jun 2021 11:34:08 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 0D897C000D; Thu, 10 Jun 2021 11:34:08 +0000 (UTC) Received: from smtp3.osuosl.org (smtp3.osuosl.org [IPv6:2605:bc80:3010::136]) by lists.linuxfoundation.org (Postfix) with ESMTP id DC88FC000B for ; Thu, 10 Jun 2021 11:34:06 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp3.osuosl.org (Postfix) with ESMTP id BB85F60727 for ; Thu, 10 Jun 2021 11:34:06 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp3.osuosl.org ([127.0.0.1]) by localhost (smtp3.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id wrB4pH9sCpv2 for ; Thu, 10 Jun 2021 11:34:05 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.8.0 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp3.osuosl.org (Postfix) with ESMTP id 7648C6067B for ; Thu, 10 Jun 2021 11:34:05 +0000 (UTC) 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 76064D6E; Thu, 10 Jun 2021 04:34:04 -0700 (PDT) Received: from [10.57.6.115] (unknown [10.57.6.115]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 21B513F694; Thu, 10 Jun 2021 04:34:03 -0700 (PDT) Subject: Re: [PATCH] iommu/io-pgtable-arm: Optimize partial walk flush for large scatter-gather list To: Sai Prakash Ranjan References: <20210609145315.25750-1-saiprakash.ranjan@codeaurora.org> <35bfd245-45e2-8083-b620-330d6dbd7bd7@arm.com> <12067ffb8243b220cf03e83aaac3e823@codeaurora.org> From: Robin Murphy Message-ID: <266f190e-99ae-9175-cf13-7a77730af389@arm.com> Date: Thu, 10 Jun 2021 12:33:56 +0100 User-Agent: Mozilla/5.0 (Windows NT 10.0; rv:78.0) Gecko/20100101 Thunderbird/78.10.1 MIME-Version: 1.0 In-Reply-To: <12067ffb8243b220cf03e83aaac3e823@codeaurora.org> Content-Language: en-GB Cc: linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, iommu@lists.linux-foundation.org, Thierry Reding , Will Deacon , linux-arm-kernel@lists.infradead.org X-BeenThere: iommu@lists.linux-foundation.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: Development issues for Linux IOMMU support List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Errors-To: iommu-bounces@lists.linux-foundation.org Sender: "iommu" T24gMjAyMS0wNi0xMCAxMDozNiwgU2FpIFByYWthc2ggUmFuamFuIHdyb3RlOgo+IEhpIFJvYmlu LAo+IAo+IE9uIDIwMjEtMDYtMTAgMTQ6MzgsIFJvYmluIE11cnBoeSB3cm90ZToKPj4gT24gMjAy MS0wNi0xMCAwNjoyNCwgU2FpIFByYWthc2ggUmFuamFuIHdyb3RlOgo+Pj4gSGkgUm9iaW4sCj4+ Pgo+Pj4gT24gMjAyMS0wNi0xMCAwMDoxNCwgUm9iaW4gTXVycGh5IHdyb3RlOgo+Pj4+IE9uIDIw MjEtMDYtMDkgMTU6NTMsIFNhaSBQcmFrYXNoIFJhbmphbiB3cm90ZToKPj4+Pj4gQ3VycmVudGx5 IGZvciBpb21tdV91bm1hcCgpIG9mIGxhcmdlIHNjYXR0ZXItZ2F0aGVyIGxpc3Qgd2l0aCBwYWdl IAo+Pj4+PiBzaXplCj4+Pj4+IGVsZW1lbnRzLCB0aGUgbWFqb3JpdHkgb2YgdGltZSBpcyBzcGVu dCBpbiBmbHVzaGluZyBvZiBwYXJ0aWFsIAo+Pj4+PiB3YWxrcyBpbgo+Pj4+PiBfX2FybV9scGFl X3VubWFwKCkgd2hpY2ggaXMgYSBWQSBiYXNlZCBUTEIgaW52YWxpZGF0aW9uIChUTEJJVkEgZm9y Cj4+Pj4+IGFybS1zbW11KS4KPj4+Pj4KPj4+Pj4gRm9yIGV4YW1wbGU6IHRvIHVubWFwIGEgMzJN QiBzY2F0dGVyLWdhdGhlciBsaXN0IHdpdGggcGFnZSBzaXplIAo+Pj4+PiBlbGVtZW50cwo+Pj4+ PiAoODE5MiBlbnRyaWVzKSwgdGhlcmUgYXJlIDE2LT4yTUIgYnVmZmVyIHVubWFwcyBiYXNlZCBv biB0aGUgcGdzaXplIAo+Pj4+PiAoMk1CCj4+Pj4+IGZvciA0SyBncmFudWxlKSBhbmQgZWFjaCBv ZiAyTUIgd2lsbCBmdXJ0aGVyIHJlc3VsdCBpbiA1MTIgVExCSVZBcyAKPj4+Pj4gKDJNQi80SykK Pj4+Pj4gcmVzdWx0aW5nIGluIGEgdG90YWwgb2YgODE5MiBUTEJJVkFzICg1MTIqMTYpIGZvciAx Ni0+Mk1CIGNhdXNpbmcgYSAKPj4+Pj4gaHVnZQo+Pj4+PiBvdmVyaGVhZC4KPj4+Pj4KPj4+Pj4g U28gaW5zdGVhZCB1c2UgaW9fcGd0YWJsZV90bGJfZmx1c2hfYWxsKCkgdG8gaW52YWxpZGF0ZSB0 aGUgZW50aXJlIAo+Pj4+PiBjb250ZXh0Cj4+Pj4+IGlmIHNpemUgKHBnc2l6ZSkgaXMgZ3JlYXRl ciB0aGFuIHRoZSBncmFudWxlIHNpemUgKDRLLCAxNkssIDY0SykuIAo+Pj4+PiBGb3IgdGhpcwo+ Pj4+PiBleGFtcGxlIG9mIDMyTUIgc2NhdHRlci1nYXRoZXIgbGlzdCB1bm1hcCwgdGhpcyByZXN1 bHRzIGluIGp1c3QgMTYgCj4+Pj4+IEFTSUQKPj4+Pj4gYmFzZWQgVExCIGludmFsaWRhdGlvbnMg b3IgdGxiX2ZsdXNoX2FsbCgpIGNhbGxiYWNrIChUTEJJQVNJRCBpbiAKPj4+Pj4gY2FzZSBvZgo+ Pj4+PiBhcm0tc21tdSkgYXMgb3Bwb3NlZCB0byA4MTkyIFRMQklWQXMgdGhlcmVieSBpbmNyZWFz aW5nIHRoZSAKPj4+Pj4gcGVyZm9ybWFuY2Ugb2YKPj4+Pj4gdW5tYXBzIGRyYXN0aWNhbGx5Lgo+ Pj4+Pgo+Pj4+PiBDb25kaXRpb24gKHNpemUgPiBncmFudWxlIHNpemUpIGlzIGNob3NlbiBmb3Ig Cj4+Pj4+IGlvX3BndGFibGVfdGxiX2ZsdXNoX2FsbCgpCj4+Pj4+IGJlY2F1c2UgZm9yIGFueSBn cmFudWxlIHdpdGggc3VwcG9ydGVkIHBnc2l6ZXMsIHdlIHdpbGwgaGF2ZSBhdCAKPj4+Pj4gbGVh c3QgNTEyCj4+Pj4+IFRMQiBpbnZhbGlkYXRpb25zIGZvciB3aGljaCB0bGJfZmx1c2hfYWxsKCkg aXMgYWxyZWFkeSByZWNvbW1lbmRlZC4gCj4+Pj4+IEZvcgo+Pj4+PiBleGFtcGxlLCB0YWtlIDRL IGdyYW51bGUgd2l0aCAyTUIgcGdzaXplLCB0aGlzIHdpbGwgcmVzdWx0IGluIDUxMiAKPj4+Pj4g VExCSVZBCj4+Pj4+IGluIHBhcnRpYWwgd2FsayBmbHVzaC4KPj4+Pj4KPj4+Pj4gVGVzdCBvbiBR VEkgU004MTUwIFNvQyBmb3IgMTAgaXRlcmF0aW9ucyBvZiBpb21tdV97bWFwX3NnfS91bm1hcDoK Pj4+Pj4gKGF2ZXJhZ2Ugb3ZlciAxMCBpdGVyYXRpb25zKQo+Pj4+Pgo+Pj4+PiBCZWZvcmUgdGhp cyBvcHRpbWl6YXRpb246Cj4+Pj4+Cj4+Pj4+IMKgwqDCoMKgIHNpemXCoMKgwqDCoMKgwqDCoCBp b21tdV9tYXBfc2fCoMKgwqDCoMKgIGlvbW11X3VubWFwCj4+Pj4+IMKgwqDCoMKgwqDCoCA0S8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqAgMi4wNjcgdXPCoMKgwqDCoMKgwqDCoMKgIDEuODU0IHVzCj4+ Pj4+IMKgwqDCoMKgwqAgNjRLwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCA5LjU5OCB1c8KgwqDCoMKg wqDCoMKgwqAgOC44MDIgdXMKPj4+Pj4gwqDCoMKgwqDCoMKgIDFNwqDCoMKgwqDCoMKgwqDCoMKg IDE0OC44OTAgdXPCoMKgwqDCoMKgwqAgMTMwLjcxOCB1cwo+Pj4+PiDCoMKgwqDCoMKgwqAgMk3C oMKgwqDCoMKgwqDCoMKgwqAgMzA1Ljg2NCB1c8KgwqDCoMKgwqDCoMKgIDY3LjI5MSB1cwo+Pj4+ PiDCoMKgwqDCoMKgIDEyTcKgwqDCoMKgwqDCoMKgwqAgMTc5My42MDQgdXPCoMKgwqDCoMKgwqAg MzkwLjgzOCB1cwo+Pj4+PiDCoMKgwqDCoMKgIDE2TcKgwqDCoMKgwqDCoMKgwqAgMjM4Ni44NDgg dXPCoMKgwqDCoMKgwqAgNTE4LjE4NyB1cwo+Pj4+PiDCoMKgwqDCoMKgIDI0TcKgwqDCoMKgwqDC oMKgwqAgMzU2My4yOTYgdXPCoMKgwqDCoMKgwqAgNzc1Ljk4OSB1cwo+Pj4+PiDCoMKgwqDCoMKg IDMyTcKgwqDCoMKgwqDCoMKgwqAgNDc0Ny4xNzEgdXPCoMKgwqDCoMKgIDEwMzMuMzY0IHVzCj4+ Pj4+Cj4+Pj4+IEFmdGVyIHRoaXMgb3B0aW1pemF0aW9uOgo+Pj4+Pgo+Pj4+PiDCoMKgwqDCoCBz aXplwqDCoMKgwqDCoMKgwqAgaW9tbXVfbWFwX3NnwqDCoMKgwqDCoCBpb21tdV91bm1hcAo+Pj4+ PiDCoMKgwqDCoMKgwqAgNEvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIDEuNzIzIHVzwqDCoMKgwqDC oMKgwqDCoCAxLjc2NSB1cwo+Pj4+PiDCoMKgwqDCoMKgIDY0S8KgwqDCoMKgwqDCoMKgwqDCoMKg wqAgOS44ODAgdXPCoMKgwqDCoMKgwqDCoMKgIDguODY5IHVzCj4+Pj4+IMKgwqDCoMKgwqDCoCAx TcKgwqDCoMKgwqDCoMKgwqDCoCAxNTUuMzY0IHVzwqDCoMKgwqDCoMKgIDEzNS4yMjMgdXMKPj4+ Pj4gwqDCoMKgwqDCoMKgIDJNwqDCoMKgwqDCoMKgwqDCoMKgIDMwMy45MDYgdXPCoMKgwqDCoMKg wqDCoMKgIDUuMzg1IHVzCj4+Pj4+IMKgwqDCoMKgwqAgMTJNwqDCoMKgwqDCoMKgwqDCoCAxNzg2 LjU1NyB1c8KgwqDCoMKgwqDCoMKgIDIxLjI1MCB1cwo+Pj4+PiDCoMKgwqDCoMKgIDE2TcKgwqDC oMKgwqDCoMKgwqAgMjM5MS44OTAgdXPCoMKgwqDCoMKgwqDCoCAyNy40MzcgdXMKPj4+Pj4gwqDC oMKgwqDCoCAyNE3CoMKgwqDCoMKgwqDCoMKgIDM1NzAuODk1IHVzwqDCoMKgwqDCoMKgwqAgMzku OTM3IHVzCj4+Pj4+IMKgwqDCoMKgwqAgMzJNwqDCoMKgwqDCoMKgwqDCoCA0NzU1LjIzNCB1c8Kg wqDCoMKgwqDCoMKgIDUxLjc5NyB1cwo+Pj4+Pgo+Pj4+PiBUaGlzIGlzIGZ1cnRoZXIgcmVkdWNl ZCBvbmNlIHRoZSBtYXAvdW5tYXBfcGFnZXMoKSBzdXBwb3J0IGdldHMgaW4gCj4+Pj4+IHdoaWNo Cj4+Pj4+IHdpbGwgcmVzdWx0IGluIGp1c3QgMSB0bGJfZmx1c2hfYWxsKCkgYXMgb3Bwb3NlZCB0 byAxNiAKPj4+Pj4gdGxiX2ZsdXNoX2FsbCgpLgo+Pj4+Pgo+Pj4+PiBTaWduZWQtb2ZmLWJ5OiBT YWkgUHJha2FzaCBSYW5qYW4gPHNhaXByYWthc2gucmFuamFuQGNvZGVhdXJvcmEub3JnPgo+Pj4+ PiAtLS0KPj4+Pj4gwqAgZHJpdmVycy9pb21tdS9pby1wZ3RhYmxlLWFybS5jIHwgNyArKysrKy0t Cj4+Pj4+IMKgIDEgZmlsZSBjaGFuZ2VkLCA1IGluc2VydGlvbnMoKyksIDIgZGVsZXRpb25zKC0p Cj4+Pj4+Cj4+Pj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2lvbW11L2lvLXBndGFibGUtYXJtLmMg Cj4+Pj4+IGIvZHJpdmVycy9pb21tdS9pby1wZ3RhYmxlLWFybS5jCj4+Pj4+IGluZGV4IDg3ZGVm NThlNzliNS4uYzNjYjlhZGQzMTc5IDEwMDY0NAo+Pj4+PiAtLS0gYS9kcml2ZXJzL2lvbW11L2lv LXBndGFibGUtYXJtLmMKPj4+Pj4gKysrIGIvZHJpdmVycy9pb21tdS9pby1wZ3RhYmxlLWFybS5j Cj4+Pj4+IEBAIC01ODksOCArNTg5LDExIEBAIHN0YXRpYyBzaXplX3QgX19hcm1fbHBhZV91bm1h cChzdHJ1Y3QgCj4+Pj4+IGFybV9scGFlX2lvX3BndGFibGUgKmRhdGEsCj4+Pj4+IMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgaWYgKCFpb3B0ZV9sZWFmKHB0ZSwgbHZsLCBpb3AtPmZtdCkpIHsKPj4+ Pj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgLyogQWxzbyBmbHVzaCBhbnkgcGFydGlhbCB3 YWxrcyAqLwo+Pj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpb19wZ3RhYmxlX3RsYl9mbHVz aF93YWxrKGlvcCwgaW92YSwgc2l6ZSwKPj4+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIEFSTV9MUEFFX0dSQU5VTEUoZGF0YSkpOwo+Pj4+PiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAoc2l6ZSA+IEFSTV9MUEFFX0dSQU5VTEUoZGF0YSkp Cj4+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaW9fcGd0YWJsZV90bGJfZmx1 c2hfYWxsKGlvcCk7Cj4+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGVsc2UKPj4+Pgo+Pj4+ IEVybSwgd2hlbiB3aWxsIHRoZSBhYm92ZSBjb25kaXRpb24gZXZlciBub3QgYmUgdHJ1ZT8gOykK Pj4+Pgo+Pj4KPj4+IEFoIHJpZ2h0LCBzaWxseSBtZSA6KQo+Pj4KPj4+PiBUYWtpbmcgYSBzdGVw IGJhY2ssIHRob3VnaCwgd2hhdCBhYm91dCB0aGUgaW1wYWN0IHRvIGRyaXZlcnMgb3RoZXIKPj4+ PiB0aGFuIFNNTVV2Mj8KPj4+Cj4+PiBPdGhlciBkcml2ZXJzIHdvdWxkIGJlIG1zbV9pb21tdS5j LCBxY29tX2lvbW11LmMgd2hpY2ggZG9lcyB0aGUgc2FtZQo+Pj4gdGhpbmcgYXMgYXJtLXNtbXUt djIgKHBhZ2UgYmFzZWQgaW52YWxpZGF0aW9ucyksIHRoZW4gdGhlcmUgaXMgCj4+PiBpcG1tdS12 bXNhLmMKPj4+IHdoaWNoIGRvZXMgdGxiX2ZsdXNoX2FsbCgpIGZvciBmbHVzaCB3YWxrLgo+Pj4K Pj4+PiBJbiBwYXJ0aWN1bGFyIEknbSB0aGlua2luZyBvZiBTTU1VdjMuMiB3aGVyZSB0aGUgd2hv bGUKPj4+PiByYW5nZSBjYW4gYmUgaW52YWxpZGF0ZWQgYnkgVkEgaW4gYSBzaW5nbGUgY29tbWFu ZCBhbnl3YXksIHNvIHRoZQo+Pj4+IGFkZGl0aW9uYWwgcGVuYWx0aWVzIG9mIFRMQklBTEwgYXJl IHVuZGVzaXJhYmxlLgo+Pj4+Cj4+Pgo+Pj4gUmlnaHQsIHNvIEkgYW0gdGhpbmtpbmcgd2UgY2Fu IGhhdmUgYSBuZXcgZ2VuZXJpYyBxdWlyayAKPj4+IElPX1BHVEFCTEVfUVVJUktfUkFOR0VfSU5W Cj4+PiB0byBjaG9vc2UgYmV0d2VlbiByYW5nZSBiYXNlZCBpbnZhbGlkYXRpb25zKHRsYl9mbHVz aF93YWxrKSBhbmQgCj4+PiB0bGJfZmx1c2hfYWxsKCkuCj4+PiBJbiB0aGlzIGNhc2Ugb2YgYXJt LXNtbXUtdjMuMiwgd2UgY2FuIHRpZSB1cCBBUk1fU01NVV9GRUFUX1JBTkdFX0lOViAKPj4+IHdp dGggdGhpcyBxdWlyawo+Pj4gYW5kIGhhdmUgc29tZXRoaW5nIGxpa2UgYmVsb3csIHRob3VnaHRz Pwo+Pj4KPj4+IGlmIChpb3AtPmNmZy5xdWlya3MgJiBJT19QR1RBQkxFX1FVSVJLX1JBTkdFX0lO VikKPj4+IMKgwqDCoMKgwqDCoMKgwqAgaW9fcGd0YWJsZV90bGJfZmx1c2hfd2Fsayhpb3AsIGlv dmEsIHNpemUsCj4+PiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBBUk1fTFBBRV9HUkFOVUxFKGRhdGEpKTsKPj4+IGVs c2UKPj4+IMKgwqDCoMKgwqDCoMKgwqAgaW9fcGd0YWJsZV90bGJfZmx1c2hfYWxsKGlvcCk7Cj4+ Cj4+IFRoZSBkZXNpZ24gaGVyZSBoYXMgYWx3YXlzIGJlZW4gdGhhdCBpby1wZ3RhYmxlIHNheXMg KndoYXQqIG5lZWRzCj4+IGludmFsaWRhdGluZywgYW5kIHdlIGxlZnQgaXQgdXAgdG8gdGhlIGRy aXZlcnMgdG8gZGVjaWRlIGV4YWN0bHkKPj4gKmhvdyouIEV2ZW4gdGhvdWdoIHRoaW5ncyBoYXZl IGV2b2x2ZWQgYSBiaXQgSSBkb24ndCB0aGluayB0aGF0IGhhcwo+PiBmdW5kYW1lbnRhbGx5IGNo YW5nZWQgLSB0bGJfZmx1c2hfd2FsayBpcyBub3cgb25seSB1c2VkIGluIHRoaXMgb25lCj4+IHBs YWNlICh0ZWNobmljYWxseSBJIHN1cHBvc2UgaXQgY291bGQgYmUgcmVuYW1lZCB0bGJfZmx1c2hf dGFibGUgYnV0Cj4+IGl0J3Mgbm90IHdvcnRoIHRoZSBjaHVybiksIHNvIGRyaXZlcnMgY2FuIGlt cGxlbWVudCB0aGVpciBvd24KPj4gcHJlZmVycmVkIHRhYmxlLWludmFsaWRhdGluZyBiZWhhdmlv dXIgZXZlbiBtb3JlIGVhc2lseSB0aGFuIGNob29zaW5nCj4+IHdoZXRoZXIgdG8gYm91bmNlIGEg cXVpcmsgdGhyb3VnaCB0aGUgY29tbW9uIGNvZGUgb3Igbm90LiBDb25zaWRlcgo+PiB3aGF0IHlv dSd2ZSBhbHJlYWR5IHNlZW4gZm9yIHRoZSBSZW5lc2FzIElQTU1VLCBvciBTTU1VdjEgc3RhZ2Ug Mi4uLgo+Pgo+IAo+IFRoYW5rcyBmb3IgdGhlIGV4cGxhbmF0aW9uLCBtYWtlcyBzZW5zZS4gSWYg SSBhbSBub3QgbWlzdGFrZW4sIEkgc2VlIHRoYXQKPiB5b3UgYXJlIHN1Z2dlc3RpbmcgdG8gbW92 ZSB0aGlzIGxvZ2ljIGJhc2VkIG9uIHNpemUgYW5kIGdyYW51bGUtc2l6ZSB0bwo+IGFybS1zbW11 LXYyIGRyaXZlciBhbmQgb25lIG1vcmUgdGhpbmcgYmVsb3cuLgoKU2ltcGxlciB0aGFuIHRoYXQg LSBmb2xsb3dpbmcgb24gZnJvbSBteSBvcmlnaW5hbCBjb21tZW50IGFib3ZlLCAKdGxiX2ZsdXNo X3dhbGsgYWxyZWFkeSBrbm93cyBpdCdzIGludmFsaWRhdGluZyBhdCBsZWFzdCBvbmUgZnVsbCBs ZXZlbCAKb2YgdGFibGUgc28gdGhlcmUncyBub3RoaW5nIGl0IGV2ZW4gbmVlZHMgdG8gY2hlY2su IEFkZGluZyBhIHNpemUtYmFzZWQgCmhldXJpc3RpYyB0byBhcm1fc21tdV9pbnZfcmFuZ2VfKiBm b3IgbGVhZiBpbnZhbGlkYXRpb25zIHdvdWxkIGJlIGEgCnNlcGFyYXRlIGNvbmNlcm4gKG5vdGUg dGhhdCBjaGFuZ2luZyB0aGUgbm9uLWxlYWYgYmVoYXZpb3VyIG1pZ2h0IGFsbG93IApjbGVhbmlu ZyB1cCB0aGUgInJlZyIgaW5kaXJlY3Rpb24gdGhlcmUgdG9vKS4KCj4+IEknbSBpbnN0aW5jdGl2 ZWx5IGEgbGl0dGxlIHR3aXRjaHkgYWJvdXQgbWFraW5nIHRoaXMgYSBibGFua2V0Cj4+IG9wdGlt aXNhdGlvbiBmb3IgU01NVXYyIHNpbmNlIEkgc3RpbGwgcmVtZW1iZXIgdGhlIHBhbGF2ZXIgd2l0 aCBvdXIKPj4gZGlzcGxheSBhbmQgTU1VLTUwMCBpbnRlZ3JhdGlvbnMsIHdoZXJlIGl0IGhhZCB0 byBpbXBsZW1lbnQgdGhlIGRvZGd5Cj4+ICJwcmVmZXRjaCIgcmVnaXN0ZXIgdG8gdHJpZ2dlciB0 cmFuc2xhdGlvbnMgYmVmb3JlIHNjYW5uaW5nIG91dCBhCj4+IGZyYW1lIHNpbmNlIGl0IGNvdWxk bid0IGV2ZXIgYWZmb3JkIGEgVExCIG1pc3MsIHRodXMgVExCSUFMTCB3aGVuCj4+IGZyZWVpbmcg YW4gb2xkIGJ1ZmZlciB3b3VsZCBiZSBhIGRhbmdlcm91cyBoYW1tZXIgdG8gc3dpbmcuIEhvd2V2 ZXIKPj4gSUlSQyBpdCBhbHNvIGhhZCB0byBlbnN1cmUgZXZlcnl0aGluZyB3YXMgbWFwcGVkIGFz IDJNQiBibG9ja3MgdG8KPj4gZ3VhcmFudGVlIGZpdHRpbmcgZXZlcnl0aGluZyBpbiB0aGUgVExC cyBpbiB0aGUgZmlyc3QgcGxhY2UsIHNvIEkKPj4gZ3Vlc3MgaXQgd291bGQgc3RpbGwgd29yayBv dXQgT0sgZHVlIHRvIG5ldmVyIHJlYWxpc3RpY2FsbHkgdW5tYXBwaW5nCj4+IGEgd2hvbGUgdGFi bGUgYXQgb25jZSBhbnl3YXkuCj4+Cj4gCj4gWW91IGFyZSBhbHNvIGhpbnRpbmcgdG8gbm90IGRv IHRoaXMgZm9yIGFsbCBTTU1VdjIgaW1wbGVtZW50YXRpb25zIGFuZCBtYWtlCj4gaXQgUUNPTSBz cGVjaWZpYz8KCk5vLCBJJ20gcmVhbGx5IGp1c3Qgd2FyeSB0aGF0IHRoZSBwZXJmb3JtYW5jZSBp bXBsaWNhdGlvbiBpcyBtb3JlIApjb21wbGV4IHRoYW4gYSBzaW1wbGUgdW5tYXAgbGF0ZW5jeSBi ZW5lZml0LCBwb3NzaWJseSBldmVuIGZvciBRQ09NLiAKQ29uc2lkZXIgdGhlIGFjY2VzcyBsYXRl bmN5LCBwb3dlciBhbmQgbWVtb3J5IGJhbmR3aWR0aCBoaXQgZnJvbSBhbGwgdGhlIAphZGRpdGlv bmFsIHBhZ2V0YWJsZSB3YWxrcyBpbmN1cnJlZCBieSBvdGhlciBvbmdvaW5nIHRyYWZmaWMgZmln aHRpbmcgCmFnYWluc3QgdGhvc2UgMTYgc3VjY2Vzc2l2ZSBUTEJJQVNJRHMuIFdoZXRoZXIgaXQn cyBhbiBvdmVyYWxsIHdpbiAKcmVhbGx5IGRlcGVuZHMgb24gdGhlIHNwZWNpZmljIHdvcmtsb2Fk IGFuZCBzeXN0ZW0gY29uZGl0aW9ucyBhcyBtdWNoIGFzIAp0aGUgU01NVSBpbXBsZW1lbnRhdGlv bi4gVGhpbmtpbmcgc29tZSBtb3JlLCBJIHdvbmRlciBpZiB0aGUgVGVncmEgZm9sa3MgCm1pZ2h0 IGhhdmUgYW4gb3BpbmlvbiB0byBhZGQgaGVyZSwgZ2l2ZW4gdGhhdCB0aGVpciBtdWx0aXBsZS1T TU1VIApzb2x1dGlvbiB3YXMgc2VlbWluZ2x5IGFib3V0IHRyeWluZyB0byBnZXQgZW5vdWdoIFRM QiBhbmQgcGFnZXRhYmxlIHdhbGsgCmJhbmR3aWR0aCBpbiB0aGUgZmlyc3QgcGxhY2U/CgpSb2Jp bi4KX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KaW9tbXUg bWFpbGluZyBsaXN0CmlvbW11QGxpc3RzLmxpbnV4LWZvdW5kYXRpb24ub3JnCmh0dHBzOi8vbGlz dHMubGludXhmb3VuZGF0aW9uLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2lvbW11 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=-15.4 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_SANE_1 autolearn=unavailable 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 77D35C48BD1 for ; Thu, 10 Jun 2021 11:36:00 +0000 (UTC) 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 mail.kernel.org (Postfix) with ESMTPS id 412AD613FE for ; Thu, 10 Jun 2021 11:36:00 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 412AD613FE Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=arm.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:Content-Type: Content-Transfer-Encoding:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:Date:Message-ID:From: References:To:Subject:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=chZpK02dwJELLQItt69WiegfgX6JPayXUmo0ENejs/o=; b=PpY/riGw8G1Ri0w14yesAGOGyW A7efa+M98it16+Yt68h5hJpxTUg2W4cHlMM4vi8+RosTVEQG5TyK1E4A95VtpPEGhoucjwCZHZ3v8 HXs61ZRdcHdvz6tqMSKrZg7hT+9ivq09A6OGCBKxEWJa/GQZAZZw5W6NIMlsn/ivpTAn03m9c6kEb ZeWxr2BdaMOQBoA3aYf3ZA9ZEHoY5PYFsvb0wjg2MmCHM/XcmYzBVy1Q+CCXysSOcj5si5R4+sUuG 4W/QhK4gWmXZ+bIxl3sCiv5/KKhFkPu5HesR+T/FI78xPpCPcZ3Y6ZdYyGJbTs/Jd1JTY6LSuaG3O k3EnZIFw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1lrIww-000Xoe-4j; Thu, 10 Jun 2021 11:34:14 +0000 Received: from foss.arm.com ([217.140.110.172]) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1lrIwr-000Xnc-Tk for linux-arm-kernel@lists.infradead.org; Thu, 10 Jun 2021 11:34:11 +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 76064D6E; Thu, 10 Jun 2021 04:34:04 -0700 (PDT) Received: from [10.57.6.115] (unknown [10.57.6.115]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 21B513F694; Thu, 10 Jun 2021 04:34:03 -0700 (PDT) Subject: Re: [PATCH] iommu/io-pgtable-arm: Optimize partial walk flush for large scatter-gather list To: Sai Prakash Ranjan References: <20210609145315.25750-1-saiprakash.ranjan@codeaurora.org> <35bfd245-45e2-8083-b620-330d6dbd7bd7@arm.com> <12067ffb8243b220cf03e83aaac3e823@codeaurora.org> From: Robin Murphy Message-ID: <266f190e-99ae-9175-cf13-7a77730af389@arm.com> Date: Thu, 10 Jun 2021 12:33:56 +0100 User-Agent: Mozilla/5.0 (Windows NT 10.0; rv:78.0) Gecko/20100101 Thunderbird/78.10.1 MIME-Version: 1.0 In-Reply-To: <12067ffb8243b220cf03e83aaac3e823@codeaurora.org> Content-Language: en-GB X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210610_043410_082137_9C6B6DF0 X-CRM114-Status: GOOD ( 28.55 ) 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: , Cc: linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, iommu@lists.linux-foundation.org, Thierry Reding , Will Deacon , linux-arm-kernel@lists.infradead.org Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org T24gMjAyMS0wNi0xMCAxMDozNiwgU2FpIFByYWthc2ggUmFuamFuIHdyb3RlOgo+IEhpIFJvYmlu LAo+IAo+IE9uIDIwMjEtMDYtMTAgMTQ6MzgsIFJvYmluIE11cnBoeSB3cm90ZToKPj4gT24gMjAy MS0wNi0xMCAwNjoyNCwgU2FpIFByYWthc2ggUmFuamFuIHdyb3RlOgo+Pj4gSGkgUm9iaW4sCj4+ Pgo+Pj4gT24gMjAyMS0wNi0xMCAwMDoxNCwgUm9iaW4gTXVycGh5IHdyb3RlOgo+Pj4+IE9uIDIw MjEtMDYtMDkgMTU6NTMsIFNhaSBQcmFrYXNoIFJhbmphbiB3cm90ZToKPj4+Pj4gQ3VycmVudGx5 IGZvciBpb21tdV91bm1hcCgpIG9mIGxhcmdlIHNjYXR0ZXItZ2F0aGVyIGxpc3Qgd2l0aCBwYWdl IAo+Pj4+PiBzaXplCj4+Pj4+IGVsZW1lbnRzLCB0aGUgbWFqb3JpdHkgb2YgdGltZSBpcyBzcGVu dCBpbiBmbHVzaGluZyBvZiBwYXJ0aWFsIAo+Pj4+PiB3YWxrcyBpbgo+Pj4+PiBfX2FybV9scGFl X3VubWFwKCkgd2hpY2ggaXMgYSBWQSBiYXNlZCBUTEIgaW52YWxpZGF0aW9uIChUTEJJVkEgZm9y Cj4+Pj4+IGFybS1zbW11KS4KPj4+Pj4KPj4+Pj4gRm9yIGV4YW1wbGU6IHRvIHVubWFwIGEgMzJN QiBzY2F0dGVyLWdhdGhlciBsaXN0IHdpdGggcGFnZSBzaXplIAo+Pj4+PiBlbGVtZW50cwo+Pj4+ PiAoODE5MiBlbnRyaWVzKSwgdGhlcmUgYXJlIDE2LT4yTUIgYnVmZmVyIHVubWFwcyBiYXNlZCBv biB0aGUgcGdzaXplIAo+Pj4+PiAoMk1CCj4+Pj4+IGZvciA0SyBncmFudWxlKSBhbmQgZWFjaCBv ZiAyTUIgd2lsbCBmdXJ0aGVyIHJlc3VsdCBpbiA1MTIgVExCSVZBcyAKPj4+Pj4gKDJNQi80SykK Pj4+Pj4gcmVzdWx0aW5nIGluIGEgdG90YWwgb2YgODE5MiBUTEJJVkFzICg1MTIqMTYpIGZvciAx Ni0+Mk1CIGNhdXNpbmcgYSAKPj4+Pj4gaHVnZQo+Pj4+PiBvdmVyaGVhZC4KPj4+Pj4KPj4+Pj4g U28gaW5zdGVhZCB1c2UgaW9fcGd0YWJsZV90bGJfZmx1c2hfYWxsKCkgdG8gaW52YWxpZGF0ZSB0 aGUgZW50aXJlIAo+Pj4+PiBjb250ZXh0Cj4+Pj4+IGlmIHNpemUgKHBnc2l6ZSkgaXMgZ3JlYXRl ciB0aGFuIHRoZSBncmFudWxlIHNpemUgKDRLLCAxNkssIDY0SykuIAo+Pj4+PiBGb3IgdGhpcwo+ Pj4+PiBleGFtcGxlIG9mIDMyTUIgc2NhdHRlci1nYXRoZXIgbGlzdCB1bm1hcCwgdGhpcyByZXN1 bHRzIGluIGp1c3QgMTYgCj4+Pj4+IEFTSUQKPj4+Pj4gYmFzZWQgVExCIGludmFsaWRhdGlvbnMg b3IgdGxiX2ZsdXNoX2FsbCgpIGNhbGxiYWNrIChUTEJJQVNJRCBpbiAKPj4+Pj4gY2FzZSBvZgo+ Pj4+PiBhcm0tc21tdSkgYXMgb3Bwb3NlZCB0byA4MTkyIFRMQklWQXMgdGhlcmVieSBpbmNyZWFz aW5nIHRoZSAKPj4+Pj4gcGVyZm9ybWFuY2Ugb2YKPj4+Pj4gdW5tYXBzIGRyYXN0aWNhbGx5Lgo+ Pj4+Pgo+Pj4+PiBDb25kaXRpb24gKHNpemUgPiBncmFudWxlIHNpemUpIGlzIGNob3NlbiBmb3Ig Cj4+Pj4+IGlvX3BndGFibGVfdGxiX2ZsdXNoX2FsbCgpCj4+Pj4+IGJlY2F1c2UgZm9yIGFueSBn cmFudWxlIHdpdGggc3VwcG9ydGVkIHBnc2l6ZXMsIHdlIHdpbGwgaGF2ZSBhdCAKPj4+Pj4gbGVh c3QgNTEyCj4+Pj4+IFRMQiBpbnZhbGlkYXRpb25zIGZvciB3aGljaCB0bGJfZmx1c2hfYWxsKCkg aXMgYWxyZWFkeSByZWNvbW1lbmRlZC4gCj4+Pj4+IEZvcgo+Pj4+PiBleGFtcGxlLCB0YWtlIDRL IGdyYW51bGUgd2l0aCAyTUIgcGdzaXplLCB0aGlzIHdpbGwgcmVzdWx0IGluIDUxMiAKPj4+Pj4g VExCSVZBCj4+Pj4+IGluIHBhcnRpYWwgd2FsayBmbHVzaC4KPj4+Pj4KPj4+Pj4gVGVzdCBvbiBR VEkgU004MTUwIFNvQyBmb3IgMTAgaXRlcmF0aW9ucyBvZiBpb21tdV97bWFwX3NnfS91bm1hcDoK Pj4+Pj4gKGF2ZXJhZ2Ugb3ZlciAxMCBpdGVyYXRpb25zKQo+Pj4+Pgo+Pj4+PiBCZWZvcmUgdGhp cyBvcHRpbWl6YXRpb246Cj4+Pj4+Cj4+Pj4+IMKgwqDCoMKgIHNpemXCoMKgwqDCoMKgwqDCoCBp b21tdV9tYXBfc2fCoMKgwqDCoMKgIGlvbW11X3VubWFwCj4+Pj4+IMKgwqDCoMKgwqDCoCA0S8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqAgMi4wNjcgdXPCoMKgwqDCoMKgwqDCoMKgIDEuODU0IHVzCj4+ Pj4+IMKgwqDCoMKgwqAgNjRLwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCA5LjU5OCB1c8KgwqDCoMKg wqDCoMKgwqAgOC44MDIgdXMKPj4+Pj4gwqDCoMKgwqDCoMKgIDFNwqDCoMKgwqDCoMKgwqDCoMKg IDE0OC44OTAgdXPCoMKgwqDCoMKgwqAgMTMwLjcxOCB1cwo+Pj4+PiDCoMKgwqDCoMKgwqAgMk3C oMKgwqDCoMKgwqDCoMKgwqAgMzA1Ljg2NCB1c8KgwqDCoMKgwqDCoMKgIDY3LjI5MSB1cwo+Pj4+ PiDCoMKgwqDCoMKgIDEyTcKgwqDCoMKgwqDCoMKgwqAgMTc5My42MDQgdXPCoMKgwqDCoMKgwqAg MzkwLjgzOCB1cwo+Pj4+PiDCoMKgwqDCoMKgIDE2TcKgwqDCoMKgwqDCoMKgwqAgMjM4Ni44NDgg dXPCoMKgwqDCoMKgwqAgNTE4LjE4NyB1cwo+Pj4+PiDCoMKgwqDCoMKgIDI0TcKgwqDCoMKgwqDC oMKgwqAgMzU2My4yOTYgdXPCoMKgwqDCoMKgwqAgNzc1Ljk4OSB1cwo+Pj4+PiDCoMKgwqDCoMKg IDMyTcKgwqDCoMKgwqDCoMKgwqAgNDc0Ny4xNzEgdXPCoMKgwqDCoMKgIDEwMzMuMzY0IHVzCj4+ Pj4+Cj4+Pj4+IEFmdGVyIHRoaXMgb3B0aW1pemF0aW9uOgo+Pj4+Pgo+Pj4+PiDCoMKgwqDCoCBz aXplwqDCoMKgwqDCoMKgwqAgaW9tbXVfbWFwX3NnwqDCoMKgwqDCoCBpb21tdV91bm1hcAo+Pj4+ PiDCoMKgwqDCoMKgwqAgNEvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIDEuNzIzIHVzwqDCoMKgwqDC oMKgwqDCoCAxLjc2NSB1cwo+Pj4+PiDCoMKgwqDCoMKgIDY0S8KgwqDCoMKgwqDCoMKgwqDCoMKg wqAgOS44ODAgdXPCoMKgwqDCoMKgwqDCoMKgIDguODY5IHVzCj4+Pj4+IMKgwqDCoMKgwqDCoCAx TcKgwqDCoMKgwqDCoMKgwqDCoCAxNTUuMzY0IHVzwqDCoMKgwqDCoMKgIDEzNS4yMjMgdXMKPj4+ Pj4gwqDCoMKgwqDCoMKgIDJNwqDCoMKgwqDCoMKgwqDCoMKgIDMwMy45MDYgdXPCoMKgwqDCoMKg wqDCoMKgIDUuMzg1IHVzCj4+Pj4+IMKgwqDCoMKgwqAgMTJNwqDCoMKgwqDCoMKgwqDCoCAxNzg2 LjU1NyB1c8KgwqDCoMKgwqDCoMKgIDIxLjI1MCB1cwo+Pj4+PiDCoMKgwqDCoMKgIDE2TcKgwqDC oMKgwqDCoMKgwqAgMjM5MS44OTAgdXPCoMKgwqDCoMKgwqDCoCAyNy40MzcgdXMKPj4+Pj4gwqDC oMKgwqDCoCAyNE3CoMKgwqDCoMKgwqDCoMKgIDM1NzAuODk1IHVzwqDCoMKgwqDCoMKgwqAgMzku OTM3IHVzCj4+Pj4+IMKgwqDCoMKgwqAgMzJNwqDCoMKgwqDCoMKgwqDCoCA0NzU1LjIzNCB1c8Kg wqDCoMKgwqDCoMKgIDUxLjc5NyB1cwo+Pj4+Pgo+Pj4+PiBUaGlzIGlzIGZ1cnRoZXIgcmVkdWNl ZCBvbmNlIHRoZSBtYXAvdW5tYXBfcGFnZXMoKSBzdXBwb3J0IGdldHMgaW4gCj4+Pj4+IHdoaWNo Cj4+Pj4+IHdpbGwgcmVzdWx0IGluIGp1c3QgMSB0bGJfZmx1c2hfYWxsKCkgYXMgb3Bwb3NlZCB0 byAxNiAKPj4+Pj4gdGxiX2ZsdXNoX2FsbCgpLgo+Pj4+Pgo+Pj4+PiBTaWduZWQtb2ZmLWJ5OiBT YWkgUHJha2FzaCBSYW5qYW4gPHNhaXByYWthc2gucmFuamFuQGNvZGVhdXJvcmEub3JnPgo+Pj4+ PiAtLS0KPj4+Pj4gwqAgZHJpdmVycy9pb21tdS9pby1wZ3RhYmxlLWFybS5jIHwgNyArKysrKy0t Cj4+Pj4+IMKgIDEgZmlsZSBjaGFuZ2VkLCA1IGluc2VydGlvbnMoKyksIDIgZGVsZXRpb25zKC0p Cj4+Pj4+Cj4+Pj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2lvbW11L2lvLXBndGFibGUtYXJtLmMg Cj4+Pj4+IGIvZHJpdmVycy9pb21tdS9pby1wZ3RhYmxlLWFybS5jCj4+Pj4+IGluZGV4IDg3ZGVm NThlNzliNS4uYzNjYjlhZGQzMTc5IDEwMDY0NAo+Pj4+PiAtLS0gYS9kcml2ZXJzL2lvbW11L2lv LXBndGFibGUtYXJtLmMKPj4+Pj4gKysrIGIvZHJpdmVycy9pb21tdS9pby1wZ3RhYmxlLWFybS5j Cj4+Pj4+IEBAIC01ODksOCArNTg5LDExIEBAIHN0YXRpYyBzaXplX3QgX19hcm1fbHBhZV91bm1h cChzdHJ1Y3QgCj4+Pj4+IGFybV9scGFlX2lvX3BndGFibGUgKmRhdGEsCj4+Pj4+IMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgaWYgKCFpb3B0ZV9sZWFmKHB0ZSwgbHZsLCBpb3AtPmZtdCkpIHsKPj4+ Pj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgLyogQWxzbyBmbHVzaCBhbnkgcGFydGlhbCB3 YWxrcyAqLwo+Pj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpb19wZ3RhYmxlX3RsYl9mbHVz aF93YWxrKGlvcCwgaW92YSwgc2l6ZSwKPj4+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIEFSTV9MUEFFX0dSQU5VTEUoZGF0YSkpOwo+Pj4+PiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAoc2l6ZSA+IEFSTV9MUEFFX0dSQU5VTEUoZGF0YSkp Cj4+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaW9fcGd0YWJsZV90bGJfZmx1 c2hfYWxsKGlvcCk7Cj4+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGVsc2UKPj4+Pgo+Pj4+ IEVybSwgd2hlbiB3aWxsIHRoZSBhYm92ZSBjb25kaXRpb24gZXZlciBub3QgYmUgdHJ1ZT8gOykK Pj4+Pgo+Pj4KPj4+IEFoIHJpZ2h0LCBzaWxseSBtZSA6KQo+Pj4KPj4+PiBUYWtpbmcgYSBzdGVw IGJhY2ssIHRob3VnaCwgd2hhdCBhYm91dCB0aGUgaW1wYWN0IHRvIGRyaXZlcnMgb3RoZXIKPj4+ PiB0aGFuIFNNTVV2Mj8KPj4+Cj4+PiBPdGhlciBkcml2ZXJzIHdvdWxkIGJlIG1zbV9pb21tdS5j LCBxY29tX2lvbW11LmMgd2hpY2ggZG9lcyB0aGUgc2FtZQo+Pj4gdGhpbmcgYXMgYXJtLXNtbXUt djIgKHBhZ2UgYmFzZWQgaW52YWxpZGF0aW9ucyksIHRoZW4gdGhlcmUgaXMgCj4+PiBpcG1tdS12 bXNhLmMKPj4+IHdoaWNoIGRvZXMgdGxiX2ZsdXNoX2FsbCgpIGZvciBmbHVzaCB3YWxrLgo+Pj4K Pj4+PiBJbiBwYXJ0aWN1bGFyIEknbSB0aGlua2luZyBvZiBTTU1VdjMuMiB3aGVyZSB0aGUgd2hv bGUKPj4+PiByYW5nZSBjYW4gYmUgaW52YWxpZGF0ZWQgYnkgVkEgaW4gYSBzaW5nbGUgY29tbWFu ZCBhbnl3YXksIHNvIHRoZQo+Pj4+IGFkZGl0aW9uYWwgcGVuYWx0aWVzIG9mIFRMQklBTEwgYXJl IHVuZGVzaXJhYmxlLgo+Pj4+Cj4+Pgo+Pj4gUmlnaHQsIHNvIEkgYW0gdGhpbmtpbmcgd2UgY2Fu IGhhdmUgYSBuZXcgZ2VuZXJpYyBxdWlyayAKPj4+IElPX1BHVEFCTEVfUVVJUktfUkFOR0VfSU5W Cj4+PiB0byBjaG9vc2UgYmV0d2VlbiByYW5nZSBiYXNlZCBpbnZhbGlkYXRpb25zKHRsYl9mbHVz aF93YWxrKSBhbmQgCj4+PiB0bGJfZmx1c2hfYWxsKCkuCj4+PiBJbiB0aGlzIGNhc2Ugb2YgYXJt LXNtbXUtdjMuMiwgd2UgY2FuIHRpZSB1cCBBUk1fU01NVV9GRUFUX1JBTkdFX0lOViAKPj4+IHdp dGggdGhpcyBxdWlyawo+Pj4gYW5kIGhhdmUgc29tZXRoaW5nIGxpa2UgYmVsb3csIHRob3VnaHRz Pwo+Pj4KPj4+IGlmIChpb3AtPmNmZy5xdWlya3MgJiBJT19QR1RBQkxFX1FVSVJLX1JBTkdFX0lO VikKPj4+IMKgwqDCoMKgwqDCoMKgwqAgaW9fcGd0YWJsZV90bGJfZmx1c2hfd2Fsayhpb3AsIGlv dmEsIHNpemUsCj4+PiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBBUk1fTFBBRV9HUkFOVUxFKGRhdGEpKTsKPj4+IGVs c2UKPj4+IMKgwqDCoMKgwqDCoMKgwqAgaW9fcGd0YWJsZV90bGJfZmx1c2hfYWxsKGlvcCk7Cj4+ Cj4+IFRoZSBkZXNpZ24gaGVyZSBoYXMgYWx3YXlzIGJlZW4gdGhhdCBpby1wZ3RhYmxlIHNheXMg KndoYXQqIG5lZWRzCj4+IGludmFsaWRhdGluZywgYW5kIHdlIGxlZnQgaXQgdXAgdG8gdGhlIGRy aXZlcnMgdG8gZGVjaWRlIGV4YWN0bHkKPj4gKmhvdyouIEV2ZW4gdGhvdWdoIHRoaW5ncyBoYXZl IGV2b2x2ZWQgYSBiaXQgSSBkb24ndCB0aGluayB0aGF0IGhhcwo+PiBmdW5kYW1lbnRhbGx5IGNo YW5nZWQgLSB0bGJfZmx1c2hfd2FsayBpcyBub3cgb25seSB1c2VkIGluIHRoaXMgb25lCj4+IHBs YWNlICh0ZWNobmljYWxseSBJIHN1cHBvc2UgaXQgY291bGQgYmUgcmVuYW1lZCB0bGJfZmx1c2hf dGFibGUgYnV0Cj4+IGl0J3Mgbm90IHdvcnRoIHRoZSBjaHVybiksIHNvIGRyaXZlcnMgY2FuIGlt cGxlbWVudCB0aGVpciBvd24KPj4gcHJlZmVycmVkIHRhYmxlLWludmFsaWRhdGluZyBiZWhhdmlv dXIgZXZlbiBtb3JlIGVhc2lseSB0aGFuIGNob29zaW5nCj4+IHdoZXRoZXIgdG8gYm91bmNlIGEg cXVpcmsgdGhyb3VnaCB0aGUgY29tbW9uIGNvZGUgb3Igbm90LiBDb25zaWRlcgo+PiB3aGF0IHlv dSd2ZSBhbHJlYWR5IHNlZW4gZm9yIHRoZSBSZW5lc2FzIElQTU1VLCBvciBTTU1VdjEgc3RhZ2Ug Mi4uLgo+Pgo+IAo+IFRoYW5rcyBmb3IgdGhlIGV4cGxhbmF0aW9uLCBtYWtlcyBzZW5zZS4gSWYg SSBhbSBub3QgbWlzdGFrZW4sIEkgc2VlIHRoYXQKPiB5b3UgYXJlIHN1Z2dlc3RpbmcgdG8gbW92 ZSB0aGlzIGxvZ2ljIGJhc2VkIG9uIHNpemUgYW5kIGdyYW51bGUtc2l6ZSB0bwo+IGFybS1zbW11 LXYyIGRyaXZlciBhbmQgb25lIG1vcmUgdGhpbmcgYmVsb3cuLgoKU2ltcGxlciB0aGFuIHRoYXQg LSBmb2xsb3dpbmcgb24gZnJvbSBteSBvcmlnaW5hbCBjb21tZW50IGFib3ZlLCAKdGxiX2ZsdXNo X3dhbGsgYWxyZWFkeSBrbm93cyBpdCdzIGludmFsaWRhdGluZyBhdCBsZWFzdCBvbmUgZnVsbCBs ZXZlbCAKb2YgdGFibGUgc28gdGhlcmUncyBub3RoaW5nIGl0IGV2ZW4gbmVlZHMgdG8gY2hlY2su IEFkZGluZyBhIHNpemUtYmFzZWQgCmhldXJpc3RpYyB0byBhcm1fc21tdV9pbnZfcmFuZ2VfKiBm b3IgbGVhZiBpbnZhbGlkYXRpb25zIHdvdWxkIGJlIGEgCnNlcGFyYXRlIGNvbmNlcm4gKG5vdGUg dGhhdCBjaGFuZ2luZyB0aGUgbm9uLWxlYWYgYmVoYXZpb3VyIG1pZ2h0IGFsbG93IApjbGVhbmlu ZyB1cCB0aGUgInJlZyIgaW5kaXJlY3Rpb24gdGhlcmUgdG9vKS4KCj4+IEknbSBpbnN0aW5jdGl2 ZWx5IGEgbGl0dGxlIHR3aXRjaHkgYWJvdXQgbWFraW5nIHRoaXMgYSBibGFua2V0Cj4+IG9wdGlt aXNhdGlvbiBmb3IgU01NVXYyIHNpbmNlIEkgc3RpbGwgcmVtZW1iZXIgdGhlIHBhbGF2ZXIgd2l0 aCBvdXIKPj4gZGlzcGxheSBhbmQgTU1VLTUwMCBpbnRlZ3JhdGlvbnMsIHdoZXJlIGl0IGhhZCB0 byBpbXBsZW1lbnQgdGhlIGRvZGd5Cj4+ICJwcmVmZXRjaCIgcmVnaXN0ZXIgdG8gdHJpZ2dlciB0 cmFuc2xhdGlvbnMgYmVmb3JlIHNjYW5uaW5nIG91dCBhCj4+IGZyYW1lIHNpbmNlIGl0IGNvdWxk bid0IGV2ZXIgYWZmb3JkIGEgVExCIG1pc3MsIHRodXMgVExCSUFMTCB3aGVuCj4+IGZyZWVpbmcg YW4gb2xkIGJ1ZmZlciB3b3VsZCBiZSBhIGRhbmdlcm91cyBoYW1tZXIgdG8gc3dpbmcuIEhvd2V2 ZXIKPj4gSUlSQyBpdCBhbHNvIGhhZCB0byBlbnN1cmUgZXZlcnl0aGluZyB3YXMgbWFwcGVkIGFz IDJNQiBibG9ja3MgdG8KPj4gZ3VhcmFudGVlIGZpdHRpbmcgZXZlcnl0aGluZyBpbiB0aGUgVExC cyBpbiB0aGUgZmlyc3QgcGxhY2UsIHNvIEkKPj4gZ3Vlc3MgaXQgd291bGQgc3RpbGwgd29yayBv dXQgT0sgZHVlIHRvIG5ldmVyIHJlYWxpc3RpY2FsbHkgdW5tYXBwaW5nCj4+IGEgd2hvbGUgdGFi bGUgYXQgb25jZSBhbnl3YXkuCj4+Cj4gCj4gWW91IGFyZSBhbHNvIGhpbnRpbmcgdG8gbm90IGRv IHRoaXMgZm9yIGFsbCBTTU1VdjIgaW1wbGVtZW50YXRpb25zIGFuZCBtYWtlCj4gaXQgUUNPTSBz cGVjaWZpYz8KCk5vLCBJJ20gcmVhbGx5IGp1c3Qgd2FyeSB0aGF0IHRoZSBwZXJmb3JtYW5jZSBp bXBsaWNhdGlvbiBpcyBtb3JlIApjb21wbGV4IHRoYW4gYSBzaW1wbGUgdW5tYXAgbGF0ZW5jeSBi ZW5lZml0LCBwb3NzaWJseSBldmVuIGZvciBRQ09NLiAKQ29uc2lkZXIgdGhlIGFjY2VzcyBsYXRl bmN5LCBwb3dlciBhbmQgbWVtb3J5IGJhbmR3aWR0aCBoaXQgZnJvbSBhbGwgdGhlIAphZGRpdGlv bmFsIHBhZ2V0YWJsZSB3YWxrcyBpbmN1cnJlZCBieSBvdGhlciBvbmdvaW5nIHRyYWZmaWMgZmln aHRpbmcgCmFnYWluc3QgdGhvc2UgMTYgc3VjY2Vzc2l2ZSBUTEJJQVNJRHMuIFdoZXRoZXIgaXQn cyBhbiBvdmVyYWxsIHdpbiAKcmVhbGx5IGRlcGVuZHMgb24gdGhlIHNwZWNpZmljIHdvcmtsb2Fk IGFuZCBzeXN0ZW0gY29uZGl0aW9ucyBhcyBtdWNoIGFzIAp0aGUgU01NVSBpbXBsZW1lbnRhdGlv bi4gVGhpbmtpbmcgc29tZSBtb3JlLCBJIHdvbmRlciBpZiB0aGUgVGVncmEgZm9sa3MgCm1pZ2h0 IGhhdmUgYW4gb3BpbmlvbiB0byBhZGQgaGVyZSwgZ2l2ZW4gdGhhdCB0aGVpciBtdWx0aXBsZS1T TU1VIApzb2x1dGlvbiB3YXMgc2VlbWluZ2x5IGFib3V0IHRyeWluZyB0byBnZXQgZW5vdWdoIFRM QiBhbmQgcGFnZXRhYmxlIHdhbGsgCmJhbmR3aWR0aCBpbiB0aGUgZmlyc3QgcGxhY2U/CgpSb2Jp bi4KCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4 LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFk Lm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFy bS1rZXJuZWwK