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=-18.3 required=3.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,MENTIONS_GIT_HOSTING,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_IN_DEF_DKIM_WL 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 E95EFC433DB for ; Wed, 10 Feb 2021 16:44:55 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id AAD2964DF6 for ; Wed, 10 Feb 2021 16:44:55 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232323AbhBJQoV (ORCPT ); Wed, 10 Feb 2021 11:44:21 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41356 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232913AbhBJQj5 (ORCPT ); Wed, 10 Feb 2021 11:39:57 -0500 Received: from mail-wr1-x434.google.com (mail-wr1-x434.google.com [IPv6:2a00:1450:4864:20::434]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 116AFC061786 for ; Wed, 10 Feb 2021 08:39:17 -0800 (PST) Received: by mail-wr1-x434.google.com with SMTP id t15so988653wrx.13 for ; Wed, 10 Feb 2021 08:39:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=gOGAssOJjNZNlPpv3Admt3v46Ue26KYAFuXCNy2Qe2o=; b=XtKMTzFOPBCdpV0RhegZFRZI6m8Ts+1xY7EoA2Ms50fSnr0NIZHzZjRhydkd/+52Aw J/hjZfoj0VIsFjguUaov1H/nE5MIGvYy79rG2n3kbDamIULrKl+/Pg+585VW4wOZRi2t BUbl9dOe76+9xZl7SA1WZWypEwx0cGS8KqWl8zCYwr4v/6ZnenbThSSZwzJfiuRbD+r+ 9m2m+o9FWE4iheRcfKLCWtS071ZUcjuZOcMhC1jyL5FPPhbuApl1JCR45PIbmWAIMREz pJJpIsfgAxDXb60WOoye4pmBjZQT51i2sqcgYF0id5y3XELeLyi2D2R18I0Iqtlfwz80 9qVQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=gOGAssOJjNZNlPpv3Admt3v46Ue26KYAFuXCNy2Qe2o=; b=jGJKpUPG+gB2Lis/mSp6PQhznDRVieRmPZT+t73CbuYSCDxG3K2LpcCPcfnGG5kxxs GBLKakCabSKWJnSF2RgquBT4OblVn3nXY40DNo9+ubxHzKF8ADswnqKdEhRkiX+eyTn7 xrYUeLSdDg9cENOchLdWtl1TiySqoDQdWilDM8Y3Ffct08olwKWDdDurp3h0MGxKpF4p 4zkRPD0yBe+sSOStzSAqVNYL3MGrX+bhehbi8vIWthbOXqlXZ8GDl3x8ubPHhraZNzJZ mrnspU4Rz3dgYjNw1tbWjGBp32EayxMJTQek+f9aHeUhUpPVosyLcxNcO6L+SO1y4jbs stmQ== X-Gm-Message-State: AOAM531/gmI5HeyLldPiXdW4/e0kJlJSLHLXly12/Ag/Sn5uD6wJyImy IuKmRyKO1YLcx+ydnVgLux9y+xPlj+thfkwR6vkbcw== X-Google-Smtp-Source: ABdhPJz6W3Fi44gsEqsR3e/91xfJLnmZbo5TOm1tWh7e9ZQu37Vqa8d/55+DU1UtQhcQZwgEVLLN5Gd+nrQbnmxi21Y= X-Received: by 2002:a5d:430a:: with SMTP id h10mr4707575wrq.162.1612975155501; Wed, 10 Feb 2021 08:39:15 -0800 (PST) MIME-Version: 1.0 References: <20210205080621.3102035-1-john.stultz@linaro.org> <20210205080621.3102035-2-john.stultz@linaro.org> <4471b3b0-603e-6dbb-8064-ff4a95afbba9@amd.com> <48225879-2fe1-22ac-daae-c61d52465aea@amd.com> In-Reply-To: From: Suren Baghdasaryan Date: Wed, 10 Feb 2021 08:39:04 -0800 Message-ID: Subject: Re: [RFC][PATCH v6 1/7] drm: Add a sharable drm page-pool implementation To: Suren Baghdasaryan , =?UTF-8?Q?Christian_K=C3=B6nig?= , John Stultz , lkml , Sumit Semwal , Liam Mark , Chris Goldsworthy , Laura Abbott , Brian Starkey , Hridya Valsaraju , Sandeep Patil , Daniel Mentz , =?UTF-8?Q?=C3=98rjan_Eide?= , Robin Murphy , Ezequiel Garcia , Simon Ser , James Jones , linux-media , dri-devel Cc: Daniel Vetter Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, Feb 10, 2021 at 5:06 AM Daniel Vetter wrote: > > On Tue, Feb 09, 2021 at 12:16:51PM -0800, Suren Baghdasaryan wrote: > > On Tue, Feb 9, 2021 at 12:03 PM Daniel Vetter wrote: > > > > > > On Tue, Feb 9, 2021 at 6:46 PM Christian K=C3=B6nig wrote: > > > > > > > > > > > > > > > > Am 09.02.21 um 18:33 schrieb Suren Baghdasaryan: > > > > > On Tue, Feb 9, 2021 at 4:57 AM Christian K=C3=B6nig wrote: > > > > >> Am 09.02.21 um 13:11 schrieb Christian K=C3=B6nig: > > > > >>> [SNIP] > > > > >>>>>> +void drm_page_pool_add(struct drm_page_pool *pool, struct p= age *page) > > > > >>>>>> +{ > > > > >>>>>> + spin_lock(&pool->lock); > > > > >>>>>> + list_add_tail(&page->lru, &pool->items); > > > > >>>>>> + pool->count++; > > > > >>>>>> + atomic_long_add(1 << pool->order, &total_pages); > > > > >>>>>> + spin_unlock(&pool->lock); > > > > >>>>>> + > > > > >>>>>> + mod_node_page_state(page_pgdat(page), > > > > >>>>>> NR_KERNEL_MISC_RECLAIMABLE, > > > > >>>>>> + 1 << pool->order); > > > > >>>>> Hui what? What should that be good for? > > > > >>>> This is a carryover from the ION page pool implementation: > > > > >>>> https://nam11.safelinks.protection.outlook.com/?url=3Dhttps%3A= %2F%2Fgit.kernel.org%2Fpub%2Fscm%2Flinux%2Fkernel%2Fgit%2Ftorvalds%2Flinux.= git%2Ftree%2Fdrivers%2Fstaging%2Fandroid%2Fion%2Fion_page_pool.c%3Fh%3Dv5.1= 0%23n28&data=3D04%7C01%7Cchristian.koenig%40amd.com%7Cdccccff8edcd4d147= a5b08d8cd20cff2%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C63748488811492= 3580%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik= 1haWwiLCJXVCI6Mn0%3D%7C1000&sdata=3D9%2BIBC0tezSV6Ci4S3kWfW%2BQvJm4mdun= n3dF6C0kyfCw%3D&reserved=3D0 > > > > >>>> > > > > >>>> > > > > >>>> My sense is it helps with the vmstat/meminfo accounting so fol= ks can > > > > >>>> see the cached pages are shrinkable/freeable. This maybe falls= under > > > > >>>> other dmabuf accounting/stats discussions, so I'm happy to rem= ove it > > > > >>>> for now, or let the drivers using the shared page pool logic h= andle > > > > >>>> the accounting themselves? > > > > >> Intentionally separated the discussion for that here. > > > > >> > > > > >> As far as I can see this is just bluntly incorrect. > > > > >> > > > > >> Either the page is reclaimable or it is part of our pool and fre= eable > > > > >> through the shrinker, but never ever both. > > > > > IIRC the original motivation for counting ION pooled pages as > > > > > reclaimable was to include them into /proc/meminfo's MemAvailable > > > > > calculations. NR_KERNEL_MISC_RECLAIMABLE defined as "reclaimable > > > > > non-slab kernel pages" seems like a good place to account for the= m but > > > > > I might be wrong. > > > > > > > > Yeah, that's what I see here as well. But exactly that is utterly n= onsense. > > > > > > > > Those pages are not "free" in the sense that get_free_page could re= turn > > > > them directly. > > > > > > Well on Android that is kinda true, because Android has it's > > > oom-killer (way back it was just a shrinker callback, not sure how it > > > works now), which just shot down all the background apps. So at least > > > some of that (everything used by background apps) is indeed > > > reclaimable on Android. > > > > > > But that doesn't hold on Linux in general, so we can't really do this > > > for common code. > > > > > > Also I had a long meeting with Suren, John and other googles > > > yesterday, and the aim is now to try and support all the Android gpu > > > memory accounting needs with cgroups. That should work, and it will > > > allow Android to handle all the Android-ism in a clean way in upstrea= m > > > code. Or that's at least the plan. > > > > > > I think the only thing we identified that Android still needs on top > > > is the dma-buf sysfs stuff, so that shared buffers (which on Android > > > are always dma-buf, and always stay around as dma-buf fd throughout > > > their lifetime) can be listed/analyzed with full detail. > > > > > > But aside from this the plan for all the per-process or per-heap > > > account, oom-killer integration and everything else is planned to be > > > done with cgroups. > > > > Until cgroups are ready we probably will need to add a sysfs node to > > report the total dmabuf pool size and I think that would cover our > > current accounting need here. > > As I mentioned, not including dmabuf pools into MemAvailable would > > affect that stat and I'm wondering if pools should be considered as > > part of MemAvailable or not. Since MemAvailable includes SReclaimable > > I think it makes sense to include them but maybe there are other > > considerations that I'm missing? > > On Android, yes, on upstream, not so much. Because upstream doesn't have > the android low memory killer cleanup up all the apps, so effectively we > can't reclaim that memory, and we shouldn't report it as such. > -Daniel Hmm. Sorry, I fail to see why Android's low memory killer makes a difference here. In my mind, the pages in the pools are not used but kept there in case heaps need them (maybe that's the part I'm wrong?). These pages can be freed by the shrinker if memory pressure rises. In that sense I think it's very similar to reclaimable slabs which are already accounted as part of MemAvailable. So it seems logical to me to include unused pages in the pools here as well. What am I missing? > > > > > > Android (for now) only needs to account overall gpu > > > memory since none of it is swappable on android drivers anyway, plus > > > no vram, so not much needed. > > > > > > Cheers, Daniel > > > > > > > > > > > Regards, > > > > Christian. > > > > > > > > > > > > > >> In the best case this just messes up the accounting, in the wors= t case > > > > >> it can cause memory corruption. > > > > >> > > > > >> Christian. > > > > > > > > > > > > > -- > > > Daniel Vetter > > > Software Engineer, Intel Corporation > > > http://blog.ffwll.ch > > -- > Daniel Vetter > Software Engineer, Intel Corporation > http://blog.ffwll.ch 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=-8.5 required=3.0 tests=BAYES_00,DKIM_ADSP_CUSTOM_MED, DKIM_INVALID,DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI, MENTIONS_GIT_HOSTING,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED 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 B8DB6C433E6 for ; Wed, 10 Feb 2021 16:39:19 +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 68C7964E8A for ; Wed, 10 Feb 2021 16:39:19 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 68C7964E8A Authentication-Results: mail.kernel.org; dmarc=fail (p=reject dis=none) header.from=google.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 983ED6E332; Wed, 10 Feb 2021 16:39:18 +0000 (UTC) Received: from mail-wr1-x431.google.com (mail-wr1-x431.google.com [IPv6:2a00:1450:4864:20::431]) by gabe.freedesktop.org (Postfix) with ESMTPS id 152E36E332 for ; Wed, 10 Feb 2021 16:39:17 +0000 (UTC) Received: by mail-wr1-x431.google.com with SMTP id 7so3348108wrz.0 for ; Wed, 10 Feb 2021 08:39:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=gOGAssOJjNZNlPpv3Admt3v46Ue26KYAFuXCNy2Qe2o=; b=XtKMTzFOPBCdpV0RhegZFRZI6m8Ts+1xY7EoA2Ms50fSnr0NIZHzZjRhydkd/+52Aw J/hjZfoj0VIsFjguUaov1H/nE5MIGvYy79rG2n3kbDamIULrKl+/Pg+585VW4wOZRi2t BUbl9dOe76+9xZl7SA1WZWypEwx0cGS8KqWl8zCYwr4v/6ZnenbThSSZwzJfiuRbD+r+ 9m2m+o9FWE4iheRcfKLCWtS071ZUcjuZOcMhC1jyL5FPPhbuApl1JCR45PIbmWAIMREz pJJpIsfgAxDXb60WOoye4pmBjZQT51i2sqcgYF0id5y3XELeLyi2D2R18I0Iqtlfwz80 9qVQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=gOGAssOJjNZNlPpv3Admt3v46Ue26KYAFuXCNy2Qe2o=; b=GR4L0weP+JIsX40bWNlRWdiiHwZi53aqxmG9jcboAmjHA0NXuUrojbVIckqYBC+CKU zgKEaY2gb+Tr0P1iEKqbw7748rmVT93qKEuPCin+QXak1dwY+q+tWQmSMZTT3TKuTKRS mTf83vy96baLSjJMtbVkwJZAtfzenGRC0T90v4316NTXMsHNQAldxRgwN1I/U/bqxicj mLy5bqkmR6W2PvNlIBs/GSOQAHiO1RGTQUu5pCSIe8XRIUg98B+I+0ULubTKVj9sTIyC V6ZDOVDvY+kozhPMfs6WCNmzVIRH55qCxWWFkN9pi6V3bcZhzckWyeww5q2NyjrFqRr7 Vr8w== X-Gm-Message-State: AOAM531O9hAtVStN4Avjt9YP0JDf3VhB43Z2CzGk1NZ+m9k6kLeG2+vC SJaXlbw/VdYtuRCH7kivcPkPDd5le3SCaiyjK6ISQQ== X-Google-Smtp-Source: ABdhPJz6W3Fi44gsEqsR3e/91xfJLnmZbo5TOm1tWh7e9ZQu37Vqa8d/55+DU1UtQhcQZwgEVLLN5Gd+nrQbnmxi21Y= X-Received: by 2002:a5d:430a:: with SMTP id h10mr4707575wrq.162.1612975155501; Wed, 10 Feb 2021 08:39:15 -0800 (PST) MIME-Version: 1.0 References: <20210205080621.3102035-1-john.stultz@linaro.org> <20210205080621.3102035-2-john.stultz@linaro.org> <4471b3b0-603e-6dbb-8064-ff4a95afbba9@amd.com> <48225879-2fe1-22ac-daae-c61d52465aea@amd.com> In-Reply-To: From: Suren Baghdasaryan Date: Wed, 10 Feb 2021 08:39:04 -0800 Message-ID: Subject: Re: [RFC][PATCH v6 1/7] drm: Add a sharable drm page-pool implementation To: Suren Baghdasaryan , =?UTF-8?Q?Christian_K=C3=B6nig?= , John Stultz , lkml , Sumit Semwal , Liam Mark , Chris Goldsworthy , Laura Abbott , Brian Starkey , Hridya Valsaraju , Sandeep Patil , Daniel Mentz , =?UTF-8?Q?=C3=98rjan_Eide?= , Robin Murphy , Ezequiel Garcia , Simon Ser , James Jones , linux-media , dri-devel 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: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" T24gV2VkLCBGZWIgMTAsIDIwMjEgYXQgNTowNiBBTSBEYW5pZWwgVmV0dGVyIDxkYW5pZWxAZmZ3 bGwuY2g+IHdyb3RlOgo+Cj4gT24gVHVlLCBGZWIgMDksIDIwMjEgYXQgMTI6MTY6NTFQTSAtMDgw MCwgU3VyZW4gQmFnaGRhc2FyeWFuIHdyb3RlOgo+ID4gT24gVHVlLCBGZWIgOSwgMjAyMSBhdCAx MjowMyBQTSBEYW5pZWwgVmV0dGVyIDxkYW5pZWxAZmZ3bGwuY2g+IHdyb3RlOgo+ID4gPgo+ID4g PiBPbiBUdWUsIEZlYiA5LCAyMDIxIGF0IDY6NDYgUE0gQ2hyaXN0aWFuIEvDtm5pZyA8Y2hyaXN0 aWFuLmtvZW5pZ0BhbWQuY29tPiB3cm90ZToKPiA+ID4gPgo+ID4gPiA+Cj4gPiA+ID4KPiA+ID4g PiBBbSAwOS4wMi4yMSB1bSAxODozMyBzY2hyaWViIFN1cmVuIEJhZ2hkYXNhcnlhbjoKPiA+ID4g PiA+IE9uIFR1ZSwgRmViIDksIDIwMjEgYXQgNDo1NyBBTSBDaHJpc3RpYW4gS8O2bmlnIDxjaHJp c3RpYW4ua29lbmlnQGFtZC5jb20+IHdyb3RlOgo+ID4gPiA+ID4+IEFtIDA5LjAyLjIxIHVtIDEz OjExIHNjaHJpZWIgQ2hyaXN0aWFuIEvDtm5pZzoKPiA+ID4gPiA+Pj4gW1NOSVBdCj4gPiA+ID4g Pj4+Pj4+ICt2b2lkIGRybV9wYWdlX3Bvb2xfYWRkKHN0cnVjdCBkcm1fcGFnZV9wb29sICpwb29s LCBzdHJ1Y3QgcGFnZSAqcGFnZSkKPiA+ID4gPiA+Pj4+Pj4gK3sKPiA+ID4gPiA+Pj4+Pj4gKyAg ICAgc3Bpbl9sb2NrKCZwb29sLT5sb2NrKTsKPiA+ID4gPiA+Pj4+Pj4gKyAgICAgbGlzdF9hZGRf dGFpbCgmcGFnZS0+bHJ1LCAmcG9vbC0+aXRlbXMpOwo+ID4gPiA+ID4+Pj4+PiArICAgICBwb29s LT5jb3VudCsrOwo+ID4gPiA+ID4+Pj4+PiArICAgICBhdG9taWNfbG9uZ19hZGQoMSA8PCBwb29s LT5vcmRlciwgJnRvdGFsX3BhZ2VzKTsKPiA+ID4gPiA+Pj4+Pj4gKyAgICAgc3Bpbl91bmxvY2so JnBvb2wtPmxvY2spOwo+ID4gPiA+ID4+Pj4+PiArCj4gPiA+ID4gPj4+Pj4+ICsgICAgIG1vZF9u b2RlX3BhZ2Vfc3RhdGUocGFnZV9wZ2RhdChwYWdlKSwKPiA+ID4gPiA+Pj4+Pj4gTlJfS0VSTkVM X01JU0NfUkVDTEFJTUFCTEUsCj4gPiA+ID4gPj4+Pj4+ICsgICAgICAgICAgICAgICAgICAgICAg ICAgMSA8PCBwb29sLT5vcmRlcik7Cj4gPiA+ID4gPj4+Pj4gSHVpIHdoYXQ/IFdoYXQgc2hvdWxk IHRoYXQgYmUgZ29vZCBmb3I/Cj4gPiA+ID4gPj4+PiBUaGlzIGlzIGEgY2FycnlvdmVyIGZyb20g dGhlIElPTiBwYWdlIHBvb2wgaW1wbGVtZW50YXRpb246Cj4gPiA+ID4gPj4+PiBodHRwczovL25h bTExLnNhZmVsaW5rcy5wcm90ZWN0aW9uLm91dGxvb2suY29tLz91cmw9aHR0cHMlM0ElMkYlMkZn aXQua2VybmVsLm9yZyUyRnB1YiUyRnNjbSUyRmxpbnV4JTJGa2VybmVsJTJGZ2l0JTJGdG9ydmFs ZHMlMkZsaW51eC5naXQlMkZ0cmVlJTJGZHJpdmVycyUyRnN0YWdpbmclMkZhbmRyb2lkJTJGaW9u JTJGaW9uX3BhZ2VfcG9vbC5jJTNGaCUzRHY1LjEwJTIzbjI4JmFtcDtkYXRhPTA0JTdDMDElN0Nj aHJpc3RpYW4ua29lbmlnJTQwYW1kLmNvbSU3Q2RjY2NjZmY4ZWRjZDRkMTQ3YTViMDhkOGNkMjBj ZmYyJTdDM2RkODk2MWZlNDg4NGU2MDhlMTFhODJkOTk0ZTE4M2QlN0MwJTdDMCU3QzYzNzQ4NDg4 ODExNDkyMzU4MCU3Q1Vua25vd24lN0NUV0ZwYkdac2IzZDhleUpXSWpvaU1DNHdMakF3TURBaUxD SlFJam9pVjJsdU16SWlMQ0pCVGlJNklrMWhhV3dpTENKWFZDSTZNbjAlM0QlN0MxMDAwJmFtcDtz ZGF0YT05JTJCSUJDMHRlelNWNkNpNFMza1dmVyUyQlF2Sm00bWR1bm4zZEY2QzBreWZDdyUzRCZh bXA7cmVzZXJ2ZWQ9MAo+ID4gPiA+ID4+Pj4KPiA+ID4gPiA+Pj4+Cj4gPiA+ID4gPj4+PiBNeSBz ZW5zZSBpcyBpdCBoZWxwcyB3aXRoIHRoZSB2bXN0YXQvbWVtaW5mbyBhY2NvdW50aW5nIHNvIGZv bGtzIGNhbgo+ID4gPiA+ID4+Pj4gc2VlIHRoZSBjYWNoZWQgcGFnZXMgYXJlIHNocmlua2FibGUv ZnJlZWFibGUuIFRoaXMgbWF5YmUgZmFsbHMgdW5kZXIKPiA+ID4gPiA+Pj4+IG90aGVyIGRtYWJ1 ZiBhY2NvdW50aW5nL3N0YXRzIGRpc2N1c3Npb25zLCBzbyBJJ20gaGFwcHkgdG8gcmVtb3ZlIGl0 Cj4gPiA+ID4gPj4+PiBmb3Igbm93LCBvciBsZXQgdGhlIGRyaXZlcnMgdXNpbmcgdGhlIHNoYXJl ZCBwYWdlIHBvb2wgbG9naWMgaGFuZGxlCj4gPiA+ID4gPj4+PiB0aGUgYWNjb3VudGluZyB0aGVt c2VsdmVzPwo+ID4gPiA+ID4+IEludGVudGlvbmFsbHkgc2VwYXJhdGVkIHRoZSBkaXNjdXNzaW9u IGZvciB0aGF0IGhlcmUuCj4gPiA+ID4gPj4KPiA+ID4gPiA+PiBBcyBmYXIgYXMgSSBjYW4gc2Vl IHRoaXMgaXMganVzdCBibHVudGx5IGluY29ycmVjdC4KPiA+ID4gPiA+Pgo+ID4gPiA+ID4+IEVp dGhlciB0aGUgcGFnZSBpcyByZWNsYWltYWJsZSBvciBpdCBpcyBwYXJ0IG9mIG91ciBwb29sIGFu ZCBmcmVlYWJsZQo+ID4gPiA+ID4+IHRocm91Z2ggdGhlIHNocmlua2VyLCBidXQgbmV2ZXIgZXZl ciBib3RoLgo+ID4gPiA+ID4gSUlSQyB0aGUgb3JpZ2luYWwgbW90aXZhdGlvbiBmb3IgY291bnRp bmcgSU9OIHBvb2xlZCBwYWdlcyBhcwo+ID4gPiA+ID4gcmVjbGFpbWFibGUgd2FzIHRvIGluY2x1 ZGUgdGhlbSBpbnRvIC9wcm9jL21lbWluZm8ncyBNZW1BdmFpbGFibGUKPiA+ID4gPiA+IGNhbGN1 bGF0aW9ucy4gTlJfS0VSTkVMX01JU0NfUkVDTEFJTUFCTEUgZGVmaW5lZCBhcyAicmVjbGFpbWFi bGUKPiA+ID4gPiA+IG5vbi1zbGFiIGtlcm5lbCBwYWdlcyIgc2VlbXMgbGlrZSBhIGdvb2QgcGxh Y2UgdG8gYWNjb3VudCBmb3IgdGhlbSBidXQKPiA+ID4gPiA+IEkgbWlnaHQgYmUgd3JvbmcuCj4g PiA+ID4KPiA+ID4gPiBZZWFoLCB0aGF0J3Mgd2hhdCBJIHNlZSBoZXJlIGFzIHdlbGwuIEJ1dCBl eGFjdGx5IHRoYXQgaXMgdXR0ZXJseSBub25zZW5zZS4KPiA+ID4gPgo+ID4gPiA+IFRob3NlIHBh Z2VzIGFyZSBub3QgImZyZWUiIGluIHRoZSBzZW5zZSB0aGF0IGdldF9mcmVlX3BhZ2UgY291bGQg cmV0dXJuCj4gPiA+ID4gdGhlbSBkaXJlY3RseS4KPiA+ID4KPiA+ID4gV2VsbCBvbiBBbmRyb2lk IHRoYXQgaXMga2luZGEgdHJ1ZSwgYmVjYXVzZSBBbmRyb2lkIGhhcyBpdCdzCj4gPiA+IG9vbS1r aWxsZXIgKHdheSBiYWNrIGl0IHdhcyBqdXN0IGEgc2hyaW5rZXIgY2FsbGJhY2ssIG5vdCBzdXJl IGhvdyBpdAo+ID4gPiB3b3JrcyBub3cpLCB3aGljaCBqdXN0IHNob3QgZG93biBhbGwgdGhlIGJh Y2tncm91bmQgYXBwcy4gU28gYXQgbGVhc3QKPiA+ID4gc29tZSBvZiB0aGF0IChldmVyeXRoaW5n IHVzZWQgYnkgYmFja2dyb3VuZCBhcHBzKSBpcyBpbmRlZWQKPiA+ID4gcmVjbGFpbWFibGUgb24g QW5kcm9pZC4KPiA+ID4KPiA+ID4gQnV0IHRoYXQgZG9lc24ndCBob2xkIG9uIExpbnV4IGluIGdl bmVyYWwsIHNvIHdlIGNhbid0IHJlYWxseSBkbyB0aGlzCj4gPiA+IGZvciBjb21tb24gY29kZS4K PiA+ID4KPiA+ID4gQWxzbyBJIGhhZCBhIGxvbmcgbWVldGluZyB3aXRoIFN1cmVuLCBKb2huIGFu ZCBvdGhlciBnb29nbGVzCj4gPiA+IHllc3RlcmRheSwgYW5kIHRoZSBhaW0gaXMgbm93IHRvIHRy eSBhbmQgc3VwcG9ydCBhbGwgdGhlIEFuZHJvaWQgZ3B1Cj4gPiA+IG1lbW9yeSBhY2NvdW50aW5n IG5lZWRzIHdpdGggY2dyb3Vwcy4gVGhhdCBzaG91bGQgd29yaywgYW5kIGl0IHdpbGwKPiA+ID4g YWxsb3cgQW5kcm9pZCB0byBoYW5kbGUgYWxsIHRoZSBBbmRyb2lkLWlzbSBpbiBhIGNsZWFuIHdh eSBpbiB1cHN0cmVhbQo+ID4gPiBjb2RlLiBPciB0aGF0J3MgYXQgbGVhc3QgdGhlIHBsYW4uCj4g PiA+Cj4gPiA+IEkgdGhpbmsgdGhlIG9ubHkgdGhpbmcgd2UgaWRlbnRpZmllZCB0aGF0IEFuZHJv aWQgc3RpbGwgbmVlZHMgb24gdG9wCj4gPiA+IGlzIHRoZSBkbWEtYnVmIHN5c2ZzIHN0dWZmLCBz byB0aGF0IHNoYXJlZCBidWZmZXJzICh3aGljaCBvbiBBbmRyb2lkCj4gPiA+IGFyZSBhbHdheXMg ZG1hLWJ1ZiwgYW5kIGFsd2F5cyBzdGF5IGFyb3VuZCBhcyBkbWEtYnVmIGZkIHRocm91Z2hvdXQK PiA+ID4gdGhlaXIgbGlmZXRpbWUpIGNhbiBiZSBsaXN0ZWQvYW5hbHl6ZWQgd2l0aCBmdWxsIGRl dGFpbC4KPiA+ID4KPiA+ID4gQnV0IGFzaWRlIGZyb20gdGhpcyB0aGUgcGxhbiBmb3IgYWxsIHRo ZSBwZXItcHJvY2VzcyBvciBwZXItaGVhcAo+ID4gPiBhY2NvdW50LCBvb20ta2lsbGVyIGludGVn cmF0aW9uIGFuZCBldmVyeXRoaW5nIGVsc2UgaXMgcGxhbm5lZCB0byBiZQo+ID4gPiBkb25lIHdp dGggY2dyb3Vwcy4KPiA+Cj4gPiBVbnRpbCBjZ3JvdXBzIGFyZSByZWFkeSB3ZSBwcm9iYWJseSB3 aWxsIG5lZWQgdG8gYWRkIGEgc3lzZnMgbm9kZSB0bwo+ID4gcmVwb3J0IHRoZSB0b3RhbCBkbWFi dWYgcG9vbCBzaXplIGFuZCBJIHRoaW5rIHRoYXQgd291bGQgY292ZXIgb3VyCj4gPiBjdXJyZW50 IGFjY291bnRpbmcgbmVlZCBoZXJlLgo+ID4gQXMgSSBtZW50aW9uZWQsIG5vdCBpbmNsdWRpbmcg ZG1hYnVmIHBvb2xzIGludG8gTWVtQXZhaWxhYmxlIHdvdWxkCj4gPiBhZmZlY3QgdGhhdCBzdGF0 IGFuZCBJJ20gd29uZGVyaW5nIGlmIHBvb2xzIHNob3VsZCBiZSBjb25zaWRlcmVkIGFzCj4gPiBw YXJ0IG9mIE1lbUF2YWlsYWJsZSBvciBub3QuIFNpbmNlIE1lbUF2YWlsYWJsZSBpbmNsdWRlcyBT UmVjbGFpbWFibGUKPiA+IEkgdGhpbmsgaXQgbWFrZXMgc2Vuc2UgdG8gaW5jbHVkZSB0aGVtIGJ1 dCBtYXliZSB0aGVyZSBhcmUgb3RoZXIKPiA+IGNvbnNpZGVyYXRpb25zIHRoYXQgSSdtIG1pc3Np bmc/Cj4KPiBPbiBBbmRyb2lkLCB5ZXMsIG9uIHVwc3RyZWFtLCBub3Qgc28gbXVjaC4gQmVjYXVz ZSB1cHN0cmVhbSBkb2Vzbid0IGhhdmUKPiB0aGUgYW5kcm9pZCBsb3cgbWVtb3J5IGtpbGxlciBj bGVhbnVwIHVwIGFsbCB0aGUgYXBwcywgc28gZWZmZWN0aXZlbHkgd2UKPiBjYW4ndCByZWNsYWlt IHRoYXQgbWVtb3J5LCBhbmQgd2Ugc2hvdWxkbid0IHJlcG9ydCBpdCBhcyBzdWNoLgo+IC1EYW5p ZWwKCkhtbS4gU29ycnksIEkgZmFpbCB0byBzZWUgd2h5IEFuZHJvaWQncyBsb3cgbWVtb3J5IGtp bGxlciBtYWtlcyBhCmRpZmZlcmVuY2UgaGVyZS4gSW4gbXkgbWluZCwgdGhlIHBhZ2VzIGluIHRo ZSBwb29scyBhcmUgbm90IHVzZWQgYnV0CmtlcHQgdGhlcmUgaW4gY2FzZSBoZWFwcyBuZWVkIHRo ZW0gKG1heWJlIHRoYXQncyB0aGUgcGFydCBJJ20gd3Jvbmc/KS4KVGhlc2UgcGFnZXMgY2FuIGJl IGZyZWVkIGJ5IHRoZSBzaHJpbmtlciBpZiBtZW1vcnkgcHJlc3N1cmUgcmlzZXMuIEluCnRoYXQg c2Vuc2UgSSB0aGluayBpdCdzIHZlcnkgc2ltaWxhciB0byByZWNsYWltYWJsZSBzbGFicyB3aGlj aCBhcmUKYWxyZWFkeSBhY2NvdW50ZWQgYXMgcGFydCBvZiBNZW1BdmFpbGFibGUuIFNvIGl0IHNl ZW1zIGxvZ2ljYWwgdG8gbWUKdG8gaW5jbHVkZSB1bnVzZWQgcGFnZXMgaW4gdGhlIHBvb2xzIGhl cmUgYXMgd2VsbC4gV2hhdCBhbSBJIG1pc3Npbmc/Cgo+Cj4gPgo+ID4gPiBBbmRyb2lkIChmb3Ig bm93KSBvbmx5IG5lZWRzIHRvIGFjY291bnQgb3ZlcmFsbCBncHUKPiA+ID4gbWVtb3J5IHNpbmNl IG5vbmUgb2YgaXQgaXMgc3dhcHBhYmxlIG9uIGFuZHJvaWQgZHJpdmVycyBhbnl3YXksIHBsdXMK PiA+ID4gbm8gdnJhbSwgc28gbm90IG11Y2ggbmVlZGVkLgo+ID4gPgo+ID4gPiBDaGVlcnMsIERh bmllbAo+ID4gPgo+ID4gPiA+Cj4gPiA+ID4gUmVnYXJkcywKPiA+ID4gPiBDaHJpc3RpYW4uCj4g PiA+ID4KPiA+ID4gPiA+Cj4gPiA+ID4gPj4gSW4gdGhlIGJlc3QgY2FzZSB0aGlzIGp1c3QgbWVz c2VzIHVwIHRoZSBhY2NvdW50aW5nLCBpbiB0aGUgd29yc3QgY2FzZQo+ID4gPiA+ID4+IGl0IGNh biBjYXVzZSBtZW1vcnkgY29ycnVwdGlvbi4KPiA+ID4gPiA+Pgo+ID4gPiA+ID4+IENocmlzdGlh bi4KPiA+ID4gPgo+ID4gPgo+ID4gPgo+ID4gPiAtLQo+ID4gPiBEYW5pZWwgVmV0dGVyCj4gPiA+ IFNvZnR3YXJlIEVuZ2luZWVyLCBJbnRlbCBDb3Jwb3JhdGlvbgo+ID4gPiBodHRwOi8vYmxvZy5m ZndsbC5jaAo+Cj4gLS0KPiBEYW5pZWwgVmV0dGVyCj4gU29mdHdhcmUgRW5naW5lZXIsIEludGVs IENvcnBvcmF0aW9uCj4gaHR0cDovL2Jsb2cuZmZ3bGwuY2gKX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2 ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21h aWxtYW4vbGlzdGluZm8vZHJpLWRldmVsCg==