From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S966554AbeEYPdq (ORCPT ); Fri, 25 May 2018 11:33:46 -0400 Received: from mail-wr0-f196.google.com ([209.85.128.196]:46427 "EHLO mail-wr0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S964823AbeEYPdo (ORCPT ); Fri, 25 May 2018 11:33:44 -0400 X-Google-Smtp-Source: ADUXVKIJrRg+lhTCkd1wPZJSm+AsD0UgAPEUaZn3QZa4CiiRewjnbgnGOOPEL11O8eoU5oqxb21LMA== From: Oleksandr Andrushchenko To: xen-devel@lists.xenproject.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-media@vger.kernel.org, jgross@suse.com, boris.ostrovsky@oracle.com, konrad.wilk@oracle.com Cc: daniel.vetter@intel.com, andr2000@gmail.com, dongwon.kim@intel.com, matthew.d.roper@intel.com, Oleksandr Andrushchenko Subject: [PATCH 0/8] xen: dma-buf support for grant device Date: Fri, 25 May 2018 18:33:23 +0300 Message-Id: <20180525153331.31188-1-andr2000@gmail.com> X-Mailer: git-send-email 2.17.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Oleksandr Andrushchenko This work is in response to my previous attempt to introduce Xen/DRM zero-copy driver [1] to enable Linux dma-buf API [2] for Xen based frontends/backends. There is also an existing hyper_dmabuf approach available [3] which, if reworked to utilize the proposed solution, can greatly benefit as well. RFC for this series was published and discussed [9], comments addressed. The original rationale behind this work was to enable zero-copying use-cases while working with Xen para-virtual display driver [4]: 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 second it may result in unneeded huge data bus occupation and performance loss. The helper driver [4] 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 (implemented on top of Linux dma-buf) 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 Finally, it was discussed and decided ([1], [5]) that it is worth implementing such use-cases via extension of the existing Xen gntdev driver instead of introducing new DRM specific driver. Please note, that the support of dma-buf is Linux only, as dma-buf is a Linux only thing. Now to the proposed solution. The changes to the existing Xen drivers in the Linux kernel fall into 2 categories: 1. DMA-able memory buffer allocation and increasing/decreasing memory reservation of the pages of such a buffer. This is required if we are about to share dma-buf with the hardware that does require those to be allocated with dma_alloc_xxx API. (It is still possible to allocate a dma-buf from any system memory, e.g. system pages). 2. Extension of the gntdev driver to enable it to import/export dma-buf’s. The first four patches are in preparation for Xen dma-buf support, but I consider those usable regardless of the dma-buf use-case, e.g. other frontend/backend kernel modules may also benefit from these for better code reuse: 0001-xen-grant-table-Make-set-clear-page-private-code-sha.patch 0002-xen-balloon-Move-common-memory-reservation-routines-.patch 0003-xen-grant-table-Allow-allocating-buffers-suitable-fo.patch 0004-xen-gntdev-Allow-mappings-for-DMA-buffers.patch The next three patches are Xen implementation of dma-buf as part of the grant device: 0005-xen-gntdev-Add-initial-support-for-dma-buf-UAPI.patch 0006-xen-gntdev-Implement-dma-buf-export-functionality.patch 0007-xen-gntdev-Implement-dma-buf-import-functionality.patch The last patch makes it possible for in-kernel use of Xen dma-buf API: 0008-xen-gntdev-Expose-gntdev-s-dma-buf-API-for-in-kernel.patch The corresponding libxengnttab changes are available at [6]. All the above was tested with display backend [7] and its accompanying helper library [8] on Renesas ARM64 based board. *To all the communities*: I would like to ask you to review the proposed solution and give feedback on it, so I can improve and send final patches for review (this is still work in progress, but enough to start discussing the implementation). Thank you in advance, Oleksandr Andrushchenko [1] https://lists.freedesktop.org/archives/dri-devel/2018-April/173163.html [2] https://elixir.bootlin.com/linux/v4.17-rc5/source/Documentation/driver-api/dma-buf.rst [3] https://lists.xenproject.org/archives/html/xen-devel/2018-02/msg01202.html [4] https://cgit.freedesktop.org/drm/drm-misc/tree/drivers/gpu/drm/xen [5] https://patchwork.kernel.org/patch/10279681/ [6] https://github.com/andr2000/xen/tree/xen_dma_buf_v1 [7] https://github.com/andr2000/displ_be/tree/xen_dma_buf_v1 [8] https://github.com/andr2000/libxenbe/tree/xen_dma_buf_v1 [9] https://lkml.org/lkml/2018/5/17/215 Oleksandr Andrushchenko (8): xen/grant-table: Make set/clear page private code shared xen/balloon: Move common memory reservation routines to a module xen/grant-table: Allow allocating buffers suitable for DMA xen/gntdev: Allow mappings for DMA buffers xen/gntdev: Add initial support for dma-buf UAPI xen/gntdev: Implement dma-buf export functionality xen/gntdev: Implement dma-buf import functionality xen/gntdev: Expose gntdev's dma-buf API for in-kernel use drivers/xen/Kconfig | 23 + drivers/xen/Makefile | 1 + drivers/xen/balloon.c | 71 +-- drivers/xen/gntdev.c | 1025 ++++++++++++++++++++++++++++++++- drivers/xen/grant-table.c | 176 +++++- drivers/xen/mem-reservation.c | 134 +++++ include/uapi/xen/gntdev.h | 106 ++++ include/xen/grant_dev.h | 37 ++ include/xen/grant_table.h | 28 + include/xen/mem_reservation.h | 29 + 10 files changed, 1527 insertions(+), 103 deletions(-) create mode 100644 drivers/xen/mem-reservation.c create mode 100644 include/xen/grant_dev.h create mode 100644 include/xen/mem_reservation.h -- 2.17.0 From mboxrd@z Thu Jan 1 00:00:00 1970 From: Oleksandr Andrushchenko Subject: [PATCH 0/8] xen: dma-buf support for grant device Date: Fri, 25 May 2018 18:33:23 +0300 Message-ID: <20180525153331.31188-1-andr2000@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-wr0-x241.google.com (mail-wr0-x241.google.com [IPv6:2a00:1450:400c:c0c::241]) by gabe.freedesktop.org (Postfix) with ESMTPS id 04F006E945 for ; Fri, 25 May 2018 15:33:44 +0000 (UTC) Received: by mail-wr0-x241.google.com with SMTP id k5-v6so9945216wrn.3 for ; Fri, 25 May 2018 08:33:43 -0700 (PDT) List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: xen-devel@lists.xenproject.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-media@vger.kernel.org, jgross@suse.com, boris.ostrovsky@oracle.com, konrad.wilk@oracle.com Cc: andr2000@gmail.com, daniel.vetter@intel.com, dongwon.kim@intel.com, Oleksandr Andrushchenko List-Id: dri-devel@lists.freedesktop.org RnJvbTogT2xla3NhbmRyIEFuZHJ1c2hjaGVua28gPG9sZWtzYW5kcl9hbmRydXNoY2hlbmtvQGVw YW0uY29tPgoKVGhpcyB3b3JrIGlzIGluIHJlc3BvbnNlIHRvIG15IHByZXZpb3VzIGF0dGVtcHQg dG8gaW50cm9kdWNlIFhlbi9EUk0KemVyby1jb3B5IGRyaXZlciBbMV0gdG8gZW5hYmxlIExpbnV4 IGRtYS1idWYgQVBJIFsyXSBmb3IgWGVuIGJhc2VkCmZyb250ZW5kcy9iYWNrZW5kcy4gVGhlcmUg aXMgYWxzbyBhbiBleGlzdGluZyBoeXBlcl9kbWFidWYgYXBwcm9hY2gKYXZhaWxhYmxlIFszXSB3 aGljaCwgaWYgcmV3b3JrZWQgdG8gdXRpbGl6ZSB0aGUgcHJvcG9zZWQgc29sdXRpb24sCmNhbiBn cmVhdGx5IGJlbmVmaXQgYXMgd2VsbC4KClJGQyBmb3IgdGhpcyBzZXJpZXMgd2FzIHB1Ymxpc2hl ZCBhbmQgZGlzY3Vzc2VkIFs5XSwgY29tbWVudHMgYWRkcmVzc2VkLgoKVGhlIG9yaWdpbmFsIHJh dGlvbmFsZSBiZWhpbmQgdGhpcyB3b3JrIHdhcyB0byBlbmFibGUgemVyby1jb3B5aW5nCnVzZS1j YXNlcyB3aGlsZSB3b3JraW5nIHdpdGggWGVuIHBhcmEtdmlydHVhbCBkaXNwbGF5IGRyaXZlciBb NF06CndoZW4gdXNpbmcgWGVuIFBWIERSTSBmcm9udGVuZCBkcml2ZXIgdGhlbiBvbiBiYWNrZW5k IHNpZGUgb25lIHdpbGwKbmVlZCB0byBkbyBjb3B5aW5nIG9mIGRpc3BsYXkgYnVmZmVycycgY29u dGVudHMgKGZpbGxlZCBieSB0aGUKZnJvbnRlbmQncyB1c2VyLXNwYWNlKSBpbnRvIGJ1ZmZlcnMg YWxsb2NhdGVkIGF0IHRoZSBiYWNrZW5kIHNpZGUuClRha2luZyBpbnRvIGFjY291bnQgdGhlIHNp emUgb2YgZGlzcGxheSBidWZmZXJzIGFuZCBmcmFtZXMgcGVyCnNlY29uZCBpdCBtYXkgcmVzdWx0 IGluIHVubmVlZGVkIGh1Z2UgZGF0YSBidXMgb2NjdXBhdGlvbiBhbmQKcGVyZm9ybWFuY2UgbG9z cy4KClRoZSBoZWxwZXIgZHJpdmVyIFs0XSBhbGxvd3MgaW1wbGVtZW50aW5nIHplcm8tY29weWlu ZyB1c2UtY2FzZXMKd2hlbiB1c2luZyBYZW4gcGFyYS12aXJ0dWFsaXplZCBmcm9udGVuZCBkaXNw bGF5IGRyaXZlciBieSBpbXBsZW1lbnRpbmcKYSBEUk0vS01TIGhlbHBlciBkcml2ZXIgcnVubmlu ZyBvbiBiYWNrZW5kJ3Mgc2lkZS4KSXQgdXRpbGl6ZXMgUFJJTUUgYnVmZmVycyBBUEkgKGltcGxl bWVudGVkIG9uIHRvcCBvZiBMaW51eCBkbWEtYnVmKQp0byBzaGFyZSBmcm9udGVuZCdzIGJ1ZmZl cnMgd2l0aCBwaHlzaWNhbCBkZXZpY2UgZHJpdmVycyBvbgpiYWNrZW5kJ3Mgc2lkZToKCiAtIGEg ZHVtYiBidWZmZXIgY3JlYXRlZCBvbiBiYWNrZW5kJ3Mgc2lkZSBjYW4gYmUgc2hhcmVkCiAgIHdp dGggdGhlIFhlbiBQViBmcm9udGVuZCBkcml2ZXIsIHNvIGl0IGRpcmVjdGx5IHdyaXRlcwogICBp bnRvIGJhY2tlbmQncyBkb21haW4gbWVtb3J5IChpbnRvIHRoZSBidWZmZXIgZXhwb3J0ZWQgZnJv bQogICBEUk0vS01TIGRyaXZlciBvZiBhIHBoeXNpY2FsIGRpc3BsYXkgZGV2aWNlKQogLSBhIGR1 bWIgYnVmZmVyIGFsbG9jYXRlZCBieSB0aGUgZnJvbnRlbmQgY2FuIGJlIGltcG9ydGVkCiAgIGlu dG8gcGh5c2ljYWwgZGV2aWNlIERSTS9LTVMgZHJpdmVyLCB0aHVzIGFsbG93aW5nIHRvCiAgIGFj aGlldmUgbm8gY29weWluZyBhcyB3ZWxsCgpGaW5hbGx5LCBpdCB3YXMgZGlzY3Vzc2VkIGFuZCBk ZWNpZGVkIChbMV0sIFs1XSkgdGhhdCBpdCBpcyB3b3J0aAppbXBsZW1lbnRpbmcgc3VjaCB1c2Ut Y2FzZXMgdmlhIGV4dGVuc2lvbiBvZiB0aGUgZXhpc3RpbmcgWGVuIGdudGRldgpkcml2ZXIgaW5z dGVhZCBvZiBpbnRyb2R1Y2luZyBuZXcgRFJNIHNwZWNpZmljIGRyaXZlci4KUGxlYXNlIG5vdGUs IHRoYXQgdGhlIHN1cHBvcnQgb2YgZG1hLWJ1ZiBpcyBMaW51eCBvbmx5LAphcyBkbWEtYnVmIGlz IGEgTGludXggb25seSB0aGluZy4KCk5vdyB0byB0aGUgcHJvcG9zZWQgc29sdXRpb24uIFRoZSBj aGFuZ2VzICB0byB0aGUgZXhpc3RpbmcgWGVuIGRyaXZlcnMKaW4gdGhlIExpbnV4IGtlcm5lbCBm YWxsIGludG8gMiBjYXRlZ29yaWVzOgoxLiBETUEtYWJsZSBtZW1vcnkgYnVmZmVyIGFsbG9jYXRp b24gYW5kIGluY3JlYXNpbmcvZGVjcmVhc2luZyBtZW1vcnkKICAgcmVzZXJ2YXRpb24gb2YgdGhl IHBhZ2VzIG9mIHN1Y2ggYSBidWZmZXIuCiAgIFRoaXMgaXMgcmVxdWlyZWQgaWYgd2UgYXJlIGFi b3V0IHRvIHNoYXJlIGRtYS1idWYgd2l0aCB0aGUgaGFyZHdhcmUKICAgdGhhdCBkb2VzIHJlcXVp cmUgdGhvc2UgdG8gYmUgYWxsb2NhdGVkIHdpdGggZG1hX2FsbG9jX3h4eCBBUEkuCiAgIChJdCBp cyBzdGlsbCBwb3NzaWJsZSB0byBhbGxvY2F0ZSBhIGRtYS1idWYgZnJvbSBhbnkgc3lzdGVtIG1l bW9yeSwKICAgZS5nLiBzeXN0ZW0gcGFnZXMpLgoyLiBFeHRlbnNpb24gb2YgdGhlIGdudGRldiBk cml2ZXIgdG8gZW5hYmxlIGl0IHRvIGltcG9ydC9leHBvcnQgZG1hLWJ1ZuKAmXMuCgpUaGUgZmly c3QgZm91ciBwYXRjaGVzIGFyZSBpbiBwcmVwYXJhdGlvbiBmb3IgWGVuIGRtYS1idWYgc3VwcG9y dCwKYnV0IEkgY29uc2lkZXIgdGhvc2UgdXNhYmxlIHJlZ2FyZGxlc3Mgb2YgdGhlIGRtYS1idWYg dXNlLWNhc2UsCmUuZy4gb3RoZXIgZnJvbnRlbmQvYmFja2VuZCBrZXJuZWwgbW9kdWxlcyBtYXkg YWxzbyBiZW5lZml0IGZyb20gdGhlc2UKZm9yIGJldHRlciBjb2RlIHJldXNlOgogICAwMDAxLXhl bi1ncmFudC10YWJsZS1NYWtlLXNldC1jbGVhci1wYWdlLXByaXZhdGUtY29kZS1zaGEucGF0Y2gK ICAgMDAwMi14ZW4tYmFsbG9vbi1Nb3ZlLWNvbW1vbi1tZW1vcnktcmVzZXJ2YXRpb24tcm91dGlu ZXMtLnBhdGNoCiAgIDAwMDMteGVuLWdyYW50LXRhYmxlLUFsbG93LWFsbG9jYXRpbmctYnVmZmVy cy1zdWl0YWJsZS1mby5wYXRjaAogICAwMDA0LXhlbi1nbnRkZXYtQWxsb3ctbWFwcGluZ3MtZm9y LURNQS1idWZmZXJzLnBhdGNoCgpUaGUgbmV4dCB0aHJlZSBwYXRjaGVzIGFyZSBYZW4gaW1wbGVt ZW50YXRpb24gb2YgZG1hLWJ1ZiBhcyBwYXJ0IG9mCnRoZSBncmFudCBkZXZpY2U6CiAgIDAwMDUt eGVuLWdudGRldi1BZGQtaW5pdGlhbC1zdXBwb3J0LWZvci1kbWEtYnVmLVVBUEkucGF0Y2gKICAg MDAwNi14ZW4tZ250ZGV2LUltcGxlbWVudC1kbWEtYnVmLWV4cG9ydC1mdW5jdGlvbmFsaXR5LnBh dGNoCiAgIDAwMDcteGVuLWdudGRldi1JbXBsZW1lbnQtZG1hLWJ1Zi1pbXBvcnQtZnVuY3Rpb25h bGl0eS5wYXRjaAoKVGhlIGxhc3QgcGF0Y2ggbWFrZXMgaXQgcG9zc2libGUgZm9yIGluLWtlcm5l bCB1c2Ugb2YgWGVuIGRtYS1idWYgQVBJOgogIDAwMDgteGVuLWdudGRldi1FeHBvc2UtZ250ZGV2 LXMtZG1hLWJ1Zi1BUEktZm9yLWluLWtlcm5lbC5wYXRjaAoKVGhlIGNvcnJlc3BvbmRpbmcgbGli eGVuZ250dGFiIGNoYW5nZXMgYXJlIGF2YWlsYWJsZSBhdCBbNl0uCgpBbGwgdGhlIGFib3ZlIHdh cyB0ZXN0ZWQgd2l0aCBkaXNwbGF5IGJhY2tlbmQgWzddIGFuZCBpdHMgYWNjb21wYW55aW5nCmhl bHBlciBsaWJyYXJ5IFs4XSBvbiBSZW5lc2FzIEFSTTY0IGJhc2VkIGJvYXJkLgoKKlRvIGFsbCB0 aGUgY29tbXVuaXRpZXMqOiBJIHdvdWxkIGxpa2UgdG8gYXNrIHlvdSB0byByZXZpZXcgdGhlIHBy b3Bvc2VkCnNvbHV0aW9uIGFuZCBnaXZlIGZlZWRiYWNrIG9uIGl0LCBzbyBJIGNhbiBpbXByb3Zl IGFuZCBzZW5kIGZpbmFsCnBhdGNoZXMgZm9yIHJldmlldyAodGhpcyBpcyBzdGlsbCB3b3JrIGlu IHByb2dyZXNzLCBidXQgZW5vdWdoIHRvIHN0YXJ0CmRpc2N1c3NpbmcgdGhlIGltcGxlbWVudGF0 aW9uKS4KCgpUaGFuayB5b3UgaW4gYWR2YW5jZSwKT2xla3NhbmRyIEFuZHJ1c2hjaGVua28KClsx XSBodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9hcmNoaXZlcy9kcmktZGV2ZWwvMjAxOC1B cHJpbC8xNzMxNjMuaHRtbApbMl0gaHR0cHM6Ly9lbGl4aXIuYm9vdGxpbi5jb20vbGludXgvdjQu MTctcmM1L3NvdXJjZS9Eb2N1bWVudGF0aW9uL2RyaXZlci1hcGkvZG1hLWJ1Zi5yc3QKWzNdIGh0 dHBzOi8vbGlzdHMueGVucHJvamVjdC5vcmcvYXJjaGl2ZXMvaHRtbC94ZW4tZGV2ZWwvMjAxOC0w Mi9tc2cwMTIwMi5odG1sCls0XSBodHRwczovL2NnaXQuZnJlZWRlc2t0b3Aub3JnL2RybS9kcm0t bWlzYy90cmVlL2RyaXZlcnMvZ3B1L2RybS94ZW4KWzVdIGh0dHBzOi8vcGF0Y2h3b3JrLmtlcm5l bC5vcmcvcGF0Y2gvMTAyNzk2ODEvCls2XSBodHRwczovL2dpdGh1Yi5jb20vYW5kcjIwMDAveGVu L3RyZWUveGVuX2RtYV9idWZfdjEKWzddIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmRyMjAwMC9kaXNw bF9iZS90cmVlL3hlbl9kbWFfYnVmX3YxCls4XSBodHRwczovL2dpdGh1Yi5jb20vYW5kcjIwMDAv bGlieGVuYmUvdHJlZS94ZW5fZG1hX2J1Zl92MQpbOV0gaHR0cHM6Ly9sa21sLm9yZy9sa21sLzIw MTgvNS8xNy8yMTUKCk9sZWtzYW5kciBBbmRydXNoY2hlbmtvICg4KToKICB4ZW4vZ3JhbnQtdGFi bGU6IE1ha2Ugc2V0L2NsZWFyIHBhZ2UgcHJpdmF0ZSBjb2RlIHNoYXJlZAogIHhlbi9iYWxsb29u OiBNb3ZlIGNvbW1vbiBtZW1vcnkgcmVzZXJ2YXRpb24gcm91dGluZXMgdG8gYSBtb2R1bGUKICB4 ZW4vZ3JhbnQtdGFibGU6IEFsbG93IGFsbG9jYXRpbmcgYnVmZmVycyBzdWl0YWJsZSBmb3IgRE1B CiAgeGVuL2dudGRldjogQWxsb3cgbWFwcGluZ3MgZm9yIERNQSBidWZmZXJzCiAgeGVuL2dudGRl djogQWRkIGluaXRpYWwgc3VwcG9ydCBmb3IgZG1hLWJ1ZiBVQVBJCiAgeGVuL2dudGRldjogSW1w bGVtZW50IGRtYS1idWYgZXhwb3J0IGZ1bmN0aW9uYWxpdHkKICB4ZW4vZ250ZGV2OiBJbXBsZW1l bnQgZG1hLWJ1ZiBpbXBvcnQgZnVuY3Rpb25hbGl0eQogIHhlbi9nbnRkZXY6IEV4cG9zZSBnbnRk ZXYncyBkbWEtYnVmIEFQSSBmb3IgaW4ta2VybmVsIHVzZQoKIGRyaXZlcnMveGVuL0tjb25maWcg ICAgICAgICAgIHwgICAyMyArCiBkcml2ZXJzL3hlbi9NYWtlZmlsZSAgICAgICAgICB8ICAgIDEg KwogZHJpdmVycy94ZW4vYmFsbG9vbi5jICAgICAgICAgfCAgIDcxICstLQogZHJpdmVycy94ZW4v Z250ZGV2LmMgICAgICAgICAgfCAxMDI1ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr LQogZHJpdmVycy94ZW4vZ3JhbnQtdGFibGUuYyAgICAgfCAgMTc2ICsrKysrLQogZHJpdmVycy94 ZW4vbWVtLXJlc2VydmF0aW9uLmMgfCAgMTM0ICsrKysrCiBpbmNsdWRlL3VhcGkveGVuL2dudGRl di5oICAgICB8ICAxMDYgKysrKwogaW5jbHVkZS94ZW4vZ3JhbnRfZGV2LmggICAgICAgfCAgIDM3 ICsrCiBpbmNsdWRlL3hlbi9ncmFudF90YWJsZS5oICAgICB8ICAgMjggKwogaW5jbHVkZS94ZW4v bWVtX3Jlc2VydmF0aW9uLmggfCAgIDI5ICsKIDEwIGZpbGVzIGNoYW5nZWQsIDE1MjcgaW5zZXJ0 aW9ucygrKSwgMTAzIGRlbGV0aW9ucygtKQogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMveGVu L21lbS1yZXNlcnZhdGlvbi5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgaW5jbHVkZS94ZW4vZ3JhbnRf ZGV2LmgKIGNyZWF0ZSBtb2RlIDEwMDY0NCBpbmNsdWRlL3hlbi9tZW1fcmVzZXJ2YXRpb24uaAoK LS0gCjIuMTcuMAoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3Jn Cmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVs Cg==