From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751460AbeDEODa (ORCPT ); Thu, 5 Apr 2018 10:03:30 -0400 Received: from mail-io0-f170.google.com ([209.85.223.170]:41845 "EHLO mail-io0-f170.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751195AbeDEOD3 (ORCPT ); Thu, 5 Apr 2018 10:03:29 -0400 X-Google-Smtp-Source: AIpwx490p/e1CQJqKmsisrlgLm5Bo4y8JTi2FJdWS3tF+MKLtDw9zWiFb21WvGzdmmZTaewjioYfHZevrF90h/sRCtc= MIME-Version: 1.0 X-Originating-IP: [212.51.149.109] In-Reply-To: References: <20180404223251.28449-1-eric@anholt.net> From: Daniel Vetter Date: Thu, 5 Apr 2018 16:03:27 +0200 X-Google-Sender-Auth: jl3EQAbKCYhqhtFZmuRB898DNS0 Message-ID: Subject: Re: [PATCH] drm/sched: Extend the documentation. To: Alex Deucher Cc: Nayan Deshmukh , Alex Deucher , =?UTF-8?Q?Christian_K=C3=B6nig?= , dri-devel , Linux Kernel Mailing List Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, Apr 5, 2018 at 3:44 PM, Alex Deucher wrote: > On Thu, Apr 5, 2018 at 9:41 AM, Nayan Deshmukh > wrote: >> On Thu, Apr 5, 2018 at 6:59 PM, Daniel Vetter wrote: >>> On Thu, Apr 5, 2018 at 3:27 PM, Alex Deucher wrote: >>>> On Thu, Apr 5, 2018 at 2:16 AM, Daniel Vetter wrote: >>>>> On Thu, Apr 5, 2018 at 12:32 AM, Eric Anholt wrote: >>>>>> These comments answer all the questions I had for myself when >>>>>> implementing a driver using the GPU scheduler. >>>>>> >>>>>> Signed-off-by: Eric Anholt >>>>> >>>>> Pulling all these comments into the generated kerneldoc would be >>>>> awesome, maybe as a new "GPU Scheduler" chapter at the end of >>>>> drm-mm.rst? Would mean a bit of busywork to convert the existing raw >>>>> comments into proper kerneldoc. Also has the benefit that 0day will >>>>> complain when you forget to update the comment when editing the >>>>> function prototype - kerneldoc which isn't included anywhere in .rst >>>>> won't be checked automatically. >>>> >>>> I was actually planning to do this myself, but Nayan wanted to do this >>>> a prep work for his proposed GSoC project so I was going to see how >>>> far he got first. >> >> It is still on my TODO list. Just got a bit busy with my coursework. I >> will try to look at it during the weekend. > > No worries. Take your time. > >>> >>> Awesome. I'm also happy to help out with any kerneldoc questions and >>> best practices. Technically ofc no clue about the scheduler :-) >>> >> I was thinking of adding a different rst for scheduler altogther. Will >> it be better to add it in drm-mm.rst itself? > > I had been planning to add a separate file too since it's a separate > entity. Do whatever you think works best. My recommendation is that to put the gist of the docs all into source-code comments. That way there's a much higher chance to spot them. In the docs you'll then only have the chapter structure (and not sure the scheduler needs more than 1 chapter). drm-mm.rst is a bit misnamed, since it contains all the stuff for handling rendering: MM, fences, dma-buf/prime, drm_syncobjs. I think scheduler fits very well in that topic range. We can ofc rename it to drm-rendering.rst or similar, if the -mm.rst is misleading (plus adjust the title). -Daniel > > Alex > >> >>> Cheers, Daniel >>>> Alex >>>> >>>>> -Daniel >>>>> >>>>>> --- >>>>>> include/drm/gpu_scheduler.h | 46 +++++++++++++++++++++++++++++++++---- >>>>>> 1 file changed, 42 insertions(+), 4 deletions(-) >>>>>> >>>>>> diff --git a/include/drm/gpu_scheduler.h b/include/drm/gpu_scheduler.h >>>>>> index dfd54fb94e10..c053a32341bf 100644 >>>>>> --- a/include/drm/gpu_scheduler.h >>>>>> +++ b/include/drm/gpu_scheduler.h >>>>>> @@ -43,10 +43,12 @@ enum drm_sched_priority { >>>>>> }; >>>>>> >>>>>> /** >>>>>> - * A scheduler entity is a wrapper around a job queue or a group >>>>>> - * of other entities. Entities take turns emitting jobs from their >>>>>> - * job queues to corresponding hardware ring based on scheduling >>>>>> - * policy. >>>>>> + * drm_sched_entity - A wrapper around a job queue (typically attached >>>>>> + * to the DRM file_priv). >>>>>> + * >>>>>> + * Entities will emit jobs in order to their corresponding hardware >>>>>> + * ring, and the scheduler will alternate between entities based on >>>>>> + * scheduling policy. >>>>>> */ >>>>>> struct drm_sched_entity { >>>>>> struct list_head list; >>>>>> @@ -78,7 +80,18 @@ struct drm_sched_rq { >>>>>> >>>>>> struct drm_sched_fence { >>>>>> struct dma_fence scheduled; >>>>>> + >>>>>> + /* This fence is what will be signaled by the scheduler when >>>>>> + * the job is completed. >>>>>> + * >>>>>> + * When setting up an out fence for the job, you should use >>>>>> + * this, since it's available immediately upon >>>>>> + * drm_sched_job_init(), and the fence returned by the driver >>>>>> + * from run_job() won't be created until the dependencies have >>>>>> + * resolved. >>>>>> + */ >>>>>> struct dma_fence finished; >>>>>> + >>>>>> struct dma_fence_cb cb; >>>>>> struct dma_fence *parent; >>>>>> struct drm_gpu_scheduler *sched; >>>>>> @@ -88,6 +101,13 @@ struct drm_sched_fence { >>>>>> >>>>>> struct drm_sched_fence *to_drm_sched_fence(struct dma_fence *f); >>>>>> >>>>>> +/** >>>>>> + * drm_sched_job - A job to be run by an entity. >>>>>> + * >>>>>> + * A job is created by the driver using drm_sched_job_init(), and >>>>>> + * should call drm_sched_entity_push_job() once it wants the scheduler >>>>>> + * to schedule the job. >>>>>> + */ >>>>>> struct drm_sched_job { >>>>>> struct spsc_node queue_node; >>>>>> struct drm_gpu_scheduler *sched; >>>>>> @@ -112,10 +132,28 @@ static inline bool drm_sched_invalidate_job(struct drm_sched_job *s_job, >>>>>> * these functions should be implemented in driver side >>>>>> */ >>>>>> struct drm_sched_backend_ops { >>>>>> + /* Called when the scheduler is considering scheduling this >>>>>> + * job next, to get another struct dma_fence for this job to >>>>>> + * block on. Once it returns NULL, run_job() may be called. >>>>>> + */ >>>>>> struct dma_fence *(*dependency)(struct drm_sched_job *sched_job, >>>>>> struct drm_sched_entity *s_entity); >>>>>> + >>>>>> + /* Called to execute the job once all of the dependencies have >>>>>> + * been resolved. This may be called multiple times, if >>>>>> + * timedout_job() has happened and drm_sched_job_recovery() >>>>>> + * decides to try it again. >>>>>> + */ >>>>>> struct dma_fence *(*run_job)(struct drm_sched_job *sched_job); >>>>>> + >>>>>> + /* Called when a job has taken too long to execute, to trigger >>>>>> + * GPU recovery. >>>>>> + */ >>>>>> void (*timedout_job)(struct drm_sched_job *sched_job); >>>>>> + >>>>>> + /* Called once the job's finished fence has been signaled and >>>>>> + * it's time to clean it up. >>>>>> + */ >>>>>> void (*free_job)(struct drm_sched_job *sched_job); >>>>>> }; >>>>>> >>>>>> -- >>>>>> 2.17.0 >>>>>> >>>>>> _______________________________________________ >>>>>> dri-devel mailing list >>>>>> dri-devel@lists.freedesktop.org >>>>>> https://lists.freedesktop.org/mailman/listinfo/dri-devel >>>>> >>>>> >>>>> >>>>> -- >>>>> Daniel Vetter >>>>> Software Engineer, Intel Corporation >>>>> +41 (0) 79 365 57 48 - http://blog.ffwll.ch >>>>> _______________________________________________ >>>>> dri-devel mailing list >>>>> dri-devel@lists.freedesktop.org >>>>> https://lists.freedesktop.org/mailman/listinfo/dri-devel >>> >>> >>> >>> -- >>> Daniel Vetter >>> Software Engineer, Intel Corporation >>> +41 (0) 79 365 57 48 - http://blog.ffwll.ch >>> _______________________________________________ >>> dri-devel mailing list >>> dri-devel@lists.freedesktop.org >>> https://lists.freedesktop.org/mailman/listinfo/dri-devel -- Daniel Vetter Software Engineer, Intel Corporation +41 (0) 79 365 57 48 - http://blog.ffwll.ch From mboxrd@z Thu Jan 1 00:00:00 1970 From: Daniel Vetter Subject: Re: [PATCH] drm/sched: Extend the documentation. Date: Thu, 5 Apr 2018 16:03:27 +0200 Message-ID: References: <20180404223251.28449-1-eric@anholt.net> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-io0-x234.google.com (mail-io0-x234.google.com [IPv6:2607:f8b0:4001:c06::234]) by gabe.freedesktop.org (Postfix) with ESMTPS id F13E76E488 for ; Thu, 5 Apr 2018 14:03:28 +0000 (UTC) Received: by mail-io0-x234.google.com with SMTP id p139so6709577iod.0 for ; Thu, 05 Apr 2018 07:03:28 -0700 (PDT) In-Reply-To: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Alex Deucher Cc: Nayan Deshmukh , Alex Deucher , =?UTF-8?Q?Christian_K=C3=B6nig?= , dri-devel , Linux Kernel Mailing List List-Id: dri-devel@lists.freedesktop.org T24gVGh1LCBBcHIgNSwgMjAxOCBhdCAzOjQ0IFBNLCBBbGV4IERldWNoZXIgPGFsZXhkZXVjaGVy QGdtYWlsLmNvbT4gd3JvdGU6Cj4gT24gVGh1LCBBcHIgNSwgMjAxOCBhdCA5OjQxIEFNLCBOYXlh biBEZXNobXVraAo+IDxuYXlhbjI2ZGVzaG11a2hAZ21haWwuY29tPiB3cm90ZToKPj4gT24gVGh1 LCBBcHIgNSwgMjAxOCBhdCA2OjU5IFBNLCBEYW5pZWwgVmV0dGVyIDxkYW5pZWxAZmZ3bGwuY2g+ IHdyb3RlOgo+Pj4gT24gVGh1LCBBcHIgNSwgMjAxOCBhdCAzOjI3IFBNLCBBbGV4IERldWNoZXIg PGFsZXhkZXVjaGVyQGdtYWlsLmNvbT4gd3JvdGU6Cj4+Pj4gT24gVGh1LCBBcHIgNSwgMjAxOCBh dCAyOjE2IEFNLCBEYW5pZWwgVmV0dGVyIDxkYW5pZWxAZmZ3bGwuY2g+IHdyb3RlOgo+Pj4+PiBP biBUaHUsIEFwciA1LCAyMDE4IGF0IDEyOjMyIEFNLCBFcmljIEFuaG9sdCA8ZXJpY0BhbmhvbHQu bmV0PiB3cm90ZToKPj4+Pj4+IFRoZXNlIGNvbW1lbnRzIGFuc3dlciBhbGwgdGhlIHF1ZXN0aW9u cyBJIGhhZCBmb3IgbXlzZWxmIHdoZW4KPj4+Pj4+IGltcGxlbWVudGluZyBhIGRyaXZlciB1c2lu ZyB0aGUgR1BVIHNjaGVkdWxlci4KPj4+Pj4+Cj4+Pj4+PiBTaWduZWQtb2ZmLWJ5OiBFcmljIEFu aG9sdCA8ZXJpY0BhbmhvbHQubmV0Pgo+Pj4+Pgo+Pj4+PiBQdWxsaW5nIGFsbCB0aGVzZSBjb21t ZW50cyBpbnRvIHRoZSBnZW5lcmF0ZWQga2VybmVsZG9jIHdvdWxkIGJlCj4+Pj4+IGF3ZXNvbWUs IG1heWJlIGFzIGEgbmV3ICJHUFUgU2NoZWR1bGVyIiBjaGFwdGVyIGF0IHRoZSBlbmQgb2YKPj4+ Pj4gZHJtLW1tLnJzdD8gV291bGQgbWVhbiBhIGJpdCBvZiBidXN5d29yayB0byBjb252ZXJ0IHRo ZSBleGlzdGluZyByYXcKPj4+Pj4gY29tbWVudHMgaW50byBwcm9wZXIga2VybmVsZG9jLiBBbHNv IGhhcyB0aGUgYmVuZWZpdCB0aGF0IDBkYXkgd2lsbAo+Pj4+PiBjb21wbGFpbiB3aGVuIHlvdSBm b3JnZXQgdG8gdXBkYXRlIHRoZSBjb21tZW50IHdoZW4gZWRpdGluZyB0aGUKPj4+Pj4gZnVuY3Rp b24gcHJvdG90eXBlIC0ga2VybmVsZG9jIHdoaWNoIGlzbid0IGluY2x1ZGVkIGFueXdoZXJlIGlu IC5yc3QKPj4+Pj4gd29uJ3QgYmUgY2hlY2tlZCBhdXRvbWF0aWNhbGx5Lgo+Pj4+Cj4+Pj4gSSB3 YXMgYWN0dWFsbHkgcGxhbm5pbmcgdG8gZG8gdGhpcyBteXNlbGYsIGJ1dCBOYXlhbiB3YW50ZWQg dG8gZG8gdGhpcwo+Pj4+IGEgcHJlcCB3b3JrIGZvciBoaXMgcHJvcG9zZWQgR1NvQyBwcm9qZWN0 IHNvIEkgd2FzIGdvaW5nIHRvIHNlZSBob3cKPj4+PiBmYXIgaGUgZ290IGZpcnN0Lgo+Pgo+PiBJ dCBpcyBzdGlsbCBvbiBteSBUT0RPIGxpc3QuIEp1c3QgZ290IGEgYml0IGJ1c3kgd2l0aCBteSBj b3Vyc2V3b3JrLiBJCj4+IHdpbGwgdHJ5IHRvIGxvb2sgYXQgaXQgZHVyaW5nIHRoZSB3ZWVrZW5k Lgo+Cj4gTm8gd29ycmllcy4gIFRha2UgeW91ciB0aW1lLgo+Cj4+Pgo+Pj4gQXdlc29tZS4gSSdt IGFsc28gaGFwcHkgdG8gaGVscCBvdXQgd2l0aCBhbnkga2VybmVsZG9jIHF1ZXN0aW9ucyBhbmQK Pj4+IGJlc3QgcHJhY3RpY2VzLiBUZWNobmljYWxseSBvZmMgbm8gY2x1ZSBhYm91dCB0aGUgc2No ZWR1bGVyIDotKQo+Pj4KPj4gSSB3YXMgdGhpbmtpbmcgb2YgYWRkaW5nIGEgZGlmZmVyZW50IHJz dCBmb3Igc2NoZWR1bGVyIGFsdG9ndGhlci4gV2lsbAo+PiBpdCBiZSBiZXR0ZXIgdG8gYWRkIGl0 IGluIGRybS1tbS5yc3QgaXRzZWxmPwo+Cj4gSSBoYWQgYmVlbiBwbGFubmluZyB0byBhZGQgYSBz ZXBhcmF0ZSBmaWxlIHRvbyBzaW5jZSBpdCdzIGEgc2VwYXJhdGUKPiBlbnRpdHkuICBEbyB3aGF0 ZXZlciB5b3UgdGhpbmsgd29ya3MgYmVzdC4KCk15IHJlY29tbWVuZGF0aW9uIGlzIHRoYXQgdG8g cHV0IHRoZSBnaXN0IG9mIHRoZSBkb2NzIGFsbCBpbnRvCnNvdXJjZS1jb2RlIGNvbW1lbnRzLiBU aGF0IHdheSB0aGVyZSdzIGEgbXVjaCBoaWdoZXIgY2hhbmNlIHRvIHNwb3QKdGhlbS4gSW4gdGhl IGRvY3MgeW91J2xsIHRoZW4gb25seSBoYXZlIHRoZSBjaGFwdGVyIHN0cnVjdHVyZSAoYW5kIG5v dApzdXJlIHRoZSBzY2hlZHVsZXIgbmVlZHMgbW9yZSB0aGFuIDEgY2hhcHRlcikuCgpkcm0tbW0u cnN0IGlzIGEgYml0IG1pc25hbWVkLCBzaW5jZSBpdCBjb250YWlucyBhbGwgdGhlIHN0dWZmIGZv cgpoYW5kbGluZyByZW5kZXJpbmc6IE1NLCBmZW5jZXMsIGRtYS1idWYvcHJpbWUsIGRybV9zeW5j b2Jqcy4gSSB0aGluawpzY2hlZHVsZXIgZml0cyB2ZXJ5IHdlbGwgaW4gdGhhdCB0b3BpYyByYW5n ZS4gV2UgY2FuIG9mYyByZW5hbWUgaXQgdG8KZHJtLXJlbmRlcmluZy5yc3Qgb3Igc2ltaWxhciwg aWYgdGhlIC1tbS5yc3QgaXMgbWlzbGVhZGluZyAocGx1cwphZGp1c3QgdGhlIHRpdGxlKS4KLURh bmllbAoKPgo+IEFsZXgKPgo+Pgo+Pj4gQ2hlZXJzLCBEYW5pZWwKPj4+PiBBbGV4Cj4+Pj4KPj4+ Pj4gLURhbmllbAo+Pj4+Pgo+Pj4+Pj4gLS0tCj4+Pj4+PiAgaW5jbHVkZS9kcm0vZ3B1X3NjaGVk dWxlci5oIHwgNDYgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrLS0tLQo+Pj4+Pj4g IDEgZmlsZSBjaGFuZ2VkLCA0MiBpbnNlcnRpb25zKCspLCA0IGRlbGV0aW9ucygtKQo+Pj4+Pj4K Pj4+Pj4+IGRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS9ncHVfc2NoZWR1bGVyLmggYi9pbmNsdWRl L2RybS9ncHVfc2NoZWR1bGVyLmgKPj4+Pj4+IGluZGV4IGRmZDU0ZmI5NGUxMC4uYzA1M2EzMjM0 MWJmIDEwMDY0NAo+Pj4+Pj4gLS0tIGEvaW5jbHVkZS9kcm0vZ3B1X3NjaGVkdWxlci5oCj4+Pj4+ PiArKysgYi9pbmNsdWRlL2RybS9ncHVfc2NoZWR1bGVyLmgKPj4+Pj4+IEBAIC00MywxMCArNDMs MTIgQEAgZW51bSBkcm1fc2NoZWRfcHJpb3JpdHkgewo+Pj4+Pj4gIH07Cj4+Pj4+Pgo+Pj4+Pj4g IC8qKgo+Pj4+Pj4gLSAqIEEgc2NoZWR1bGVyIGVudGl0eSBpcyBhIHdyYXBwZXIgYXJvdW5kIGEg am9iIHF1ZXVlIG9yIGEgZ3JvdXAKPj4+Pj4+IC0gKiBvZiBvdGhlciBlbnRpdGllcy4gRW50aXRp ZXMgdGFrZSB0dXJucyBlbWl0dGluZyBqb2JzIGZyb20gdGhlaXIKPj4+Pj4+IC0gKiBqb2IgcXVl dWVzIHRvIGNvcnJlc3BvbmRpbmcgaGFyZHdhcmUgcmluZyBiYXNlZCBvbiBzY2hlZHVsaW5nCj4+ Pj4+PiAtICogcG9saWN5Lgo+Pj4+Pj4gKyAqIGRybV9zY2hlZF9lbnRpdHkgLSBBIHdyYXBwZXIg YXJvdW5kIGEgam9iIHF1ZXVlICh0eXBpY2FsbHkgYXR0YWNoZWQKPj4+Pj4+ICsgKiB0byB0aGUg RFJNIGZpbGVfcHJpdikuCj4+Pj4+PiArICoKPj4+Pj4+ICsgKiBFbnRpdGllcyB3aWxsIGVtaXQg am9icyBpbiBvcmRlciB0byB0aGVpciBjb3JyZXNwb25kaW5nIGhhcmR3YXJlCj4+Pj4+PiArICog cmluZywgYW5kIHRoZSBzY2hlZHVsZXIgd2lsbCBhbHRlcm5hdGUgYmV0d2VlbiBlbnRpdGllcyBi YXNlZCBvbgo+Pj4+Pj4gKyAqIHNjaGVkdWxpbmcgcG9saWN5Lgo+Pj4+Pj4gICovCj4+Pj4+PiAg c3RydWN0IGRybV9zY2hlZF9lbnRpdHkgewo+Pj4+Pj4gICAgICAgICBzdHJ1Y3QgbGlzdF9oZWFk ICAgICAgICAgICAgICAgIGxpc3Q7Cj4+Pj4+PiBAQCAtNzgsNyArODAsMTggQEAgc3RydWN0IGRy bV9zY2hlZF9ycSB7Cj4+Pj4+Pgo+Pj4+Pj4gIHN0cnVjdCBkcm1fc2NoZWRfZmVuY2Ugewo+Pj4+ Pj4gICAgICAgICBzdHJ1Y3QgZG1hX2ZlbmNlICAgICAgICAgICAgICAgIHNjaGVkdWxlZDsKPj4+ Pj4+ICsKPj4+Pj4+ICsgICAgICAgLyogVGhpcyBmZW5jZSBpcyB3aGF0IHdpbGwgYmUgc2lnbmFs ZWQgYnkgdGhlIHNjaGVkdWxlciB3aGVuCj4+Pj4+PiArICAgICAgICAqIHRoZSBqb2IgaXMgY29t cGxldGVkLgo+Pj4+Pj4gKyAgICAgICAgKgo+Pj4+Pj4gKyAgICAgICAgKiBXaGVuIHNldHRpbmcg dXAgYW4gb3V0IGZlbmNlIGZvciB0aGUgam9iLCB5b3Ugc2hvdWxkIHVzZQo+Pj4+Pj4gKyAgICAg ICAgKiB0aGlzLCBzaW5jZSBpdCdzIGF2YWlsYWJsZSBpbW1lZGlhdGVseSB1cG9uCj4+Pj4+PiAr ICAgICAgICAqIGRybV9zY2hlZF9qb2JfaW5pdCgpLCBhbmQgdGhlIGZlbmNlIHJldHVybmVkIGJ5 IHRoZSBkcml2ZXIKPj4+Pj4+ICsgICAgICAgICogZnJvbSBydW5fam9iKCkgd29uJ3QgYmUgY3Jl YXRlZCB1bnRpbCB0aGUgZGVwZW5kZW5jaWVzIGhhdmUKPj4+Pj4+ICsgICAgICAgICogcmVzb2x2 ZWQuCj4+Pj4+PiArICAgICAgICAqLwo+Pj4+Pj4gICAgICAgICBzdHJ1Y3QgZG1hX2ZlbmNlICAg ICAgICAgICAgICAgIGZpbmlzaGVkOwo+Pj4+Pj4gKwo+Pj4+Pj4gICAgICAgICBzdHJ1Y3QgZG1h X2ZlbmNlX2NiICAgICAgICAgICAgIGNiOwo+Pj4+Pj4gICAgICAgICBzdHJ1Y3QgZG1hX2ZlbmNl ICAgICAgICAgICAgICAgICpwYXJlbnQ7Cj4+Pj4+PiAgICAgICAgIHN0cnVjdCBkcm1fZ3B1X3Nj aGVkdWxlciAgICAgICAgKnNjaGVkOwo+Pj4+Pj4gQEAgLTg4LDYgKzEwMSwxMyBAQCBzdHJ1Y3Qg ZHJtX3NjaGVkX2ZlbmNlIHsKPj4+Pj4+Cj4+Pj4+PiAgc3RydWN0IGRybV9zY2hlZF9mZW5jZSAq dG9fZHJtX3NjaGVkX2ZlbmNlKHN0cnVjdCBkbWFfZmVuY2UgKmYpOwo+Pj4+Pj4KPj4+Pj4+ICsv KioKPj4+Pj4+ICsgKiBkcm1fc2NoZWRfam9iIC0gQSBqb2IgdG8gYmUgcnVuIGJ5IGFuIGVudGl0 eS4KPj4+Pj4+ICsgKgo+Pj4+Pj4gKyAqIEEgam9iIGlzIGNyZWF0ZWQgYnkgdGhlIGRyaXZlciB1 c2luZyBkcm1fc2NoZWRfam9iX2luaXQoKSwgYW5kCj4+Pj4+PiArICogc2hvdWxkIGNhbGwgZHJt X3NjaGVkX2VudGl0eV9wdXNoX2pvYigpIG9uY2UgaXQgd2FudHMgdGhlIHNjaGVkdWxlcgo+Pj4+ Pj4gKyAqIHRvIHNjaGVkdWxlIHRoZSBqb2IuCj4+Pj4+PiArICovCj4+Pj4+PiAgc3RydWN0IGRy bV9zY2hlZF9qb2Igewo+Pj4+Pj4gICAgICAgICBzdHJ1Y3Qgc3BzY19ub2RlICAgICAgICAgICAg ICAgIHF1ZXVlX25vZGU7Cj4+Pj4+PiAgICAgICAgIHN0cnVjdCBkcm1fZ3B1X3NjaGVkdWxlciAg ICAgICAgKnNjaGVkOwo+Pj4+Pj4gQEAgLTExMiwxMCArMTMyLDI4IEBAIHN0YXRpYyBpbmxpbmUg Ym9vbCBkcm1fc2NoZWRfaW52YWxpZGF0ZV9qb2Ioc3RydWN0IGRybV9zY2hlZF9qb2IgKnNfam9i LAo+Pj4+Pj4gICAqIHRoZXNlIGZ1bmN0aW9ucyBzaG91bGQgYmUgaW1wbGVtZW50ZWQgaW4gZHJp dmVyIHNpZGUKPj4+Pj4+ICAqLwo+Pj4+Pj4gIHN0cnVjdCBkcm1fc2NoZWRfYmFja2VuZF9vcHMg ewo+Pj4+Pj4gKyAgICAgICAvKiBDYWxsZWQgd2hlbiB0aGUgc2NoZWR1bGVyIGlzIGNvbnNpZGVy aW5nIHNjaGVkdWxpbmcgdGhpcwo+Pj4+Pj4gKyAgICAgICAgKiBqb2IgbmV4dCwgdG8gZ2V0IGFu b3RoZXIgc3RydWN0IGRtYV9mZW5jZSBmb3IgdGhpcyBqb2IgdG8KPj4+Pj4+ICsgICAgICAgICog YmxvY2sgb24uICBPbmNlIGl0IHJldHVybnMgTlVMTCwgcnVuX2pvYigpIG1heSBiZSBjYWxsZWQu Cj4+Pj4+PiArICAgICAgICAqLwo+Pj4+Pj4gICAgICAgICBzdHJ1Y3QgZG1hX2ZlbmNlICooKmRl cGVuZGVuY3kpKHN0cnVjdCBkcm1fc2NoZWRfam9iICpzY2hlZF9qb2IsCj4+Pj4+PiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRybV9zY2hlZF9lbnRpdHkg KnNfZW50aXR5KTsKPj4+Pj4+ICsKPj4+Pj4+ICsgICAgICAgLyogQ2FsbGVkIHRvIGV4ZWN1dGUg dGhlIGpvYiBvbmNlIGFsbCBvZiB0aGUgZGVwZW5kZW5jaWVzIGhhdmUKPj4+Pj4+ICsgICAgICAg ICogYmVlbiByZXNvbHZlZC4gIFRoaXMgbWF5IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcywgaWYK Pj4+Pj4+ICsgICAgICAgICogdGltZWRvdXRfam9iKCkgaGFzIGhhcHBlbmVkIGFuZCBkcm1fc2No ZWRfam9iX3JlY292ZXJ5KCkKPj4+Pj4+ICsgICAgICAgICogZGVjaWRlcyB0byB0cnkgaXQgYWdh aW4uCj4+Pj4+PiArICAgICAgICAqLwo+Pj4+Pj4gICAgICAgICBzdHJ1Y3QgZG1hX2ZlbmNlICoo KnJ1bl9qb2IpKHN0cnVjdCBkcm1fc2NoZWRfam9iICpzY2hlZF9qb2IpOwo+Pj4+Pj4gKwo+Pj4+ Pj4gKyAgICAgICAvKiBDYWxsZWQgd2hlbiBhIGpvYiBoYXMgdGFrZW4gdG9vIGxvbmcgdG8gZXhl Y3V0ZSwgdG8gdHJpZ2dlcgo+Pj4+Pj4gKyAgICAgICAgKiBHUFUgcmVjb3ZlcnkuCj4+Pj4+PiAr ICAgICAgICAqLwo+Pj4+Pj4gICAgICAgICB2b2lkICgqdGltZWRvdXRfam9iKShzdHJ1Y3QgZHJt X3NjaGVkX2pvYiAqc2NoZWRfam9iKTsKPj4+Pj4+ICsKPj4+Pj4+ICsgICAgICAgLyogQ2FsbGVk IG9uY2UgdGhlIGpvYidzIGZpbmlzaGVkIGZlbmNlIGhhcyBiZWVuIHNpZ25hbGVkIGFuZAo+Pj4+ Pj4gKyAgICAgICAgKiBpdCdzIHRpbWUgdG8gY2xlYW4gaXQgdXAuCj4+Pj4+PiArICAgICAgICAq Lwo+Pj4+Pj4gICAgICAgICB2b2lkICgqZnJlZV9qb2IpKHN0cnVjdCBkcm1fc2NoZWRfam9iICpz Y2hlZF9qb2IpOwo+Pj4+Pj4gIH07Cj4+Pj4+Pgo+Pj4+Pj4gLS0KPj4+Pj4+IDIuMTcuMAo+Pj4+ Pj4KPj4+Pj4+IF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f Cj4+Pj4+PiBkcmktZGV2ZWwgbWFpbGluZyBsaXN0Cj4+Pj4+PiBkcmktZGV2ZWxAbGlzdHMuZnJl ZWRlc2t0b3Aub3JnCj4+Pj4+PiBodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFu L2xpc3RpbmZvL2RyaS1kZXZlbAo+Pj4+Pgo+Pj4+Pgo+Pj4+Pgo+Pj4+PiAtLQo+Pj4+PiBEYW5p ZWwgVmV0dGVyCj4+Pj4+IFNvZnR3YXJlIEVuZ2luZWVyLCBJbnRlbCBDb3Jwb3JhdGlvbgo+Pj4+ PiArNDEgKDApIDc5IDM2NSA1NyA0OCAtIGh0dHA6Ly9ibG9nLmZmd2xsLmNoCj4+Pj4+IF9fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCj4+Pj4+IGRyaS1kZXZl bCBtYWlsaW5nIGxpc3QKPj4+Pj4gZHJpLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwo+Pj4+ PiBodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZl bAo+Pj4KPj4+Cj4+Pgo+Pj4gLS0KPj4+IERhbmllbCBWZXR0ZXIKPj4+IFNvZnR3YXJlIEVuZ2lu ZWVyLCBJbnRlbCBDb3Jwb3JhdGlvbgo+Pj4gKzQxICgwKSA3OSAzNjUgNTcgNDggLSBodHRwOi8v YmxvZy5mZndsbC5jaAo+Pj4gX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX18KPj4+IGRyaS1kZXZlbCBtYWlsaW5nIGxpc3QKPj4+IGRyaS1kZXZlbEBsaXN0cy5m cmVlZGVza3RvcC5vcmcKPj4+IGh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4v bGlzdGluZm8vZHJpLWRldmVsCgoKCi0tIApEYW5pZWwgVmV0dGVyClNvZnR3YXJlIEVuZ2luZWVy LCBJbnRlbCBDb3Jwb3JhdGlvbgorNDEgKDApIDc5IDM2NSA1NyA0OCAtIGh0dHA6Ly9ibG9nLmZm d2xsLmNoCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmRy aS1kZXZlbCBtYWlsaW5nIGxpc3QKZHJpLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRw czovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbAo=