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=-2.3 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_SANE_1 autolearn=no 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 4D1AAECE588 for ; Wed, 16 Oct 2019 08:58:08 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 1C4FA20872 for ; Wed, 16 Oct 2019 08:58:08 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="vI5EgckJ" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732705AbfJPI6H (ORCPT ); Wed, 16 Oct 2019 04:58:07 -0400 Received: from mail-wr1-f68.google.com ([209.85.221.68]:42893 "EHLO mail-wr1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730468AbfJPI6H (ORCPT ); Wed, 16 Oct 2019 04:58:07 -0400 Received: by mail-wr1-f68.google.com with SMTP id n14so27004941wrw.9 for ; Wed, 16 Oct 2019 01:58:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=reply-to:subject:to:cc:references:from:message-id:date:user-agent :mime-version:in-reply-to:content-transfer-encoding:content-language; bh=V+4SMbJY+xnY/02Qu1SPKip6GAEd3pyslcFpF7IxHBM=; b=vI5EgckJStxRO73bc+3CwPgKxclRbKnLXPsOtNhcrVURZW63+9T1e2AR+xD4ChmYjb F09Az3ubghdrV9WGNALSeqQTPTWu3DRy4fj4jt/7XpCfcYOXb97srJ+8PG01E8O4sYxe alaKfq+3azM37/Z9sab8NfOx5RuG3cz3D7bOj0LoGEmV03UEbCQ2M8o4eH+iNDAL65kT NUkh3nPZoaRQ4VtHUDdLuoZtEpF2ba26YAvw6u7cdrsWGafqXs3O/NxmX5gnSy0+Nkjz xUjXcoBkOZ9KEXo6In0z6fpRL/TMFSnEc3h3Phoj68Pum7UJui5fB1f08XIfVZboPN+1 5OYg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:reply-to:subject:to:cc:references:from :message-id:date:user-agent:mime-version:in-reply-to :content-transfer-encoding:content-language; bh=V+4SMbJY+xnY/02Qu1SPKip6GAEd3pyslcFpF7IxHBM=; b=n6/ZXnnWsIcgUG6ZyT7qFZPfLLcTEq+JVhtLmoXBxKG6ufcVVUR+L5fDKUG6gis8zl aiiP+/ydld8F1F2+XaYNTKRpPkvZfgrs1HoeC84U418ykE5TOuBCWz56g/5yZMdoyuT1 /GjDrq9qJkjqixIxTU4zoylhXnvIM6kyl2EWpXK07JhH605JZpLlCaDHPrib3LmUkgvS iTLcfaPZGCwYJBMmEH8bMbPotVmT2rWHZABGD0sOQy+4Q/pTB4uR2MHpoiSoKFBoB8Pu KYCVR0KFr4MEq8msg2w2auO1BhoIBT97uM41x6hylrqnsX4I/6dMLuR+/n0aZMTWNzOe LfOg== X-Gm-Message-State: APjAAAUftIZoo6sJg0E5IrBb1HYHxe/FGWVg8xYH8onDCjKuQ0qyKRE/ mC3YanRWQtGu/Fg7EIXpAx4= X-Google-Smtp-Source: APXvYqywHpqS2WwakM+BUQmjn7/0SQxlW6RiaETqeNUjKm43xk/4p1AdnGlHpqoSz8YMsyfharKZLg== X-Received: by 2002:adf:fa92:: with SMTP id h18mr1684319wrr.220.1571216284378; Wed, 16 Oct 2019 01:58:04 -0700 (PDT) Received: from ?IPv6:2a02:908:1252:fb60:be8a:bd56:1f94:86e7? ([2a02:908:1252:fb60:be8a:bd56:1f94:86e7]) by smtp.gmail.com with ESMTPSA id b5sm1610909wmj.18.2019.10.16.01.58.03 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 16 Oct 2019 01:58:03 -0700 (PDT) Reply-To: christian.koenig@amd.com Subject: Re: [PATCH hmm 00/15] Consolidate the mmu notifier interval_tree and locking To: Jason Gunthorpe , Jerome Glisse , Ralph Campbell , John Hubbard , Felix.Kuehling@amd.com Cc: Andrea Arcangeli , linux-rdma@vger.kernel.org, amd-gfx@lists.freedesktop.org, linux-mm@kvack.org, Jason Gunthorpe , dri-devel@lists.freedesktop.org, Ben Skeggs References: <20191015181242.8343-1-jgg@ziepe.ca> From: =?UTF-8?Q?Christian_K=c3=b6nig?= Message-ID: Date: Wed, 16 Oct 2019 10:58:02 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.9.0 MIME-Version: 1.0 In-Reply-To: <20191015181242.8343-1-jgg@ziepe.ca> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Content-Language: en-US Sender: linux-rdma-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-rdma@vger.kernel.org Am 15.10.19 um 20:12 schrieb Jason Gunthorpe: > From: Jason Gunthorpe > > 8 of the mmu_notifier using drivers (i915_gem, radeon_mn, umem_odp, hfi1, > scif_dma, vhost, gntdev, hmm) drivers are using a common pattern where > they only use invalidate_range_start/end and immediately check the > invalidating range against some driver data structure to tell if the > driver is interested. Half of them use an interval_tree, the others are > simple linear search lists. > > Of the ones I checked they largely seem to have various kinds of races, > bugs and poor implementation. This is a result of the complexity in how > the notifier interacts with get_user_pages(). It is extremely difficult to > use it correctly. > > Consolidate all of this code together into the core mmu_notifier and > provide a locking scheme similar to hmm_mirror that allows the user to > safely use get_user_pages() and reliably know if the page list still > matches the mm. That sounds really good, but could you outline for a moment how that is archived? Please keep in mind that the page reference get_user_pages() grabs is *NOT* sufficient to guarantee coherency here. Regards, Christian. > > This new arrangment plays nicely with the !blockable mode for > OOM. Scanning the interval tree is done such that the intersection test > will always succeed, and since there is no invalidate_range_end exposed to > drivers the scheme safely allows multiple drivers to be subscribed. > > Four places are converted as an example of how the new API is used. > Four are left for future patches: > - i915_gem has complex locking around destruction of a registration, > needs more study > - hfi1 (2nd user) needs access to the rbtree > - scif_dma has a complicated logic flow > - vhost's mmu notifiers are already being rewritten > > This is still being tested, but I figured to send it to start getting help > from the xen, amd and hfi drivers which I cannot test here. > > It would be intended for the hmm tree. > > Jason Gunthorpe (15): > mm/mmu_notifier: define the header pre-processor parts even if > disabled > mm/mmu_notifier: add an interval tree notifier > mm/hmm: allow hmm_range to be used with a mmu_range_notifier or > hmm_mirror > mm/hmm: define the pre-processor related parts of hmm.h even if > disabled > RDMA/odp: Use mmu_range_notifier_insert() > RDMA/hfi1: Use mmu_range_notifier_inset for user_exp_rcv > drm/radeon: use mmu_range_notifier_insert > xen/gntdev: Use select for DMA_SHARED_BUFFER > xen/gntdev: use mmu_range_notifier_insert > nouveau: use mmu_notifier directly for invalidate_range_start > nouveau: use mmu_range_notifier instead of hmm_mirror > drm/amdgpu: Call find_vma under mmap_sem > drm/amdgpu: Use mmu_range_insert instead of hmm_mirror > drm/amdgpu: Use mmu_range_notifier instead of hmm_mirror > mm/hmm: remove hmm_mirror and related > > Documentation/vm/hmm.rst | 105 +--- > drivers/gpu/drm/amd/amdgpu/amdgpu.h | 2 + > .../gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 9 +- > drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 14 +- > drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 1 + > drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c | 445 ++------------ > drivers/gpu/drm/amd/amdgpu/amdgpu_mn.h | 53 -- > drivers/gpu/drm/amd/amdgpu/amdgpu_object.h | 13 +- > drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 111 ++-- > drivers/gpu/drm/nouveau/nouveau_svm.c | 229 +++++--- > drivers/gpu/drm/radeon/radeon.h | 9 +- > drivers/gpu/drm/radeon/radeon_mn.c | 218 ++----- > drivers/infiniband/core/device.c | 1 - > drivers/infiniband/core/umem_odp.c | 288 +--------- > drivers/infiniband/hw/hfi1/file_ops.c | 2 +- > drivers/infiniband/hw/hfi1/hfi.h | 2 +- > drivers/infiniband/hw/hfi1/user_exp_rcv.c | 144 ++--- > drivers/infiniband/hw/hfi1/user_exp_rcv.h | 3 +- > drivers/infiniband/hw/mlx5/mlx5_ib.h | 7 +- > drivers/infiniband/hw/mlx5/mr.c | 3 +- > drivers/infiniband/hw/mlx5/odp.c | 48 +- > drivers/xen/Kconfig | 3 +- > drivers/xen/gntdev-common.h | 8 +- > drivers/xen/gntdev.c | 179 ++---- > include/linux/hmm.h | 195 +------ > include/linux/mmu_notifier.h | 124 +++- > include/rdma/ib_umem_odp.h | 65 +-- > include/rdma/ib_verbs.h | 2 - > kernel/fork.c | 1 - > mm/Kconfig | 2 +- > mm/hmm.c | 275 +-------- > mm/mmu_notifier.c | 542 +++++++++++++++++- > 32 files changed, 1180 insertions(+), 1923 deletions(-) > From mboxrd@z Thu Jan 1 00:00:00 1970 From: =?UTF-8?Q?Christian_K=c3=b6nig?= Subject: Re: [PATCH hmm 00/15] Consolidate the mmu notifier interval_tree and locking Date: Wed, 16 Oct 2019 10:58:02 +0200 Message-ID: References: <20191015181242.8343-1-jgg@ziepe.ca> Reply-To: christian.koenig-5C7GfCeVMHo@public.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20191015181242.8343-1-jgg-uk2M96/98Pc@public.gmane.org> Content-Language: en-US List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: amd-gfx-bounces-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org Sender: "amd-gfx" To: Jason Gunthorpe , Jerome Glisse , Ralph Campbell , John Hubbard , Felix.Kuehling-5C7GfCeVMHo@public.gmane.org Cc: Andrea Arcangeli , linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org, linux-mm-Bw31MaZKKs3YtjvyW6yDsg@public.gmane.org, Jason Gunthorpe , amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org, Ben Skeggs List-Id: dri-devel@lists.freedesktop.org QW0gMTUuMTAuMTkgdW0gMjA6MTIgc2NocmllYiBKYXNvbiBHdW50aG9ycGU6Cj4gRnJvbTogSmFz b24gR3VudGhvcnBlIDxqZ2dAbWVsbGFub3guY29tPgo+Cj4gOCBvZiB0aGUgbW11X25vdGlmaWVy IHVzaW5nIGRyaXZlcnMgKGk5MTVfZ2VtLCByYWRlb25fbW4sIHVtZW1fb2RwLCBoZmkxLAo+IHNj aWZfZG1hLCB2aG9zdCwgZ250ZGV2LCBobW0pIGRyaXZlcnMgYXJlIHVzaW5nIGEgY29tbW9uIHBh dHRlcm4gd2hlcmUKPiB0aGV5IG9ubHkgdXNlIGludmFsaWRhdGVfcmFuZ2Vfc3RhcnQvZW5kIGFu ZCBpbW1lZGlhdGVseSBjaGVjayB0aGUKPiBpbnZhbGlkYXRpbmcgcmFuZ2UgYWdhaW5zdCBzb21l IGRyaXZlciBkYXRhIHN0cnVjdHVyZSB0byB0ZWxsIGlmIHRoZQo+IGRyaXZlciBpcyBpbnRlcmVz dGVkLiBIYWxmIG9mIHRoZW0gdXNlIGFuIGludGVydmFsX3RyZWUsIHRoZSBvdGhlcnMgYXJlCj4g c2ltcGxlIGxpbmVhciBzZWFyY2ggbGlzdHMuCj4KPiBPZiB0aGUgb25lcyBJIGNoZWNrZWQgdGhl eSBsYXJnZWx5IHNlZW0gdG8gaGF2ZSB2YXJpb3VzIGtpbmRzIG9mIHJhY2VzLAo+IGJ1Z3MgYW5k IHBvb3IgaW1wbGVtZW50YXRpb24uIFRoaXMgaXMgYSByZXN1bHQgb2YgdGhlIGNvbXBsZXhpdHkg aW4gaG93Cj4gdGhlIG5vdGlmaWVyIGludGVyYWN0cyB3aXRoIGdldF91c2VyX3BhZ2VzKCkuIEl0 IGlzIGV4dHJlbWVseSBkaWZmaWN1bHQgdG8KPiB1c2UgaXQgY29ycmVjdGx5Lgo+Cj4gQ29uc29s aWRhdGUgYWxsIG9mIHRoaXMgY29kZSB0b2dldGhlciBpbnRvIHRoZSBjb3JlIG1tdV9ub3RpZmll ciBhbmQKPiBwcm92aWRlIGEgbG9ja2luZyBzY2hlbWUgc2ltaWxhciB0byBobW1fbWlycm9yIHRo YXQgYWxsb3dzIHRoZSB1c2VyIHRvCj4gc2FmZWx5IHVzZSBnZXRfdXNlcl9wYWdlcygpIGFuZCBy ZWxpYWJseSBrbm93IGlmIHRoZSBwYWdlIGxpc3Qgc3RpbGwKPiBtYXRjaGVzIHRoZSBtbS4KClRo YXQgc291bmRzIHJlYWxseSBnb29kLCBidXQgY291bGQgeW91IG91dGxpbmUgZm9yIGEgbW9tZW50 IGhvdyB0aGF0IGlzIAphcmNoaXZlZD8KClBsZWFzZSBrZWVwIGluIG1pbmQgdGhhdCB0aGUgcGFn ZSByZWZlcmVuY2UgZ2V0X3VzZXJfcGFnZXMoKSBncmFicyBpcyAKKk5PVCogc3VmZmljaWVudCB0 byBndWFyYW50ZWUgY29oZXJlbmN5IGhlcmUuCgpSZWdhcmRzLApDaHJpc3RpYW4uCgo+Cj4gVGhp cyBuZXcgYXJyYW5nbWVudCBwbGF5cyBuaWNlbHkgd2l0aCB0aGUgIWJsb2NrYWJsZSBtb2RlIGZv cgo+IE9PTS4gU2Nhbm5pbmcgdGhlIGludGVydmFsIHRyZWUgaXMgZG9uZSBzdWNoIHRoYXQgdGhl IGludGVyc2VjdGlvbiB0ZXN0Cj4gd2lsbCBhbHdheXMgc3VjY2VlZCwgYW5kIHNpbmNlIHRoZXJl IGlzIG5vIGludmFsaWRhdGVfcmFuZ2VfZW5kIGV4cG9zZWQgdG8KPiBkcml2ZXJzIHRoZSBzY2hl bWUgc2FmZWx5IGFsbG93cyBtdWx0aXBsZSBkcml2ZXJzIHRvIGJlIHN1YnNjcmliZWQuCj4KPiBG b3VyIHBsYWNlcyBhcmUgY29udmVydGVkIGFzIGFuIGV4YW1wbGUgb2YgaG93IHRoZSBuZXcgQVBJ IGlzIHVzZWQuCj4gRm91ciBhcmUgbGVmdCBmb3IgZnV0dXJlIHBhdGNoZXM6Cj4gICAtIGk5MTVf Z2VtIGhhcyBjb21wbGV4IGxvY2tpbmcgYXJvdW5kIGRlc3RydWN0aW9uIG9mIGEgcmVnaXN0cmF0 aW9uLAo+ICAgICBuZWVkcyBtb3JlIHN0dWR5Cj4gICAtIGhmaTEgKDJuZCB1c2VyKSBuZWVkcyBh Y2Nlc3MgdG8gdGhlIHJidHJlZQo+ICAgLSBzY2lmX2RtYSBoYXMgYSBjb21wbGljYXRlZCBsb2dp YyBmbG93Cj4gICAtIHZob3N0J3MgbW11IG5vdGlmaWVycyBhcmUgYWxyZWFkeSBiZWluZyByZXdy aXR0ZW4KPgo+IFRoaXMgaXMgc3RpbGwgYmVpbmcgdGVzdGVkLCBidXQgSSBmaWd1cmVkIHRvIHNl bmQgaXQgdG8gc3RhcnQgZ2V0dGluZyBoZWxwCj4gZnJvbSB0aGUgeGVuLCBhbWQgYW5kIGhmaSBk cml2ZXJzIHdoaWNoIEkgY2Fubm90IHRlc3QgaGVyZS4KPgo+IEl0IHdvdWxkIGJlIGludGVuZGVk IGZvciB0aGUgaG1tIHRyZWUuCj4KPiBKYXNvbiBHdW50aG9ycGUgKDE1KToKPiAgICBtbS9tbXVf bm90aWZpZXI6IGRlZmluZSB0aGUgaGVhZGVyIHByZS1wcm9jZXNzb3IgcGFydHMgZXZlbiBpZgo+ ICAgICAgZGlzYWJsZWQKPiAgICBtbS9tbXVfbm90aWZpZXI6IGFkZCBhbiBpbnRlcnZhbCB0cmVl IG5vdGlmaWVyCj4gICAgbW0vaG1tOiBhbGxvdyBobW1fcmFuZ2UgdG8gYmUgdXNlZCB3aXRoIGEg bW11X3JhbmdlX25vdGlmaWVyIG9yCj4gICAgICBobW1fbWlycm9yCj4gICAgbW0vaG1tOiBkZWZp bmUgdGhlIHByZS1wcm9jZXNzb3IgcmVsYXRlZCBwYXJ0cyBvZiBobW0uaCBldmVuIGlmCj4gICAg ICBkaXNhYmxlZAo+ICAgIFJETUEvb2RwOiBVc2UgbW11X3JhbmdlX25vdGlmaWVyX2luc2VydCgp Cj4gICAgUkRNQS9oZmkxOiBVc2UgbW11X3JhbmdlX25vdGlmaWVyX2luc2V0IGZvciB1c2VyX2V4 cF9yY3YKPiAgICBkcm0vcmFkZW9uOiB1c2UgbW11X3JhbmdlX25vdGlmaWVyX2luc2VydAo+ICAg IHhlbi9nbnRkZXY6IFVzZSBzZWxlY3QgZm9yIERNQV9TSEFSRURfQlVGRkVSCj4gICAgeGVuL2du dGRldjogdXNlIG1tdV9yYW5nZV9ub3RpZmllcl9pbnNlcnQKPiAgICBub3V2ZWF1OiB1c2UgbW11 X25vdGlmaWVyIGRpcmVjdGx5IGZvciBpbnZhbGlkYXRlX3JhbmdlX3N0YXJ0Cj4gICAgbm91dmVh dTogdXNlIG1tdV9yYW5nZV9ub3RpZmllciBpbnN0ZWFkIG9mIGhtbV9taXJyb3IKPiAgICBkcm0v YW1kZ3B1OiBDYWxsIGZpbmRfdm1hIHVuZGVyIG1tYXBfc2VtCj4gICAgZHJtL2FtZGdwdTogVXNl IG1tdV9yYW5nZV9pbnNlcnQgaW5zdGVhZCBvZiBobW1fbWlycm9yCj4gICAgZHJtL2FtZGdwdTog VXNlIG1tdV9yYW5nZV9ub3RpZmllciBpbnN0ZWFkIG9mIGhtbV9taXJyb3IKPiAgICBtbS9obW06 IHJlbW92ZSBobW1fbWlycm9yIGFuZCByZWxhdGVkCj4KPiAgIERvY3VtZW50YXRpb24vdm0vaG1t LnJzdCAgICAgICAgICAgICAgICAgICAgICB8IDEwNSArLS0tCj4gICBkcml2ZXJzL2dwdS9kcm0v YW1kL2FtZGdwdS9hbWRncHUuaCAgICAgICAgICAgfCAgIDIgKwo+ICAgLi4uL2dwdS9kcm0vYW1k L2FtZGdwdS9hbWRncHVfYW1ka2ZkX2dwdXZtLmMgIHwgICA5ICstCj4gICBkcml2ZXJzL2dwdS9k cm0vYW1kL2FtZGdwdS9hbWRncHVfY3MuYyAgICAgICAgfCAgMTQgKy0KPiAgIGRyaXZlcnMvZ3B1 L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV9kZXZpY2UuYyAgICB8ICAgMSArCj4gICBkcml2ZXJzL2dw dS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfbW4uYyAgICAgICAgfCA0NDUgKystLS0tLS0tLS0tLS0K PiAgIGRyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV9tbi5oICAgICAgICB8ICA1MyAt LQo+ICAgZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X29iamVjdC5oICAgIHwgIDEz ICstCj4gICBkcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfdHRtLmMgICAgICAgfCAx MTEgKystLQo+ICAgZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9zdm0uYyAgICAgICAg IHwgMjI5ICsrKysrLS0tCj4gICBkcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbi5oICAgICAg ICAgICAgICAgfCAgIDkgKy0KPiAgIGRyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX21uLmMg ICAgICAgICAgICB8IDIxOCArKy0tLS0tCj4gICBkcml2ZXJzL2luZmluaWJhbmQvY29yZS9kZXZp Y2UuYyAgICAgICAgICAgICAgfCAgIDEgLQo+ICAgZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdW1l bV9vZHAuYyAgICAgICAgICAgIHwgMjg4ICstLS0tLS0tLS0KPiAgIGRyaXZlcnMvaW5maW5pYmFu ZC9ody9oZmkxL2ZpbGVfb3BzLmMgICAgICAgICB8ICAgMiArLQo+ICAgZHJpdmVycy9pbmZpbmli YW5kL2h3L2hmaTEvaGZpLmggICAgICAgICAgICAgIHwgICAyICstCj4gICBkcml2ZXJzL2luZmlu aWJhbmQvaHcvaGZpMS91c2VyX2V4cF9yY3YuYyAgICAgfCAxNDQgKystLS0KPiAgIGRyaXZlcnMv aW5maW5pYmFuZC9ody9oZmkxL3VzZXJfZXhwX3Jjdi5oICAgICB8ICAgMyArLQo+ICAgZHJpdmVy cy9pbmZpbmliYW5kL2h3L21seDUvbWx4NV9pYi5oICAgICAgICAgIHwgICA3ICstCj4gICBkcml2 ZXJzL2luZmluaWJhbmQvaHcvbWx4NS9tci5jICAgICAgICAgICAgICAgfCAgIDMgKy0KPiAgIGRy aXZlcnMvaW5maW5pYmFuZC9ody9tbHg1L29kcC5jICAgICAgICAgICAgICB8ICA0OCArLQo+ICAg ZHJpdmVycy94ZW4vS2NvbmZpZyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzICstCj4g ICBkcml2ZXJzL3hlbi9nbnRkZXYtY29tbW9uLmggICAgICAgICAgICAgICAgICAgfCAgIDggKy0K PiAgIGRyaXZlcnMveGVuL2dudGRldi5jICAgICAgICAgICAgICAgICAgICAgICAgICB8IDE3OSAr Ky0tLS0KPiAgIGluY2x1ZGUvbGludXgvaG1tLmggICAgICAgICAgICAgICAgICAgICAgICAgICB8 IDE5NSArLS0tLS0tCj4gICBpbmNsdWRlL2xpbnV4L21tdV9ub3RpZmllci5oICAgICAgICAgICAg ICAgICAgfCAxMjQgKysrLQo+ICAgaW5jbHVkZS9yZG1hL2liX3VtZW1fb2RwLmggICAgICAgICAg ICAgICAgICAgIHwgIDY1ICstLQo+ICAgaW5jbHVkZS9yZG1hL2liX3ZlcmJzLmggICAgICAgICAg ICAgICAgICAgICAgIHwgICAyIC0KPiAgIGtlcm5lbC9mb3JrLmMgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICB8ICAgMSAtCj4gICBtbS9LY29uZmlnICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgfCAgIDIgKy0KPiAgIG1tL2htbS5jICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICB8IDI3NSArLS0tLS0tLS0KPiAgIG1tL21tdV9ub3RpZmllci5jICAg ICAgICAgICAgICAgICAgICAgICAgICAgICB8IDU0MiArKysrKysrKysrKysrKysrKy0KPiAgIDMy IGZpbGVzIGNoYW5nZWQsIDExODAgaW5zZXJ0aW9ucygrKSwgMTkyMyBkZWxldGlvbnMoLSkKPgoK X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KYW1kLWdmeCBt YWlsaW5nIGxpc3QKYW1kLWdmeEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5m cmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9hbWQtZ2Z4