From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751445AbeEVS1s (ORCPT ); Tue, 22 May 2018 14:27:48 -0400 Received: from mail-wm0-f65.google.com ([74.125.82.65]:34972 "EHLO mail-wm0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751277AbeEVS1r (ORCPT ); Tue, 22 May 2018 14:27:47 -0400 X-Google-Smtp-Source: AB8JxZoHTcH06V4FGxHQO3v2/jdjX1MIYXWSPLb9s1qWp2uE1cAWtGeSeteJU/jjKV3TGNCUjdNc9A== Subject: Re: [Xen-devel] [RFC 1/3] xen/balloon: Allow allocating DMA buffers To: Boris Ostrovsky , "Oleksandr_Andrushchenko@epam.com" , xen-devel@lists.xenproject.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-media@vger.kernel.org, jgross@suse.com, konrad.wilk@oracle.com Cc: daniel.vetter@intel.com, matthew.d.roper@intel.com, dongwon.kim@intel.com References: <20180517082604.14828-1-andr2000@gmail.com> <20180517082604.14828-2-andr2000@gmail.com> <6a108876-19b7-49d0-3de2-9e10f984736c@oracle.com> <9541926e-001a-e41e-317c-dbff6d687761@gmail.com> <218e2bf7-490d-f89e-9866-27b7e3dbc835@oracle.com> <77c20852-b9b8-c35a-26b0-b0317e6aba09@gmail.com> <2a88de28-27ef-8fe4-ddc1-35eb9e698567@gmail.com> From: Oleksandr Andrushchenko Message-ID: <533ca735-333b-8403-85f7-d17794ea97ca@gmail.com> Date: Tue, 22 May 2018 21:27:42 +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: Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Content-Language: en-US Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 05/22/2018 09:02 PM, Boris Ostrovsky wrote: > On 05/22/2018 11:00 AM, Oleksandr Andrushchenko wrote: >> On 05/22/2018 05:33 PM, Boris Ostrovsky wrote: >>> On 05/22/2018 01:55 AM, Oleksandr Andrushchenko wrote: >>>> On 05/21/2018 11:36 PM, Boris Ostrovsky wrote: >>>>> On 05/21/2018 03:13 PM, Oleksandr Andrushchenko wrote: >>>>>> On 05/21/2018 09:53 PM, Boris Ostrovsky wrote: >>>>>>> On 05/21/2018 01:32 PM, Oleksandr Andrushchenko wrote: >>>>>>>> On 05/21/2018 07:35 PM, Boris Ostrovsky wrote: >>>>>>>>> On 05/21/2018 01:40 AM, Oleksandr Andrushchenko wrote: >>>>>>>>>> On 05/19/2018 01:04 AM, Boris Ostrovsky wrote: >>>>>>>>>>> On 05/17/2018 04:26 AM, Oleksandr Andrushchenko wrote: >>>>>>>>>>>> From: Oleksandr Andrushchenko >>>>>>>>>>>> >>>>>>>>>>> A commit message would be useful. >>>>>>>>>> Sure, v1 will have it >>>>>>>>>>>> Signed-off-by: Oleksandr Andrushchenko >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>>           for (i = 0; i < nr_pages; i++) { >>>>>>>>>>>> -        page = alloc_page(gfp); >>>>>>>>>>>> -        if (page == NULL) { >>>>>>>>>>>> -            nr_pages = i; >>>>>>>>>>>> -            state = BP_EAGAIN; >>>>>>>>>>>> -            break; >>>>>>>>>>>> +        if (ext_pages) { >>>>>>>>>>>> +            page = ext_pages[i]; >>>>>>>>>>>> +        } else { >>>>>>>>>>>> +            page = alloc_page(gfp); >>>>>>>>>>>> +            if (page == NULL) { >>>>>>>>>>>> +                nr_pages = i; >>>>>>>>>>>> +                state = BP_EAGAIN; >>>>>>>>>>>> +                break; >>>>>>>>>>>> +            } >>>>>>>>>>>>               } >>>>>>>>>>>>               scrub_page(page); >>>>>>>>>>>>               list_add(&page->lru, &pages); >>>>>>>>>>>> @@ -529,7 +565,7 @@ static enum bp_state >>>>>>>>>>>> decrease_reservation(unsigned long nr_pages, gfp_t gfp) >>>>>>>>>>>>           i = 0; >>>>>>>>>>>>           list_for_each_entry_safe(page, tmp, &pages, lru) { >>>>>>>>>>>>               /* XENMEM_decrease_reservation requires a GFN */ >>>>>>>>>>>> -        frame_list[i++] = xen_page_to_gfn(page); >>>>>>>>>>>> +        frames[i++] = xen_page_to_gfn(page); >>>>>>>>>>>>         #ifdef CONFIG_XEN_HAVE_PVMMU >>>>>>>>>>>>               /* >>>>>>>>>>>> @@ -552,18 +588,22 @@ static enum bp_state >>>>>>>>>>>> decrease_reservation(unsigned long nr_pages, gfp_t gfp) >>>>>>>>>>>>       #endif >>>>>>>>>>>>               list_del(&page->lru); >>>>>>>>>>>>       -        balloon_append(page); >>>>>>>>>>>> +        if (!ext_pages) >>>>>>>>>>>> +            balloon_append(page); >>>>>>>>>>> So what you are proposing is not really ballooning. You are just >>>>>>>>>>> piggybacking on existing interfaces, aren't you? >>>>>>>>>> Sort of. Basically I need to {increase|decrease}_reservation, not >>>>>>>>>> actually >>>>>>>>>> allocating ballooned pages. >>>>>>>>>> Do you think I can simply EXPORT_SYMBOL for >>>>>>>>>> {increase|decrease}_reservation? >>>>>>>>>> Any other suggestion? >>>>>>>>> I am actually wondering how much of that code you end up reusing. >>>>>>>>> You >>>>>>>>> pretty much create new code paths in both routines and common code >>>>>>>>> ends >>>>>>>>> up being essentially the hypercall. >>>>>>>> Well, I hoped that it would be easier to maintain if I modify >>>>>>>> existing >>>>>>>> code >>>>>>>> to support both use-cases, but I am also ok to create new >>>>>>>> routines if >>>>>>>> this >>>>>>>> seems to be reasonable - please let me know >>>>>>>>>      So the question is --- would it make >>>>>>>>> sense to do all of this separately from the balloon driver? >>>>>>>> This can be done, but which driver will host this code then? If we >>>>>>>> move from >>>>>>>> the balloon driver, then this could go to either gntdev or >>>>>>>> grant-table. >>>>>>>> What's your preference? >>>>>>> A separate module? >>>>>>> Is there any use for this feature outside of your zero-copy DRM >>>>>>> driver? >>>>>> Intel's hyper dma-buf (Dongwon/Matt CC'ed), V4L/GPU at least. >>>>>> >>>>>> At the time I tried to upstream zcopy driver it was discussed and >>>>>> decided that >>>>>> it would be better if I remove all DRM specific code and move it to >>>>>> Xen drivers. >>>>>> Thus, this RFC. >>>>>> >>>>>> But it can also be implemented as a dedicated Xen dma-buf driver >>>>>> which >>>>>> will have all the >>>>>> code from this RFC + a bit more (char/misc device handling at least). >>>>>> This will also require a dedicated user-space library, just like >>>>>> libxengnttab.so >>>>>> for gntdev (now I have all new IOCTLs covered there). >>>>>> >>>>>> If the idea of a dedicated Xen dma-buf driver seems to be more >>>>>> attractive we >>>>>> can work toward this solution. BTW, I do support this idea, but >>>>>> was not >>>>>> sure if Xen community accepts yet another driver which duplicates >>>>>> quite some code >>>>>> of the existing gntdev/balloon/grant-table. And now after this RFC I >>>>>> hope that all cons >>>>>> and pros of both dedicated driver and gntdev/balloon/grant-table >>>>>> extension are >>>>>> clearly seen and we can make a decision. >>>>> IIRC the objection for a separate module was in the context of gntdev >>>>> was discussion, because (among other things) people didn't want to >>>>> have >>>>> yet another file in /dev/xen/ >>>>> >>>>> Here we are talking about (a new) balloon-like module which doesn't >>>>> create any new user-visible interfaces. And as for duplicating code >>>>> --- >>>>> as I said, I am not convinced there is much of duplication. >>>>> >>>>> I might even argue that we should add a new config option for this >>>>> module. >>>> I am not quite sure I am fully following you here: so, you suggest >>>> that we have balloon.c unchanged, but instead create a new >>>> module (namely a file under the same folder as balloon.c, e.g. >>>> dma-buf-reservation.c) and move those {increase|decrease}_reservation >>>> routines (specific to dma-buf) to that new file? And make it selectable >>>> via Kconfig? If so, then how about the changes to grant-table and >>>> gntdev? >>>> Those will look inconsistent then. >>> Inconsistent with what? The changes to grant code will also be under the >>> new config option. >> Ah, ok. >> >> Option 1. We will have Kconfig option which will cover dma-buf >> changes in balloon, > I really don't think your changes to balloon driver belong there. The > have nothing to do with ballooning, > >> grant-table and gntdev. And for that we will >> create dedicated routines in balloon and grant-table (copy of >> the existing ones, but modified to fit dma-buf use-case) and >> those under something like "#if CONFIG_XEN_DMABUF"? >> This is relatively easy to do for balloon/grant-table, but not that >> easy for gntdev: there still seems to be lots of code which can be >> reused, >> so I'll have to put lots of "#if CONFIG_XEN_DMABUF" there. Even more, >> I change >> interfaces of the existing gntdev routines which won't look cute with >> #if's, IMO. >> >> Option 2. Try moving dma-buf related changes from balloon and >> grant-table to a new file. Then gntdev's Kconfig concerns from above >> will still >> be there, but balloon/grant-table functionality will be localized in a >> new module. > I don't see a problem with leaving your code (from patch 2) where it is > now, in grant table. It's a small change and it seems to me a single > #ifdef/#endif would cover it, even if you factor out common code there > as we've discussed. To my eye it logically belongs there. Just like your > gntdev changes belong to gntdev file. (Presumably, because I haven't > actually looked at them ;-)) > > So my suggestion is > - separate module for your changes in balloon.c Ok, so, basically, the changes I need from the balloon driver is {increase|decrease}_reservation and DMAable memory allocations, so I'll move that into a separate file: what could be the name for such a file? > - keep grant-table changes, with config option Can we consider moving ex-balloon code into grant-table? > - keep gntdev changes, with config option. I'll try to see what happens to gntdev with Kconfig option wrt function prototype changes. I also have to check if UAPI of gntdev can also support CONFIG_XXX ifdefs w/o problems - do you by chance know if #if CONFIG_ is ok for UAPI files? Or I can leave UAPI as is and ifdef in .ioctl callback. > (but when you get to post > actual patches I would appreciate if you could split this into a series > of logical changes and not post a one giant patch). Of course, as this is at RFC stage the idea was to roll out all the changes at once, so everyone has the full picture and don't need to collect changes from set of patches. > > -boris > Thank you, Oleksandr >> I am still missing your point here? >> >>>> If you suggest a new kernel driver module: >>>> IMO, there is nothing bad if we create a dedicated kernel module >>>> (driver) for Xen dma-buf handling selectable under Kconfig option. >>>> Yes, this will create a yet another device under /dev/xen, >>>> but most people will never see it if we set Kconfig to default to "n". >>>> And then we'll need user-space support for that, so Xen tools will >>>> be extended with libxendmabuf.so or so. >>>> This way all Xen dma-buf support can be localized at one place which >>>> might be easier to maintain. What is more it could be totally >>>> transparent >>>> to most of us as Kconfig option won't be set by default (both kernel >>>> and Xen). >>> The downside is that we will end up having another device for doing >>> things that are not that different from what we are already doing with >>> existing gnttab device. Or are they? >> Agree, but Kconfig option, IMO, won't make it look nice because >> of gntdev changes and code reuse. >>> -boris >> Thank you, >> Oleksandr >> >> _______________________________________________ >> Xen-devel mailing list >> Xen-devel@lists.xenproject.org >> https://lists.xenproject.org/mailman/listinfo/xen-devel From mboxrd@z Thu Jan 1 00:00:00 1970 From: Oleksandr Andrushchenko Subject: Re: [Xen-devel] [RFC 1/3] xen/balloon: Allow allocating DMA buffers Date: Tue, 22 May 2018 21:27:42 +0300 Message-ID: <533ca735-333b-8403-85f7-d17794ea97ca@gmail.com> References: <20180517082604.14828-1-andr2000@gmail.com> <20180517082604.14828-2-andr2000@gmail.com> <6a108876-19b7-49d0-3de2-9e10f984736c@oracle.com> <9541926e-001a-e41e-317c-dbff6d687761@gmail.com> <218e2bf7-490d-f89e-9866-27b7e3dbc835@oracle.com> <77c20852-b9b8-c35a-26b0-b0317e6aba09@gmail.com> <2a88de28-27ef-8fe4-ddc1-35eb9e698567@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: Received: from mail-wm0-x241.google.com (mail-wm0-x241.google.com [IPv6:2a00:1450:400c:c09::241]) by gabe.freedesktop.org (Postfix) with ESMTPS id EA62E6E17B for ; Tue, 22 May 2018 18:27:46 +0000 (UTC) Received: by mail-wm0-x241.google.com with SMTP id a8-v6so2235511wmg.5 for ; Tue, 22 May 2018 11:27:46 -0700 (PDT) In-Reply-To: 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: Boris Ostrovsky , "Oleksandr_Andrushchenko@epam.com" , xen-devel@lists.xenproject.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-media@vger.kernel.org, jgross@suse.com, konrad.wilk@oracle.com Cc: daniel.vetter@intel.com, dongwon.kim@intel.com List-Id: dri-devel@lists.freedesktop.org T24gMDUvMjIvMjAxOCAwOTowMiBQTSwgQm9yaXMgT3N0cm92c2t5IHdyb3RlOgo+IE9uIDA1LzIy LzIwMTggMTE6MDAgQU0sIE9sZWtzYW5kciBBbmRydXNoY2hlbmtvIHdyb3RlOgo+PiBPbiAwNS8y Mi8yMDE4IDA1OjMzIFBNLCBCb3JpcyBPc3Ryb3Zza3kgd3JvdGU6Cj4+PiBPbiAwNS8yMi8yMDE4 IDAxOjU1IEFNLCBPbGVrc2FuZHIgQW5kcnVzaGNoZW5rbyB3cm90ZToKPj4+PiBPbiAwNS8yMS8y MDE4IDExOjM2IFBNLCBCb3JpcyBPc3Ryb3Zza3kgd3JvdGU6Cj4+Pj4+IE9uIDA1LzIxLzIwMTgg MDM6MTMgUE0sIE9sZWtzYW5kciBBbmRydXNoY2hlbmtvIHdyb3RlOgo+Pj4+Pj4gT24gMDUvMjEv MjAxOCAwOTo1MyBQTSwgQm9yaXMgT3N0cm92c2t5IHdyb3RlOgo+Pj4+Pj4+IE9uIDA1LzIxLzIw MTggMDE6MzIgUE0sIE9sZWtzYW5kciBBbmRydXNoY2hlbmtvIHdyb3RlOgo+Pj4+Pj4+PiBPbiAw NS8yMS8yMDE4IDA3OjM1IFBNLCBCb3JpcyBPc3Ryb3Zza3kgd3JvdGU6Cj4+Pj4+Pj4+PiBPbiAw NS8yMS8yMDE4IDAxOjQwIEFNLCBPbGVrc2FuZHIgQW5kcnVzaGNoZW5rbyB3cm90ZToKPj4+Pj4+ Pj4+PiBPbiAwNS8xOS8yMDE4IDAxOjA0IEFNLCBCb3JpcyBPc3Ryb3Zza3kgd3JvdGU6Cj4+Pj4+ Pj4+Pj4+IE9uIDA1LzE3LzIwMTggMDQ6MjYgQU0sIE9sZWtzYW5kciBBbmRydXNoY2hlbmtvIHdy b3RlOgo+Pj4+Pj4+Pj4+Pj4gRnJvbTogT2xla3NhbmRyIEFuZHJ1c2hjaGVua28KPj4+Pj4+Pj4+ Pj4+IDxvbGVrc2FuZHJfYW5kcnVzaGNoZW5rb0BlcGFtLmNvbT4KPj4+Pj4+Pj4+Pj4gQSBjb21t aXQgbWVzc2FnZSB3b3VsZCBiZSB1c2VmdWwuCj4+Pj4+Pj4+Pj4gU3VyZSwgdjEgd2lsbCBoYXZl IGl0Cj4+Pj4+Pj4+Pj4+PiBTaWduZWQtb2ZmLWJ5OiBPbGVrc2FuZHIgQW5kcnVzaGNoZW5rbwo+ Pj4+Pj4+Pj4+Pj4gPG9sZWtzYW5kcl9hbmRydXNoY2hlbmtvQGVwYW0uY29tPgo+Pj4+Pj4+Pj4+ Pj4KPj4+Pj4+Pj4+Pj4+ICDCoMKgwqDCoMKgwqDCoMKgwqAgZm9yIChpID0gMDsgaSA8IG5yX3Bh Z2VzOyBpKyspIHsKPj4+Pj4+Pj4+Pj4+IC3CoMKgwqDCoMKgwqDCoCBwYWdlID0gYWxsb2NfcGFn ZShnZnApOwo+Pj4+Pj4+Pj4+Pj4gLcKgwqDCoMKgwqDCoMKgIGlmIChwYWdlID09IE5VTEwpIHsK Pj4+Pj4+Pj4+Pj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIG5yX3BhZ2VzID0gaTsKPj4+Pj4+ Pj4+Pj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHN0YXRlID0gQlBfRUFHQUlOOwo+Pj4+Pj4+ Pj4+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYnJlYWs7Cj4+Pj4+Pj4+Pj4+PiArwqDCoMKg wqDCoMKgwqAgaWYgKGV4dF9wYWdlcykgewo+Pj4+Pj4+Pj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqAgcGFnZSA9IGV4dF9wYWdlc1tpXTsKPj4+Pj4+Pj4+Pj4+ICvCoMKgwqDCoMKgwqDCoCB9 IGVsc2Ugewo+Pj4+Pj4+Pj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcGFnZSA9IGFsbG9j X3BhZ2UoZ2ZwKTsKPj4+Pj4+Pj4+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGlmIChwYWdl ID09IE5VTEwpIHsKPj4+Pj4+Pj4+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg bnJfcGFnZXMgPSBpOwo+Pj4+Pj4+Pj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCBzdGF0ZSA9IEJQX0VBR0FJTjsKPj4+Pj4+Pj4+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgYnJlYWs7Cj4+Pj4+Pj4+Pj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB9Cj4+ Pj4+Pj4+Pj4+PiAgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfQo+Pj4+Pj4+Pj4+Pj4gIMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHNjcnViX3BhZ2UocGFnZSk7Cj4+Pj4+Pj4+Pj4+PiAg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbGlzdF9hZGQoJnBhZ2UtPmxydSwgJnBhZ2VzKTsK Pj4+Pj4+Pj4+Pj4+IEBAIC01MjksNyArNTY1LDcgQEAgc3RhdGljIGVudW0gYnBfc3RhdGUKPj4+ Pj4+Pj4+Pj4+IGRlY3JlYXNlX3Jlc2VydmF0aW9uKHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsIGdm cF90IGdmcCkKPj4+Pj4+Pj4+Pj4+ICDCoMKgwqDCoMKgwqDCoMKgwqAgaSA9IDA7Cj4+Pj4+Pj4+ Pj4+PiAgwqDCoMKgwqDCoMKgwqDCoMKgIGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwYWdlLCB0 bXAsICZwYWdlcywgbHJ1KSB7Cj4+Pj4+Pj4+Pj4+PiAgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgLyogWEVOTUVNX2RlY3JlYXNlX3Jlc2VydmF0aW9uIHJlcXVpcmVzIGEgR0ZOICovCj4+Pj4+ Pj4+Pj4+PiAtwqDCoMKgwqDCoMKgwqAgZnJhbWVfbGlzdFtpKytdID0geGVuX3BhZ2VfdG9fZ2Zu KHBhZ2UpOwo+Pj4+Pj4+Pj4+Pj4gK8KgwqDCoMKgwqDCoMKgIGZyYW1lc1tpKytdID0geGVuX3Bh Z2VfdG9fZ2ZuKHBhZ2UpOwo+Pj4+Pj4+Pj4+Pj4gIMKgwqDCoMKgwqAgwqAgI2lmZGVmIENPTkZJ R19YRU5fSEFWRV9QVk1NVQo+Pj4+Pj4+Pj4+Pj4gIMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IC8qCj4+Pj4+Pj4+Pj4+PiBAQCAtNTUyLDE4ICs1ODgsMjIgQEAgc3RhdGljIGVudW0gYnBfc3Rh dGUKPj4+Pj4+Pj4+Pj4+IGRlY3JlYXNlX3Jlc2VydmF0aW9uKHVuc2lnbmVkIGxvbmcgbnJfcGFn ZXMsIGdmcF90IGdmcCkKPj4+Pj4+Pj4+Pj4+ICDCoMKgwqDCoMKgICNlbmRpZgo+Pj4+Pj4+Pj4+ Pj4gIMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGxpc3RfZGVsKCZwYWdlLT5scnUpOwo+Pj4+ Pj4+Pj4+Pj4gIMKgwqDCoMKgwqAgLcKgwqDCoMKgwqDCoMKgIGJhbGxvb25fYXBwZW5kKHBhZ2Up Owo+Pj4+Pj4+Pj4+Pj4gK8KgwqDCoMKgwqDCoMKgIGlmICghZXh0X3BhZ2VzKQo+Pj4+Pj4+Pj4+ Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYmFsbG9vbl9hcHBlbmQocGFnZSk7Cj4+Pj4+Pj4+ Pj4+IFNvIHdoYXQgeW91IGFyZSBwcm9wb3NpbmcgaXMgbm90IHJlYWxseSBiYWxsb29uaW5nLiBZ b3UgYXJlIGp1c3QKPj4+Pj4+Pj4+Pj4gcGlnZ3liYWNraW5nIG9uIGV4aXN0aW5nIGludGVyZmFj ZXMsIGFyZW4ndCB5b3U/Cj4+Pj4+Pj4+Pj4gU29ydCBvZi4gQmFzaWNhbGx5IEkgbmVlZCB0byB7 aW5jcmVhc2V8ZGVjcmVhc2V9X3Jlc2VydmF0aW9uLCBub3QKPj4+Pj4+Pj4+PiBhY3R1YWxseQo+ Pj4+Pj4+Pj4+IGFsbG9jYXRpbmcgYmFsbG9vbmVkIHBhZ2VzLgo+Pj4+Pj4+Pj4+IERvIHlvdSB0 aGluayBJIGNhbiBzaW1wbHkgRVhQT1JUX1NZTUJPTCBmb3IKPj4+Pj4+Pj4+PiB7aW5jcmVhc2V8 ZGVjcmVhc2V9X3Jlc2VydmF0aW9uPwo+Pj4+Pj4+Pj4+IEFueSBvdGhlciBzdWdnZXN0aW9uPwo+ Pj4+Pj4+Pj4gSSBhbSBhY3R1YWxseSB3b25kZXJpbmcgaG93IG11Y2ggb2YgdGhhdCBjb2RlIHlv dSBlbmQgdXAgcmV1c2luZy4KPj4+Pj4+Pj4+IFlvdQo+Pj4+Pj4+Pj4gcHJldHR5IG11Y2ggY3Jl YXRlIG5ldyBjb2RlIHBhdGhzIGluIGJvdGggcm91dGluZXMgYW5kIGNvbW1vbiBjb2RlCj4+Pj4+ Pj4+PiBlbmRzCj4+Pj4+Pj4+PiB1cCBiZWluZyBlc3NlbnRpYWxseSB0aGUgaHlwZXJjYWxsLgo+ Pj4+Pj4+PiBXZWxsLCBJIGhvcGVkIHRoYXQgaXQgd291bGQgYmUgZWFzaWVyIHRvIG1haW50YWlu IGlmIEkgbW9kaWZ5Cj4+Pj4+Pj4+IGV4aXN0aW5nCj4+Pj4+Pj4+IGNvZGUKPj4+Pj4+Pj4gdG8g c3VwcG9ydCBib3RoIHVzZS1jYXNlcywgYnV0IEkgYW0gYWxzbyBvayB0byBjcmVhdGUgbmV3Cj4+ Pj4+Pj4+IHJvdXRpbmVzIGlmCj4+Pj4+Pj4+IHRoaXMKPj4+Pj4+Pj4gc2VlbXMgdG8gYmUgcmVh c29uYWJsZSAtIHBsZWFzZSBsZXQgbWUga25vdwo+Pj4+Pj4+Pj4gIMKgwqDCoMKgIFNvIHRoZSBx dWVzdGlvbiBpcyAtLS0gd291bGQgaXQgbWFrZQo+Pj4+Pj4+Pj4gc2Vuc2UgdG8gZG8gYWxsIG9m IHRoaXMgc2VwYXJhdGVseSBmcm9tIHRoZSBiYWxsb29uIGRyaXZlcj8KPj4+Pj4+Pj4gVGhpcyBj YW4gYmUgZG9uZSwgYnV0IHdoaWNoIGRyaXZlciB3aWxsIGhvc3QgdGhpcyBjb2RlIHRoZW4/IElm IHdlCj4+Pj4+Pj4+IG1vdmUgZnJvbQo+Pj4+Pj4+PiB0aGUgYmFsbG9vbiBkcml2ZXIsIHRoZW4g dGhpcyBjb3VsZCBnbyB0byBlaXRoZXIgZ250ZGV2IG9yCj4+Pj4+Pj4+IGdyYW50LXRhYmxlLgo+ Pj4+Pj4+PiBXaGF0J3MgeW91ciBwcmVmZXJlbmNlPwo+Pj4+Pj4+IEEgc2VwYXJhdGUgbW9kdWxl Pwo+Pj4+Pj4+IElzIHRoZXJlIGFueSB1c2UgZm9yIHRoaXMgZmVhdHVyZSBvdXRzaWRlIG9mIHlv dXIgemVyby1jb3B5IERSTQo+Pj4+Pj4+IGRyaXZlcj8KPj4+Pj4+IEludGVsJ3MgaHlwZXIgZG1h LWJ1ZiAoRG9uZ3dvbi9NYXR0IENDJ2VkKSwgVjRML0dQVSBhdCBsZWFzdC4KPj4+Pj4+Cj4+Pj4+ PiBBdCB0aGUgdGltZSBJIHRyaWVkIHRvIHVwc3RyZWFtIHpjb3B5IGRyaXZlciBpdCB3YXMgZGlz Y3Vzc2VkIGFuZAo+Pj4+Pj4gZGVjaWRlZCB0aGF0Cj4+Pj4+PiBpdCB3b3VsZCBiZSBiZXR0ZXIg aWYgSSByZW1vdmUgYWxsIERSTSBzcGVjaWZpYyBjb2RlIGFuZCBtb3ZlIGl0IHRvCj4+Pj4+PiBY ZW4gZHJpdmVycy4KPj4+Pj4+IFRodXMsIHRoaXMgUkZDLgo+Pj4+Pj4KPj4+Pj4+IEJ1dCBpdCBj YW4gYWxzbyBiZSBpbXBsZW1lbnRlZCBhcyBhIGRlZGljYXRlZCBYZW4gZG1hLWJ1ZiBkcml2ZXIK Pj4+Pj4+IHdoaWNoCj4+Pj4+PiB3aWxsIGhhdmUgYWxsIHRoZQo+Pj4+Pj4gY29kZSBmcm9tIHRo aXMgUkZDICsgYSBiaXQgbW9yZSAoY2hhci9taXNjIGRldmljZSBoYW5kbGluZyBhdCBsZWFzdCku Cj4+Pj4+PiBUaGlzIHdpbGwgYWxzbyByZXF1aXJlIGEgZGVkaWNhdGVkIHVzZXItc3BhY2UgbGli cmFyeSwganVzdCBsaWtlCj4+Pj4+PiBsaWJ4ZW5nbnR0YWIuc28KPj4+Pj4+IGZvciBnbnRkZXYg KG5vdyBJIGhhdmUgYWxsIG5ldyBJT0NUTHMgY292ZXJlZCB0aGVyZSkuCj4+Pj4+Pgo+Pj4+Pj4g SWYgdGhlIGlkZWEgb2YgYSBkZWRpY2F0ZWQgWGVuIGRtYS1idWYgZHJpdmVyIHNlZW1zIHRvIGJl IG1vcmUKPj4+Pj4+IGF0dHJhY3RpdmUgd2UKPj4+Pj4+IGNhbiB3b3JrIHRvd2FyZCB0aGlzIHNv bHV0aW9uLiBCVFcsIEkgZG8gc3VwcG9ydCB0aGlzIGlkZWEsIGJ1dAo+Pj4+Pj4gd2FzIG5vdAo+ Pj4+Pj4gc3VyZSBpZiBYZW4gY29tbXVuaXR5IGFjY2VwdHMgeWV0IGFub3RoZXIgZHJpdmVyIHdo aWNoIGR1cGxpY2F0ZXMKPj4+Pj4+IHF1aXRlIHNvbWUgY29kZQo+Pj4+Pj4gb2YgdGhlIGV4aXN0 aW5nIGdudGRldi9iYWxsb29uL2dyYW50LXRhYmxlLiBBbmQgbm93IGFmdGVyIHRoaXMgUkZDIEkK Pj4+Pj4+IGhvcGUgdGhhdCBhbGwgY29ucwo+Pj4+Pj4gYW5kIHByb3Mgb2YgYm90aCBkZWRpY2F0 ZWQgZHJpdmVyIGFuZCBnbnRkZXYvYmFsbG9vbi9ncmFudC10YWJsZQo+Pj4+Pj4gZXh0ZW5zaW9u IGFyZQo+Pj4+Pj4gY2xlYXJseSBzZWVuIGFuZCB3ZSBjYW4gbWFrZSBhIGRlY2lzaW9uLgo+Pj4+ PiBJSVJDIHRoZSBvYmplY3Rpb24gZm9yIGEgc2VwYXJhdGUgbW9kdWxlIHdhcyBpbiB0aGUgY29u dGV4dCBvZiBnbnRkZXYKPj4+Pj4gd2FzIGRpc2N1c3Npb24sIGJlY2F1c2UgKGFtb25nIG90aGVy IHRoaW5ncykgcGVvcGxlIGRpZG4ndCB3YW50IHRvCj4+Pj4+IGhhdmUKPj4+Pj4geWV0IGFub3Ro ZXIgZmlsZSBpbiAvZGV2L3hlbi8KPj4+Pj4KPj4+Pj4gSGVyZSB3ZSBhcmUgdGFsa2luZyBhYm91 dCAoYSBuZXcpIGJhbGxvb24tbGlrZSBtb2R1bGUgd2hpY2ggZG9lc24ndAo+Pj4+PiBjcmVhdGUg YW55IG5ldyB1c2VyLXZpc2libGUgaW50ZXJmYWNlcy4gQW5kIGFzIGZvciBkdXBsaWNhdGluZyBj b2RlCj4+Pj4+IC0tLQo+Pj4+PiBhcyBJIHNhaWQsIEkgYW0gbm90IGNvbnZpbmNlZCB0aGVyZSBp cyBtdWNoIG9mIGR1cGxpY2F0aW9uLgo+Pj4+Pgo+Pj4+PiBJIG1pZ2h0IGV2ZW4gYXJndWUgdGhh dCB3ZSBzaG91bGQgYWRkIGEgbmV3IGNvbmZpZyBvcHRpb24gZm9yIHRoaXMKPj4+Pj4gbW9kdWxl Lgo+Pj4+IEkgYW0gbm90IHF1aXRlIHN1cmUgSSBhbSBmdWxseSBmb2xsb3dpbmcgeW91IGhlcmU6 IHNvLCB5b3Ugc3VnZ2VzdAo+Pj4+IHRoYXQgd2UgaGF2ZSBiYWxsb29uLmMgdW5jaGFuZ2VkLCBi dXQgaW5zdGVhZCBjcmVhdGUgYSBuZXcKPj4+PiBtb2R1bGUgKG5hbWVseSBhIGZpbGUgdW5kZXIg dGhlIHNhbWUgZm9sZGVyIGFzIGJhbGxvb24uYywgZS5nLgo+Pj4+IGRtYS1idWYtcmVzZXJ2YXRp b24uYykgYW5kIG1vdmUgdGhvc2Uge2luY3JlYXNlfGRlY3JlYXNlfV9yZXNlcnZhdGlvbgo+Pj4+ IHJvdXRpbmVzIChzcGVjaWZpYyB0byBkbWEtYnVmKSB0byB0aGF0IG5ldyBmaWxlPyBBbmQgbWFr ZSBpdCBzZWxlY3RhYmxlCj4+Pj4gdmlhIEtjb25maWc/IElmIHNvLCB0aGVuIGhvdyBhYm91dCB0 aGUgY2hhbmdlcyB0byBncmFudC10YWJsZSBhbmQKPj4+PiBnbnRkZXY/Cj4+Pj4gVGhvc2Ugd2ls bCBsb29rIGluY29uc2lzdGVudCB0aGVuLgo+Pj4gSW5jb25zaXN0ZW50IHdpdGggd2hhdD8gVGhl IGNoYW5nZXMgdG8gZ3JhbnQgY29kZSB3aWxsIGFsc28gYmUgdW5kZXIgdGhlCj4+PiBuZXcgY29u ZmlnIG9wdGlvbi4KPj4gQWgsIG9rLgo+Pgo+PiBPcHRpb24gMS4gV2Ugd2lsbCBoYXZlIEtjb25m aWcgb3B0aW9uIHdoaWNoIHdpbGwgY292ZXIgZG1hLWJ1Zgo+PiBjaGFuZ2VzIGluIGJhbGxvb24s Cj4gSSByZWFsbHkgZG9uJ3QgdGhpbmsgeW91ciBjaGFuZ2VzIHRvIGJhbGxvb24gZHJpdmVyIGJl bG9uZyB0aGVyZS4gVGhlCj4gaGF2ZSBub3RoaW5nIHRvIGRvIHdpdGggYmFsbG9vbmluZywKPgo+ PiBncmFudC10YWJsZSBhbmQgZ250ZGV2LiBBbmQgZm9yIHRoYXQgd2Ugd2lsbAo+PiBjcmVhdGUg ZGVkaWNhdGVkIHJvdXRpbmVzIGluIGJhbGxvb24gYW5kIGdyYW50LXRhYmxlIChjb3B5IG9mCj4+ IHRoZSBleGlzdGluZyBvbmVzLCBidXQgbW9kaWZpZWQgdG8gZml0IGRtYS1idWYgdXNlLWNhc2Up IGFuZAo+PiB0aG9zZSB1bmRlciBzb21ldGhpbmcgbGlrZSAiI2lmIENPTkZJR19YRU5fRE1BQlVG Ij8KPj4gVGhpcyBpcyByZWxhdGl2ZWx5IGVhc3kgdG8gZG8gZm9yIGJhbGxvb24vZ3JhbnQtdGFi bGUsIGJ1dCBub3QgdGhhdAo+PiBlYXN5IGZvciBnbnRkZXY6IHRoZXJlIHN0aWxsIHNlZW1zIHRv IGJlIGxvdHMgb2YgY29kZSB3aGljaCBjYW4gYmUKPj4gcmV1c2VkLAo+PiBzbyBJJ2xsIGhhdmUg dG8gcHV0IGxvdHMgb2YgIiNpZiBDT05GSUdfWEVOX0RNQUJVRiIgdGhlcmUuIEV2ZW4gbW9yZSwK Pj4gSSBjaGFuZ2UKPj4gaW50ZXJmYWNlcyBvZiB0aGUgZXhpc3RpbmcgZ250ZGV2IHJvdXRpbmVz IHdoaWNoIHdvbid0IGxvb2sgY3V0ZSB3aXRoCj4+ICNpZidzLCBJTU8uCj4+Cj4+IE9wdGlvbiAy LiBUcnkgbW92aW5nIGRtYS1idWYgcmVsYXRlZCBjaGFuZ2VzIGZyb20gYmFsbG9vbiBhbmQKPj4g Z3JhbnQtdGFibGUgdG8gYSBuZXcgZmlsZS4gVGhlbiBnbnRkZXYncyBLY29uZmlnIGNvbmNlcm5z IGZyb20gYWJvdmUKPj4gd2lsbCBzdGlsbAo+PiBiZSB0aGVyZSwgYnV0IGJhbGxvb24vZ3JhbnQt dGFibGUgZnVuY3Rpb25hbGl0eSB3aWxsIGJlIGxvY2FsaXplZCBpbiBhCj4+IG5ldyBtb2R1bGUu Cj4gSSBkb24ndCBzZWUgYSBwcm9ibGVtIHdpdGggbGVhdmluZyB5b3VyIGNvZGUgKGZyb20gcGF0 Y2ggMikgd2hlcmUgaXQgaXMKPiBub3csIGluIGdyYW50IHRhYmxlLiBJdCdzIGEgc21hbGwgY2hh bmdlIGFuZCBpdCBzZWVtcyB0byBtZSBhIHNpbmdsZQo+ICNpZmRlZi8jZW5kaWYgd291bGQgY292 ZXIgaXQsIGV2ZW4gaWYgeW91IGZhY3RvciBvdXQgY29tbW9uIGNvZGUgdGhlcmUKPiBhcyB3ZSd2 ZSBkaXNjdXNzZWQuIFRvIG15IGV5ZSBpdCBsb2dpY2FsbHkgYmVsb25ncyB0aGVyZS4gSnVzdCBs aWtlIHlvdXIKPiBnbnRkZXYgY2hhbmdlcyBiZWxvbmcgdG8gZ250ZGV2IGZpbGUuIChQcmVzdW1h Ymx5LCBiZWNhdXNlIEkgaGF2ZW4ndAo+IGFjdHVhbGx5IGxvb2tlZCBhdCB0aGVtIDstKSkKPgo+ IFNvIG15IHN1Z2dlc3Rpb24gaXMKPiAtIHNlcGFyYXRlIG1vZHVsZSBmb3IgeW91ciBjaGFuZ2Vz IGluIGJhbGxvb24uYwpPaywgc28sIGJhc2ljYWxseSwgdGhlIGNoYW5nZXMgSSBuZWVkIGZyb20g dGhlIGJhbGxvb24gZHJpdmVyIGlzCntpbmNyZWFzZXxkZWNyZWFzZX1fcmVzZXJ2YXRpb24gYW5k IERNQWFibGUgbWVtb3J5IGFsbG9jYXRpb25zLCBzbwpJJ2xsIG1vdmUgdGhhdCBpbnRvIGEgc2Vw YXJhdGUgZmlsZTogd2hhdCBjb3VsZCBiZSB0aGUgbmFtZSBmb3Igc3VjaCBhIGZpbGU/Cgo+IC0g a2VlcCBncmFudC10YWJsZSBjaGFuZ2VzLCB3aXRoIGNvbmZpZyBvcHRpb24KQ2FuIHdlIGNvbnNp ZGVyIG1vdmluZyBleC1iYWxsb29uIGNvZGUgaW50byBncmFudC10YWJsZT8KCj4gLSBrZWVwIGdu dGRldiBjaGFuZ2VzLCB3aXRoIGNvbmZpZyBvcHRpb24uCkknbGwgdHJ5IHRvIHNlZSB3aGF0IGhh cHBlbnMgdG8gZ250ZGV2IHdpdGggS2NvbmZpZyBvcHRpb24gd3J0IGZ1bmN0aW9uIApwcm90b3R5 cGUKY2hhbmdlcy4gSSBhbHNvIGhhdmUgdG8gY2hlY2sgaWYgVUFQSSBvZiBnbnRkZXYgY2FuIGFs c28gc3VwcG9ydCAKQ09ORklHX1hYWCBpZmRlZnMKdy9vIHByb2JsZW1zIC0gZG8geW91IGJ5IGNo YW5jZSBrbm93IGlmICNpZiBDT05GSUdfIGlzIG9rIGZvciBVQVBJIGZpbGVzPwpPciBJIGNhbiBs ZWF2ZSBVQVBJIGFzIGlzIGFuZCBpZmRlZiBpbiAuaW9jdGwgY2FsbGJhY2suCj4gICAoYnV0IHdo ZW4geW91IGdldCB0byBwb3N0Cj4gYWN0dWFsIHBhdGNoZXMgSSB3b3VsZCBhcHByZWNpYXRlIGlm IHlvdSBjb3VsZCBzcGxpdCB0aGlzIGludG8gYSBzZXJpZXMKPiBvZiBsb2dpY2FsIGNoYW5nZXMg YW5kIG5vdCBwb3N0IGEgb25lIGdpYW50IHBhdGNoKS4KT2YgY291cnNlLCBhcyB0aGlzIGlzIGF0 IFJGQyBzdGFnZSB0aGUgaWRlYSB3YXMgdG8gcm9sbCBvdXQgYWxsIHRoZSAKY2hhbmdlcyBhdCBv bmNlLCBzbwpldmVyeW9uZSBoYXMgdGhlIGZ1bGwgcGljdHVyZSBhbmQgZG9uJ3QgbmVlZCB0byBj b2xsZWN0IGNoYW5nZXMgZnJvbSBzZXQgCm9mIHBhdGNoZXMuCj4KPiAtYm9yaXMKPgpUaGFuayB5 b3UsCk9sZWtzYW5kcgo+PiBJIGFtIHN0aWxsIG1pc3NpbmcgeW91ciBwb2ludCBoZXJlPwo+Pgo+ Pj4+IElmIHlvdSBzdWdnZXN0IGEgbmV3IGtlcm5lbCBkcml2ZXIgbW9kdWxlOgo+Pj4+IElNTywg dGhlcmUgaXMgbm90aGluZyBiYWQgaWYgd2UgY3JlYXRlIGEgZGVkaWNhdGVkIGtlcm5lbCBtb2R1 bGUKPj4+PiAoZHJpdmVyKSBmb3IgWGVuIGRtYS1idWYgaGFuZGxpbmcgc2VsZWN0YWJsZSB1bmRl ciBLY29uZmlnIG9wdGlvbi4KPj4+PiBZZXMsIHRoaXMgd2lsbCBjcmVhdGUgYSB5ZXQgYW5vdGhl ciBkZXZpY2UgdW5kZXIgL2Rldi94ZW4sCj4+Pj4gYnV0IG1vc3QgcGVvcGxlIHdpbGwgbmV2ZXIg c2VlIGl0IGlmIHdlIHNldCBLY29uZmlnIHRvIGRlZmF1bHQgdG8gIm4iLgo+Pj4+IEFuZCB0aGVu IHdlJ2xsIG5lZWQgdXNlci1zcGFjZSBzdXBwb3J0IGZvciB0aGF0LCBzbyBYZW4gdG9vbHMgd2ls bAo+Pj4+IGJlIGV4dGVuZGVkIHdpdGggbGlieGVuZG1hYnVmLnNvIG9yIHNvLgo+Pj4+IFRoaXMg d2F5IGFsbCBYZW4gZG1hLWJ1ZiBzdXBwb3J0IGNhbiBiZSBsb2NhbGl6ZWQgYXQgb25lIHBsYWNl IHdoaWNoCj4+Pj4gbWlnaHQgYmUgZWFzaWVyIHRvIG1haW50YWluLiBXaGF0IGlzIG1vcmUgaXQg Y291bGQgYmUgdG90YWxseQo+Pj4+IHRyYW5zcGFyZW50Cj4+Pj4gdG8gbW9zdCBvZiB1cyBhcyBL Y29uZmlnIG9wdGlvbiB3b24ndCBiZSBzZXQgYnkgZGVmYXVsdCAoYm90aCBrZXJuZWwKPj4+PiBh bmQgWGVuKS4KPj4+IFRoZSBkb3duc2lkZSBpcyB0aGF0IHdlIHdpbGwgZW5kIHVwIGhhdmluZyBh bm90aGVyIGRldmljZSBmb3IgZG9pbmcKPj4+IHRoaW5ncyB0aGF0IGFyZSBub3QgdGhhdCBkaWZm ZXJlbnQgZnJvbSB3aGF0IHdlIGFyZSBhbHJlYWR5IGRvaW5nIHdpdGgKPj4+IGV4aXN0aW5nIGdu dHRhYiBkZXZpY2UuIE9yIGFyZSB0aGV5Pwo+PiBBZ3JlZSwgYnV0IEtjb25maWcgb3B0aW9uLCBJ TU8sIHdvbid0IG1ha2UgaXQgbG9vayBuaWNlIGJlY2F1c2UKPj4gb2YgZ250ZGV2IGNoYW5nZXMg YW5kIGNvZGUgcmV1c2UuCj4+PiAtYm9yaXMKPj4gVGhhbmsgeW91LAo+PiBPbGVrc2FuZHIKPj4K Pj4gX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KPj4gWGVu LWRldmVsIG1haWxpbmcgbGlzdAo+PiBYZW4tZGV2ZWxAbGlzdHMueGVucHJvamVjdC5vcmcKPj4g aHR0cHM6Ly9saXN0cy54ZW5wcm9qZWN0Lm9yZy9tYWlsbWFuL2xpc3RpbmZvL3hlbi1kZXZlbAoK X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KZHJpLWRldmVs IG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlz dHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVsCg==