From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752597AbeDQIVC (ORCPT ); Tue, 17 Apr 2018 04:21:02 -0400 Received: from mail-lf0-f66.google.com ([209.85.215.66]:34241 "EHLO mail-lf0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751096AbeDQITZ (ORCPT ); Tue, 17 Apr 2018 04:19:25 -0400 X-Google-Smtp-Source: AIpwx4/ur0Psqd1vCNS7jnwFe5clomikG8X2aJlTPlAkWZvk+/g6lkXhtP9HH2bym+uFbMnbn6YyNQ== Subject: Re: [PATCH 0/1] drm/xen-zcopy: Add Xen zero-copy helper DRM driver To: Dongwon Kim , jgross@suse.com, Artem Mygaiev , konrad.wilk@oracle.com, airlied@linux.ie, Oleksandr Andrushchenko , linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, "Potrola, MateuszX" , daniel.vetter@intel.com, xen-devel@lists.xenproject.org, boris.ostrovsky@oracle.com References: <20180329131931.29957-1-andr2000@gmail.com> <5d8fec7f-956c-378f-be90-f45029385740@gmail.com> <20180416192905.GA18096@downor-Z87X-UD5H> <20180417075928.GT31310@phenom.ffwll.local> From: Oleksandr Andrushchenko Message-ID: Date: Tue, 17 Apr 2018 11:19:22 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.7.0 MIME-Version: 1.0 In-Reply-To: <20180417075928.GT31310@phenom.ffwll.local> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Content-Language: en-US Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 04/17/2018 10:59 AM, Daniel Vetter wrote: > On Mon, Apr 16, 2018 at 12:29:05PM -0700, Dongwon Kim wrote: >> Yeah, I definitely agree on the idea of expanding the use case to the >> general domain where dmabuf sharing is used. However, what you are >> targetting with proposed changes is identical to the core design of >> hyper_dmabuf. >> >> On top of this basic functionalities, hyper_dmabuf has driver level >> inter-domain communication, that is needed for dma-buf remote tracking >> (no fence forwarding though), event triggering and event handling, extra >> meta data exchange and hyper_dmabuf_id that represents grefs >> (grefs are shared implicitly on driver level) > This really isn't a positive design aspect of hyperdmabuf imo. The core > code in xen-zcopy (ignoring the ioctl side, which will be cleaned up) is > very simple & clean. > > If there's a clear need later on we can extend that. But for now xen-zcopy > seems to cover the basic use-case needs, so gets the job done. After we decided to remove DRM PRIME code from the zcopy driver I think we can extend the existing Xen drivers instead of introducing a new one: gntdev [1], [2] - to handle export/import of the dma-bufs to/from grefs balloon [3] - to allow allocating CMA buffers >> Also it is designed with frontend (common core framework) + backend >> (hyper visor specific comm and memory sharing) structure for portability. >> We just can't limit this feature to Xen because we want to use the same >> uapis not only for Xen but also other applicable hypervisor, like ACORN. > See the discussion around udmabuf and the needs for kvm. I think trying to > make an ioctl/uapi that works for multiple hypervisors is misguided - it > likely won't work. > > On top of that the 2nd hypervisor you're aiming to support is ACRN. That's > not even upstream yet, nor have I seen any patches proposing to land linux > support for ACRN. Since it's not upstream, it doesn't really matter for > upstream consideration. I'm doubting that ACRN will use the same grant > references as xen, so the same uapi won't work on ACRN as on Xen anyway. > >> So I am wondering we can start with this hyper_dmabuf then modify it for >> your use-case if needed and polish and fix any glitches if we want to >> to use this for all general dma-buf usecases. > Imo xen-zcopy is a much more reasonable starting point for upstream, which > can then be extended (if really proven to be necessary). > >> Also, I still have one unresolved question regarding the export/import flow >> in both of hyper_dmabuf and xen-zcopy. >> >> @danvet: Would this flow (guest1->import existing dmabuf->share underlying >> pages->guest2->map shared pages->create/export dmabuf) be acceptable now? > I think if you just look at the pages, and make sure you handle the > sg_page == NULL case it's ok-ish. It's not great, but mostly it should > work. The real trouble with hyperdmabuf was the forwarding of all these > calls, instead of just passing around a list of grant references. > -Daniel > >> Regards, >> DW >> >> On Mon, Apr 16, 2018 at 05:33:46PM +0300, Oleksandr Andrushchenko wrote: >>> Hello, all! >>> >>> After discussing xen-zcopy and hyper-dmabuf [1] approaches Even more context for the discussion [4], so Xen community can catch up >>> it seems that xen-zcopy can be made not depend on DRM core any more >>> >>> and be dma-buf centric (which it in fact is). >>> >>> The DRM code was mostly there for dma-buf's FD import/export >>> >>> with DRM PRIME UAPI and with DRM use-cases in mind, but it comes out that if >>> >>> the proposed 2 IOCTLs (DRM_XEN_ZCOPY_DUMB_FROM_REFS and >>> DRM_XEN_ZCOPY_DUMB_TO_REFS) >>> >>> are extended to also provide a file descriptor of the corresponding dma-buf, >>> then >>> >>> PRIME stuff in the driver is not needed anymore. >>> >>> That being said, xen-zcopy can safely be detached from DRM and moved from >>> >>> drivers/gpu/drm/xen into drivers/xen/dma-buf-backend(?). >>> >>> This driver then becomes a universal way to turn any shared buffer between >>> Dom0/DomD >>> >>> and DomU(s) into a dma-buf, e.g. one can create a dma-buf from any grant >>> references >>> >>> or represent a dma-buf as grant-references for export. >>> >>> This way the driver can be used not only for DRM use-cases, but also for >>> other >>> >>> use-cases which may require zero copying between domains. >>> >>> For example, the use-cases we are about to work in the nearest future will >>> use >>> >>> V4L, e.g. we plan to support cameras, codecs etc. and all these will benefit >>> >>> from zero copying much. Potentially, even block/net devices may benefit, >>> >>> but this needs some evaluation. >>> >>> >>> I would love to hear comments for authors of the hyper-dmabuf >>> >>> and Xen community, as well as DRI-Devel and other interested parties. >>> >>> >>> Thank you, >>> >>> Oleksandr >>> >>> >>> On 03/29/2018 04:19 PM, Oleksandr Andrushchenko wrote: >>>> From: Oleksandr Andrushchenko >>>> >>>> Hello! >>>> >>>> When using Xen PV DRM frontend driver then on backend side one will need >>>> to do copying of display buffers' contents (filled by the >>>> frontend's user-space) into buffers allocated at the backend side. >>>> Taking into account the size of display buffers and frames per seconds >>>> it may result in unneeded huge data bus occupation and performance loss. >>>> >>>> This helper driver allows implementing zero-copying use-cases >>>> when using Xen para-virtualized frontend display driver by >>>> implementing a DRM/KMS helper driver running on backend's side. >>>> It utilizes PRIME buffers API to share frontend's buffers with >>>> physical device drivers on backend's side: >>>> >>>> - a dumb buffer created on backend's side can be shared >>>> with the Xen PV frontend driver, so it directly writes >>>> into backend's domain memory (into the buffer exported from >>>> DRM/KMS driver of a physical display device) >>>> - a dumb buffer allocated by the frontend can be imported >>>> into physical device DRM/KMS driver, thus allowing to >>>> achieve no copying as well >>>> >>>> For that reason number of IOCTLs are introduced: >>>> - DRM_XEN_ZCOPY_DUMB_FROM_REFS >>>> This will create a DRM dumb buffer from grant references provided >>>> by the frontend >>>> - DRM_XEN_ZCOPY_DUMB_TO_REFS >>>> This will grant references to a dumb/display buffer's memory provided >>>> by the backend >>>> - DRM_XEN_ZCOPY_DUMB_WAIT_FREE >>>> This will block until the dumb buffer with the wait handle provided >>>> be freed >>>> >>>> With this helper driver I was able to drop CPU usage from 17% to 3% >>>> on Renesas R-Car M3 board. >>>> >>>> This was tested with Renesas' Wayland-KMS and backend running as DRM master. >>>> >>>> Thank you, >>>> Oleksandr >>>> >>>> Oleksandr Andrushchenko (1): >>>> drm/xen-zcopy: Add Xen zero-copy helper DRM driver >>>> >>>> Documentation/gpu/drivers.rst | 1 + >>>> Documentation/gpu/xen-zcopy.rst | 32 + >>>> drivers/gpu/drm/xen/Kconfig | 25 + >>>> drivers/gpu/drm/xen/Makefile | 5 + >>>> drivers/gpu/drm/xen/xen_drm_zcopy.c | 880 ++++++++++++++++++++++++++++ >>>> drivers/gpu/drm/xen/xen_drm_zcopy_balloon.c | 154 +++++ >>>> drivers/gpu/drm/xen/xen_drm_zcopy_balloon.h | 38 ++ >>>> include/uapi/drm/xen_zcopy_drm.h | 129 ++++ >>>> 8 files changed, 1264 insertions(+) >>>> create mode 100644 Documentation/gpu/xen-zcopy.rst >>>> create mode 100644 drivers/gpu/drm/xen/xen_drm_zcopy.c >>>> create mode 100644 drivers/gpu/drm/xen/xen_drm_zcopy_balloon.c >>>> create mode 100644 drivers/gpu/drm/xen/xen_drm_zcopy_balloon.h >>>> create mode 100644 include/uapi/drm/xen_zcopy_drm.h >>>> >>> [1] >>> https://lists.xenproject.org/archives/html/xen-devel/2018-02/msg01202.html >> _______________________________________________ >> dri-devel mailing list >> dri-devel@lists.freedesktop.org >> https://lists.freedesktop.org/mailman/listinfo/dri-devel [1] https://elixir.bootlin.com/linux/v4.17-rc1/source/include/uapi/xen/gntdev.h [2] https://elixir.bootlin.com/linux/v4.17-rc1/source/drivers/xen/gntdev.c [3] https://elixir.bootlin.com/linux/v4.17-rc1/source/drivers/xen/balloon.c [4] https://lkml.org/lkml/2018/4/16/355 From mboxrd@z Thu Jan 1 00:00:00 1970 From: Oleksandr Andrushchenko Subject: Re: [PATCH 0/1] drm/xen-zcopy: Add Xen zero-copy helper DRM driver Date: Tue, 17 Apr 2018 11:19:22 +0300 Message-ID: References: <20180329131931.29957-1-andr2000@gmail.com> <5d8fec7f-956c-378f-be90-f45029385740@gmail.com> <20180416192905.GA18096@downor-Z87X-UD5H> <20180417075928.GT31310@phenom.ffwll.local> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: Received: from mail-lf0-x244.google.com (mail-lf0-x244.google.com [IPv6:2a00:1450:4010:c07::244]) by gabe.freedesktop.org (Postfix) with ESMTPS id E74FC89AB7 for ; Tue, 17 Apr 2018 08:19:25 +0000 (UTC) Received: by mail-lf0-x244.google.com with SMTP id z130-v6so475878lff.5 for ; Tue, 17 Apr 2018 01:19:25 -0700 (PDT) In-Reply-To: <20180417075928.GT31310@phenom.ffwll.local> Content-Language: en-US List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Dongwon Kim , jgross@suse.com, Artem Mygaiev , konrad.wilk@oracle.com, airlied@linux.ie, Oleksandr Andrushchenko , linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, "Potrola, MateuszX" , daniel.vetter@intel.com, xen-devel@lists.xenproject.org, boris.ostrovsky@oracle.com List-Id: dri-devel@lists.freedesktop.org T24gMDQvMTcvMjAxOCAxMDo1OSBBTSwgRGFuaWVsIFZldHRlciB3cm90ZToKPiBPbiBNb24sIEFw ciAxNiwgMjAxOCBhdCAxMjoyOTowNVBNIC0wNzAwLCBEb25nd29uIEtpbSB3cm90ZToKPj4gWWVh aCwgSSBkZWZpbml0ZWx5IGFncmVlIG9uIHRoZSBpZGVhIG9mIGV4cGFuZGluZyB0aGUgdXNlIGNh c2UgdG8gdGhlCj4+IGdlbmVyYWwgZG9tYWluIHdoZXJlIGRtYWJ1ZiBzaGFyaW5nIGlzIHVzZWQu IEhvd2V2ZXIsIHdoYXQgeW91IGFyZQo+PiB0YXJnZXR0aW5nIHdpdGggcHJvcG9zZWQgY2hhbmdl cyBpcyBpZGVudGljYWwgdG8gdGhlIGNvcmUgZGVzaWduIG9mCj4+IGh5cGVyX2RtYWJ1Zi4KPj4K Pj4gT24gdG9wIG9mIHRoaXMgYmFzaWMgZnVuY3Rpb25hbGl0aWVzLCBoeXBlcl9kbWFidWYgaGFz IGRyaXZlciBsZXZlbAo+PiBpbnRlci1kb21haW4gY29tbXVuaWNhdGlvbiwgdGhhdCBpcyBuZWVk ZWQgZm9yIGRtYS1idWYgcmVtb3RlIHRyYWNraW5nCj4+IChubyBmZW5jZSBmb3J3YXJkaW5nIHRo b3VnaCksIGV2ZW50IHRyaWdnZXJpbmcgYW5kIGV2ZW50IGhhbmRsaW5nLCBleHRyYQo+PiBtZXRh IGRhdGEgZXhjaGFuZ2UgYW5kIGh5cGVyX2RtYWJ1Zl9pZCB0aGF0IHJlcHJlc2VudHMgZ3JlZnMK Pj4gKGdyZWZzIGFyZSBzaGFyZWQgaW1wbGljaXRseSBvbiBkcml2ZXIgbGV2ZWwpCj4gVGhpcyBy ZWFsbHkgaXNuJ3QgYSBwb3NpdGl2ZSBkZXNpZ24gYXNwZWN0IG9mIGh5cGVyZG1hYnVmIGltby4g VGhlIGNvcmUKPiBjb2RlIGluIHhlbi16Y29weSAoaWdub3JpbmcgdGhlIGlvY3RsIHNpZGUsIHdo aWNoIHdpbGwgYmUgY2xlYW5lZCB1cCkgaXMKPiB2ZXJ5IHNpbXBsZSAmIGNsZWFuLgo+Cj4gSWYg dGhlcmUncyBhIGNsZWFyIG5lZWQgbGF0ZXIgb24gd2UgY2FuIGV4dGVuZCB0aGF0LiBCdXQgZm9y IG5vdyB4ZW4temNvcHkKPiBzZWVtcyB0byBjb3ZlciB0aGUgYmFzaWMgdXNlLWNhc2UgbmVlZHMs IHNvIGdldHMgdGhlIGpvYiBkb25lLgpBZnRlciB3ZSBkZWNpZGVkIHRvIHJlbW92ZSBEUk0gUFJJ TUUgY29kZSBmcm9tIHRoZSB6Y29weSBkcml2ZXIKSSB0aGluayB3ZSBjYW4gZXh0ZW5kIHRoZSBl eGlzdGluZyBYZW4gZHJpdmVycyBpbnN0ZWFkIG9mIGludHJvZHVjaW5nCmEgbmV3IG9uZToKZ250 ZGV2IFsxXSwgWzJdIC0gdG8gaGFuZGxlIGV4cG9ydC9pbXBvcnQgb2YgdGhlIGRtYS1idWZzIHRv L2Zyb20gZ3JlZnMKYmFsbG9vbiBbM10gLSB0byBhbGxvdyBhbGxvY2F0aW5nIENNQSBidWZmZXJz Cj4+IEFsc28gaXQgaXMgZGVzaWduZWQgd2l0aCBmcm9udGVuZCAoY29tbW9uIGNvcmUgZnJhbWV3 b3JrKSArIGJhY2tlbmQKPj4gKGh5cGVyIHZpc29yIHNwZWNpZmljIGNvbW0gYW5kIG1lbW9yeSBz aGFyaW5nKSBzdHJ1Y3R1cmUgZm9yIHBvcnRhYmlsaXR5Lgo+PiBXZSBqdXN0IGNhbid0IGxpbWl0 IHRoaXMgZmVhdHVyZSB0byBYZW4gYmVjYXVzZSB3ZSB3YW50IHRvIHVzZSB0aGUgc2FtZQo+PiB1 YXBpcyBub3Qgb25seSBmb3IgWGVuIGJ1dCBhbHNvIG90aGVyIGFwcGxpY2FibGUgaHlwZXJ2aXNv ciwgbGlrZSBBQ09STi4KPiBTZWUgdGhlIGRpc2N1c3Npb24gYXJvdW5kIHVkbWFidWYgYW5kIHRo ZSBuZWVkcyBmb3Iga3ZtLiBJIHRoaW5rIHRyeWluZyB0bwo+IG1ha2UgYW4gaW9jdGwvdWFwaSB0 aGF0IHdvcmtzIGZvciBtdWx0aXBsZSBoeXBlcnZpc29ycyBpcyBtaXNndWlkZWQgLSBpdAo+IGxp a2VseSB3b24ndCB3b3JrLgo+Cj4gT24gdG9wIG9mIHRoYXQgdGhlIDJuZCBoeXBlcnZpc29yIHlv dSdyZSBhaW1pbmcgdG8gc3VwcG9ydCBpcyBBQ1JOLiBUaGF0J3MKPiBub3QgZXZlbiB1cHN0cmVh bSB5ZXQsIG5vciBoYXZlIEkgc2VlbiBhbnkgcGF0Y2hlcyBwcm9wb3NpbmcgdG8gbGFuZCBsaW51 eAo+IHN1cHBvcnQgZm9yIEFDUk4uIFNpbmNlIGl0J3Mgbm90IHVwc3RyZWFtLCBpdCBkb2Vzbid0 IHJlYWxseSBtYXR0ZXIgZm9yCj4gdXBzdHJlYW0gY29uc2lkZXJhdGlvbi4gSSdtIGRvdWJ0aW5n IHRoYXQgQUNSTiB3aWxsIHVzZSB0aGUgc2FtZSBncmFudAo+IHJlZmVyZW5jZXMgYXMgeGVuLCBz byB0aGUgc2FtZSB1YXBpIHdvbid0IHdvcmsgb24gQUNSTiBhcyBvbiBYZW4gYW55d2F5Lgo+Cj4+ IFNvIEkgYW0gd29uZGVyaW5nIHdlIGNhbiBzdGFydCB3aXRoIHRoaXMgaHlwZXJfZG1hYnVmIHRo ZW4gbW9kaWZ5IGl0IGZvcgo+PiB5b3VyIHVzZS1jYXNlIGlmIG5lZWRlZCBhbmQgcG9saXNoIGFu ZCBmaXggYW55IGdsaXRjaGVzIGlmIHdlIHdhbnQgdG8KPj4gdG8gdXNlIHRoaXMgZm9yIGFsbCBn ZW5lcmFsIGRtYS1idWYgdXNlY2FzZXMuCj4gSW1vIHhlbi16Y29weSBpcyBhIG11Y2ggbW9yZSBy ZWFzb25hYmxlIHN0YXJ0aW5nIHBvaW50IGZvciB1cHN0cmVhbSwgd2hpY2gKPiBjYW4gdGhlbiBi ZSBleHRlbmRlZCAoaWYgcmVhbGx5IHByb3ZlbiB0byBiZSBuZWNlc3NhcnkpLgo+Cj4+IEFsc28s IEkgc3RpbGwgaGF2ZSBvbmUgdW5yZXNvbHZlZCBxdWVzdGlvbiByZWdhcmRpbmcgdGhlIGV4cG9y dC9pbXBvcnQgZmxvdwo+PiBpbiBib3RoIG9mIGh5cGVyX2RtYWJ1ZiBhbmQgeGVuLXpjb3B5Lgo+ Pgo+PiBAZGFudmV0OiBXb3VsZCB0aGlzIGZsb3cgKGd1ZXN0MS0+aW1wb3J0IGV4aXN0aW5nIGRt YWJ1Zi0+c2hhcmUgdW5kZXJseWluZwo+PiBwYWdlcy0+Z3Vlc3QyLT5tYXAgc2hhcmVkIHBhZ2Vz LT5jcmVhdGUvZXhwb3J0IGRtYWJ1ZikgYmUgYWNjZXB0YWJsZSBub3c/Cj4gSSB0aGluayBpZiB5 b3UganVzdCBsb29rIGF0IHRoZSBwYWdlcywgYW5kIG1ha2Ugc3VyZSB5b3UgaGFuZGxlIHRoZQo+ IHNnX3BhZ2UgPT0gTlVMTCBjYXNlIGl0J3Mgb2staXNoLiBJdCdzIG5vdCBncmVhdCwgYnV0IG1v c3RseSBpdCBzaG91bGQKPiB3b3JrLiBUaGUgcmVhbCB0cm91YmxlIHdpdGggaHlwZXJkbWFidWYg d2FzIHRoZSBmb3J3YXJkaW5nIG9mIGFsbCB0aGVzZQo+IGNhbGxzLCBpbnN0ZWFkIG9mIGp1c3Qg cGFzc2luZyBhcm91bmQgYSBsaXN0IG9mIGdyYW50IHJlZmVyZW5jZXMuCj4gLURhbmllbAo+Cj4+ IFJlZ2FyZHMsCj4+IERXCj4+ICAgCj4+IE9uIE1vbiwgQXByIDE2LCAyMDE4IGF0IDA1OjMzOjQ2 UE0gKzAzMDAsIE9sZWtzYW5kciBBbmRydXNoY2hlbmtvIHdyb3RlOgo+Pj4gSGVsbG8sIGFsbCEK Pj4+Cj4+PiBBZnRlciBkaXNjdXNzaW5nIHhlbi16Y29weSBhbmQgaHlwZXItZG1hYnVmIFsxXSBh cHByb2FjaGVzCkV2ZW4gbW9yZSBjb250ZXh0IGZvciB0aGUgZGlzY3Vzc2lvbiBbNF0sIHNvIFhl biBjb21tdW5pdHkgY2FuCmNhdGNoIHVwCj4+PiBpdCBzZWVtcyB0aGF0IHhlbi16Y29weSBjYW4g YmUgbWFkZSBub3QgZGVwZW5kIG9uIERSTSBjb3JlIGFueSBtb3JlCj4+Pgo+Pj4gYW5kIGJlIGRt YS1idWYgY2VudHJpYyAod2hpY2ggaXQgaW4gZmFjdCBpcykuCj4+Pgo+Pj4gVGhlIERSTSBjb2Rl IHdhcyBtb3N0bHkgdGhlcmUgZm9yIGRtYS1idWYncyBGRCBpbXBvcnQvZXhwb3J0Cj4+Pgo+Pj4g d2l0aCBEUk0gUFJJTUUgVUFQSSBhbmQgd2l0aCBEUk0gdXNlLWNhc2VzIGluIG1pbmQsIGJ1dCBp dCBjb21lcyBvdXQgdGhhdCBpZgo+Pj4KPj4+IHRoZSBwcm9wb3NlZCAyIElPQ1RMcyAoRFJNX1hF Tl9aQ09QWV9EVU1CX0ZST01fUkVGUyBhbmQKPj4+IERSTV9YRU5fWkNPUFlfRFVNQl9UT19SRUZT KQo+Pj4KPj4+IGFyZSBleHRlbmRlZCB0byBhbHNvIHByb3ZpZGUgYSBmaWxlIGRlc2NyaXB0b3Ig b2YgdGhlIGNvcnJlc3BvbmRpbmcgZG1hLWJ1ZiwKPj4+IHRoZW4KPj4+Cj4+PiBQUklNRSBzdHVm ZiBpbiB0aGUgZHJpdmVyIGlzIG5vdCBuZWVkZWQgYW55bW9yZS4KPj4+Cj4+PiBUaGF0IGJlaW5n IHNhaWQsIHhlbi16Y29weSBjYW4gc2FmZWx5IGJlIGRldGFjaGVkIGZyb20gRFJNIGFuZCBtb3Zl ZCBmcm9tCj4+Pgo+Pj4gZHJpdmVycy9ncHUvZHJtL3hlbiBpbnRvIGRyaXZlcnMveGVuL2RtYS1i dWYtYmFja2VuZCg/KS4KPj4+Cj4+PiBUaGlzIGRyaXZlciB0aGVuIGJlY29tZXMgYSB1bml2ZXJz YWwgd2F5IHRvIHR1cm4gYW55IHNoYXJlZCBidWZmZXIgYmV0d2Vlbgo+Pj4gRG9tMC9Eb21ECj4+ Pgo+Pj4gYW5kIERvbVUocykgaW50byBhIGRtYS1idWYsIGUuZy4gb25lIGNhbiBjcmVhdGUgYSBk bWEtYnVmIGZyb20gYW55IGdyYW50Cj4+PiByZWZlcmVuY2VzCj4+Pgo+Pj4gb3IgcmVwcmVzZW50 IGEgZG1hLWJ1ZiBhcyBncmFudC1yZWZlcmVuY2VzIGZvciBleHBvcnQuCj4+Pgo+Pj4gVGhpcyB3 YXkgdGhlIGRyaXZlciBjYW4gYmUgdXNlZCBub3Qgb25seSBmb3IgRFJNIHVzZS1jYXNlcywgYnV0 IGFsc28gZm9yCj4+PiBvdGhlcgo+Pj4KPj4+IHVzZS1jYXNlcyB3aGljaCBtYXkgcmVxdWlyZSB6 ZXJvIGNvcHlpbmcgYmV0d2VlbiBkb21haW5zLgo+Pj4KPj4+IEZvciBleGFtcGxlLCB0aGUgdXNl LWNhc2VzIHdlIGFyZSBhYm91dCB0byB3b3JrIGluIHRoZSBuZWFyZXN0IGZ1dHVyZSB3aWxsCj4+ PiB1c2UKPj4+Cj4+PiBWNEwsIGUuZy4gd2UgcGxhbiB0byBzdXBwb3J0IGNhbWVyYXMsIGNvZGVj cyBldGMuIGFuZCBhbGwgdGhlc2Ugd2lsbCBiZW5lZml0Cj4+Pgo+Pj4gZnJvbSB6ZXJvIGNvcHlp bmcgbXVjaC4gUG90ZW50aWFsbHksIGV2ZW4gYmxvY2svbmV0IGRldmljZXMgbWF5IGJlbmVmaXQs Cj4+Pgo+Pj4gYnV0IHRoaXMgbmVlZHMgc29tZSBldmFsdWF0aW9uLgo+Pj4KPj4+Cj4+PiBJIHdv dWxkIGxvdmUgdG8gaGVhciBjb21tZW50cyBmb3IgYXV0aG9ycyBvZiB0aGUgaHlwZXItZG1hYnVm Cj4+Pgo+Pj4gYW5kIFhlbiBjb21tdW5pdHksIGFzIHdlbGwgYXMgRFJJLURldmVsIGFuZCBvdGhl ciBpbnRlcmVzdGVkIHBhcnRpZXMuCj4+Pgo+Pj4KPj4+IFRoYW5rIHlvdSwKPj4+Cj4+PiBPbGVr c2FuZHIKPj4+Cj4+Pgo+Pj4gT24gMDMvMjkvMjAxOCAwNDoxOSBQTSwgT2xla3NhbmRyIEFuZHJ1 c2hjaGVua28gd3JvdGU6Cj4+Pj4gRnJvbTogT2xla3NhbmRyIEFuZHJ1c2hjaGVua28gPG9sZWtz YW5kcl9hbmRydXNoY2hlbmtvQGVwYW0uY29tPgo+Pj4+Cj4+Pj4gSGVsbG8hCj4+Pj4KPj4+PiBX aGVuIHVzaW5nIFhlbiBQViBEUk0gZnJvbnRlbmQgZHJpdmVyIHRoZW4gb24gYmFja2VuZCBzaWRl IG9uZSB3aWxsIG5lZWQKPj4+PiB0byBkbyBjb3B5aW5nIG9mIGRpc3BsYXkgYnVmZmVycycgY29u dGVudHMgKGZpbGxlZCBieSB0aGUKPj4+PiBmcm9udGVuZCdzIHVzZXItc3BhY2UpIGludG8gYnVm ZmVycyBhbGxvY2F0ZWQgYXQgdGhlIGJhY2tlbmQgc2lkZS4KPj4+PiBUYWtpbmcgaW50byBhY2Nv dW50IHRoZSBzaXplIG9mIGRpc3BsYXkgYnVmZmVycyBhbmQgZnJhbWVzIHBlciBzZWNvbmRzCj4+ Pj4gaXQgbWF5IHJlc3VsdCBpbiB1bm5lZWRlZCBodWdlIGRhdGEgYnVzIG9jY3VwYXRpb24gYW5k IHBlcmZvcm1hbmNlIGxvc3MuCj4+Pj4KPj4+PiBUaGlzIGhlbHBlciBkcml2ZXIgYWxsb3dzIGlt cGxlbWVudGluZyB6ZXJvLWNvcHlpbmcgdXNlLWNhc2VzCj4+Pj4gd2hlbiB1c2luZyBYZW4gcGFy YS12aXJ0dWFsaXplZCBmcm9udGVuZCBkaXNwbGF5IGRyaXZlciBieQo+Pj4+IGltcGxlbWVudGlu ZyBhIERSTS9LTVMgaGVscGVyIGRyaXZlciBydW5uaW5nIG9uIGJhY2tlbmQncyBzaWRlLgo+Pj4+ IEl0IHV0aWxpemVzIFBSSU1FIGJ1ZmZlcnMgQVBJIHRvIHNoYXJlIGZyb250ZW5kJ3MgYnVmZmVy cyB3aXRoCj4+Pj4gcGh5c2ljYWwgZGV2aWNlIGRyaXZlcnMgb24gYmFja2VuZCdzIHNpZGU6Cj4+ Pj4KPj4+PiAgIC0gYSBkdW1iIGJ1ZmZlciBjcmVhdGVkIG9uIGJhY2tlbmQncyBzaWRlIGNhbiBi ZSBzaGFyZWQKPj4+PiAgICAgd2l0aCB0aGUgWGVuIFBWIGZyb250ZW5kIGRyaXZlciwgc28gaXQg ZGlyZWN0bHkgd3JpdGVzCj4+Pj4gICAgIGludG8gYmFja2VuZCdzIGRvbWFpbiBtZW1vcnkgKGlu dG8gdGhlIGJ1ZmZlciBleHBvcnRlZCBmcm9tCj4+Pj4gICAgIERSTS9LTVMgZHJpdmVyIG9mIGEg cGh5c2ljYWwgZGlzcGxheSBkZXZpY2UpCj4+Pj4gICAtIGEgZHVtYiBidWZmZXIgYWxsb2NhdGVk IGJ5IHRoZSBmcm9udGVuZCBjYW4gYmUgaW1wb3J0ZWQKPj4+PiAgICAgaW50byBwaHlzaWNhbCBk ZXZpY2UgRFJNL0tNUyBkcml2ZXIsIHRodXMgYWxsb3dpbmcgdG8KPj4+PiAgICAgYWNoaWV2ZSBu byBjb3B5aW5nIGFzIHdlbGwKPj4+Pgo+Pj4+IEZvciB0aGF0IHJlYXNvbiBudW1iZXIgb2YgSU9D VExzIGFyZSBpbnRyb2R1Y2VkOgo+Pj4+ICAgLSAgRFJNX1hFTl9aQ09QWV9EVU1CX0ZST01fUkVG Uwo+Pj4+ICAgICAgVGhpcyB3aWxsIGNyZWF0ZSBhIERSTSBkdW1iIGJ1ZmZlciBmcm9tIGdyYW50 IHJlZmVyZW5jZXMgcHJvdmlkZWQKPj4+PiAgICAgIGJ5IHRoZSBmcm9udGVuZAo+Pj4+ICAgLSBE Uk1fWEVOX1pDT1BZX0RVTUJfVE9fUkVGUwo+Pj4+ICAgICBUaGlzIHdpbGwgZ3JhbnQgcmVmZXJl bmNlcyB0byBhIGR1bWIvZGlzcGxheSBidWZmZXIncyBtZW1vcnkgcHJvdmlkZWQKPj4+PiAgICAg YnkgdGhlIGJhY2tlbmQKPj4+PiAgIC0gRFJNX1hFTl9aQ09QWV9EVU1CX1dBSVRfRlJFRQo+Pj4+ ICAgICBUaGlzIHdpbGwgYmxvY2sgdW50aWwgdGhlIGR1bWIgYnVmZmVyIHdpdGggdGhlIHdhaXQg aGFuZGxlIHByb3ZpZGVkCj4+Pj4gICAgIGJlIGZyZWVkCj4+Pj4KPj4+PiBXaXRoIHRoaXMgaGVs cGVyIGRyaXZlciBJIHdhcyBhYmxlIHRvIGRyb3AgQ1BVIHVzYWdlIGZyb20gMTclIHRvIDMlCj4+ Pj4gb24gUmVuZXNhcyBSLUNhciBNMyBib2FyZC4KPj4+Pgo+Pj4+IFRoaXMgd2FzIHRlc3RlZCB3 aXRoIFJlbmVzYXMnIFdheWxhbmQtS01TIGFuZCBiYWNrZW5kIHJ1bm5pbmcgYXMgRFJNIG1hc3Rl ci4KPj4+Pgo+Pj4+IFRoYW5rIHlvdSwKPj4+PiBPbGVrc2FuZHIKPj4+Pgo+Pj4+IE9sZWtzYW5k ciBBbmRydXNoY2hlbmtvICgxKToKPj4+PiAgICBkcm0veGVuLXpjb3B5OiBBZGQgWGVuIHplcm8t Y29weSBoZWxwZXIgRFJNIGRyaXZlcgo+Pj4+Cj4+Pj4gICBEb2N1bWVudGF0aW9uL2dwdS9kcml2 ZXJzLnJzdCAgICAgICAgICAgICAgIHwgICAxICsKPj4+PiAgIERvY3VtZW50YXRpb24vZ3B1L3hl bi16Y29weS5yc3QgICAgICAgICAgICAgfCAgMzIgKwo+Pj4+ICAgZHJpdmVycy9ncHUvZHJtL3hl bi9LY29uZmlnICAgICAgICAgICAgICAgICB8ICAyNSArCj4+Pj4gICBkcml2ZXJzL2dwdS9kcm0v eGVuL01ha2VmaWxlICAgICAgICAgICAgICAgIHwgICA1ICsKPj4+PiAgIGRyaXZlcnMvZ3B1L2Ry bS94ZW4veGVuX2RybV96Y29weS5jICAgICAgICAgfCA4ODAgKysrKysrKysrKysrKysrKysrKysr KysrKysrKwo+Pj4+ICAgZHJpdmVycy9ncHUvZHJtL3hlbi94ZW5fZHJtX3pjb3B5X2JhbGxvb24u YyB8IDE1NCArKysrKwo+Pj4+ICAgZHJpdmVycy9ncHUvZHJtL3hlbi94ZW5fZHJtX3pjb3B5X2Jh bGxvb24uaCB8ICAzOCArKwo+Pj4+ICAgaW5jbHVkZS91YXBpL2RybS94ZW5femNvcHlfZHJtLmgg ICAgICAgICAgICB8IDEyOSArKysrCj4+Pj4gICA4IGZpbGVzIGNoYW5nZWQsIDEyNjQgaW5zZXJ0 aW9ucygrKQo+Pj4+ICAgY3JlYXRlIG1vZGUgMTAwNjQ0IERvY3VtZW50YXRpb24vZ3B1L3hlbi16 Y29weS5yc3QKPj4+PiAgIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0veGVuL3hl bl9kcm1femNvcHkuYwo+Pj4+ICAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS94 ZW4veGVuX2RybV96Y29weV9iYWxsb29uLmMKPj4+PiAgIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2 ZXJzL2dwdS9kcm0veGVuL3hlbl9kcm1femNvcHlfYmFsbG9vbi5oCj4+Pj4gICBjcmVhdGUgbW9k ZSAxMDA2NDQgaW5jbHVkZS91YXBpL2RybS94ZW5femNvcHlfZHJtLmgKPj4+Pgo+Pj4gWzFdCj4+ PiBodHRwczovL2xpc3RzLnhlbnByb2plY3Qub3JnL2FyY2hpdmVzL2h0bWwveGVuLWRldmVsLzIw MTgtMDIvbXNnMDEyMDIuaHRtbAo+PiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fXwo+PiBkcmktZGV2ZWwgbWFpbGluZyBsaXN0Cj4+IGRyaS1kZXZlbEBsaXN0 cy5mcmVlZGVza3RvcC5vcmcKPj4gaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1h bi9saXN0aW5mby9kcmktZGV2ZWwKWzFdIApodHRwczovL2VsaXhpci5ib290bGluLmNvbS9saW51 eC92NC4xNy1yYzEvc291cmNlL2luY2x1ZGUvdWFwaS94ZW4vZ250ZGV2LmgKWzJdIGh0dHBzOi8v ZWxpeGlyLmJvb3RsaW4uY29tL2xpbnV4L3Y0LjE3LXJjMS9zb3VyY2UvZHJpdmVycy94ZW4vZ250 ZGV2LmMKWzNdIGh0dHBzOi8vZWxpeGlyLmJvb3RsaW4uY29tL2xpbnV4L3Y0LjE3LXJjMS9zb3Vy Y2UvZHJpdmVycy94ZW4vYmFsbG9vbi5jCls0XSBodHRwczovL2xrbWwub3JnL2xrbWwvMjAxOC80 LzE2LzM1NQpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpk cmktZGV2ZWwgbWFpbGluZyBsaXN0CmRyaS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0 cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWwK