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=-13.8 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=ham 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 03EDCC47084 for ; Tue, 25 May 2021 13:37:41 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id BA5236140F for ; Tue, 25 May 2021 13:37:40 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org BA5236140F Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=linux.intel.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id C14AA89CD7; Tue, 25 May 2021 13:37:38 +0000 (UTC) Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by gabe.freedesktop.org (Postfix) with ESMTPS id 39E3189C96; Tue, 25 May 2021 13:37:37 +0000 (UTC) IronPort-SDR: nel6YYkeB8QgMioWpFFmwBw6ig84PA3Nln+iJg9+614XeOm2xkjN4/3GqVDJp6B02ACjP7f+w9 Ti3RyjagcxLg== X-IronPort-AV: E=McAfee;i="6200,9189,9995"; a="202211187" X-IronPort-AV: E=Sophos;i="5.82,328,1613462400"; d="scan'208";a="202211187" Received: from orsmga001.jf.intel.com ([10.7.209.18]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 May 2021 06:37:32 -0700 IronPort-SDR: oeNNfTENPVKCqm0o3j/YOHMpdcM+XqG/TqNd6otZaGDXbIKwsUs/iRKp25e2WaLNp5U0aVJDXO DNZZ1paZhcVw== X-IronPort-AV: E=Sophos;i="5.82,328,1613462400"; d="scan'208";a="476426302" Received: from tmuluk-mobl.ger.corp.intel.com ([10.249.254.198]) by orsmga001-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 May 2021 06:37:29 -0700 Message-ID: <30dc2d316b643a07babbb3a985b6ff2bbf533345.camel@linux.intel.com> Subject: Re: [Intel-gfx] [PATCH v3 09/12] drm/ttm: Document and optimize ttm_bo_pipeline_gutting() From: Thomas =?ISO-8859-1?Q?Hellstr=F6m?= To: Matthew Auld Date: Tue, 25 May 2021 15:37:27 +0200 In-Reply-To: References: <20210521153253.518037-1-thomas.hellstrom@linux.intel.com> <20210521153253.518037-10-thomas.hellstrom@linux.intel.com> Content-Type: text/plain; charset="UTF-8" User-Agent: Evolution 3.38.4 (3.38.4-1.fc33) MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Intel Graphics Development , Christian =?ISO-8859-1?Q?K=F6nig?= , ML dri-devel Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" On Tue, 2021-05-25 at 12:00 +0100, Matthew Auld wrote: > On Fri, 21 May 2021 at 16:33, Thomas Hellström > wrote: > > > > If the bo is idle when calling ttm_bo_pipeline_gutting(), we > > unnecessarily > > create a ghost object and push it out to delayed destroy. > > Fix this by adding a path for idle, and document the function. > > > > Also avoid having the bo end up in a bad state vulnerable to user- > > space > > triggered kernel BUGs if the call to ttm_tt_create() fails. > > > > Finally reuse ttm_bo_pipeline_gutting() in ttm_bo_evict(). > > > > Cc: Christian König > > Signed-off-by: Thomas Hellström > > --- > >  drivers/gpu/drm/ttm/ttm_bo.c      | 20 ++++++------ > >  drivers/gpu/drm/ttm/ttm_bo_util.c | 52 > > ++++++++++++++++++++++++++++--- > >  drivers/gpu/drm/ttm/ttm_tt.c      |  5 +++ > >  include/drm/ttm/ttm_tt.h          | 10 ++++++ > >  4 files changed, 73 insertions(+), 14 deletions(-) > > > > diff --git a/drivers/gpu/drm/ttm/ttm_bo.c > > b/drivers/gpu/drm/ttm/ttm_bo.c > > index ca1b098b6a56..a8fa3375b8aa 100644 > > --- a/drivers/gpu/drm/ttm/ttm_bo.c > > +++ b/drivers/gpu/drm/ttm/ttm_bo.c > > @@ -501,10 +501,15 @@ static int ttm_bo_evict(struct > > ttm_buffer_object *bo, > >         bdev->funcs->evict_flags(bo, &placement); > > > >         if (!placement.num_placement && > > !placement.num_busy_placement) { > > -               ttm_bo_wait(bo, false, false); > > +               ret = ttm_bo_wait(bo, true, false); > > +               if (ret) > > +                       return ret; > > > > -               ttm_bo_cleanup_memtype_use(bo); > > -               return ttm_tt_create(bo, false); > > +               /* > > +                * Since we've already synced, this frees backing > > store > > +                * immediately. > > +                */ > > +               return ttm_bo_pipeline_gutting(bo); > >         } > > > >         ret = ttm_bo_mem_space(bo, &placement, &evict_mem, ctx); > > @@ -974,13 +979,8 @@ int ttm_bo_validate(struct ttm_buffer_object > > *bo, > >         /* > >          * Remove the backing store if no placement is given. > >          */ > > -       if (!placement->num_placement && !placement- > > >num_busy_placement) { > > -               ret = ttm_bo_pipeline_gutting(bo); > > -               if (ret) > > -                       return ret; > > - > > -               return ttm_tt_create(bo, false); > > -       } > > +       if (!placement->num_placement && !placement- > > >num_busy_placement) > > +               return ttm_bo_pipeline_gutting(bo); > > > >         /* > >          * Check whether we need to move buffer. > > diff --git a/drivers/gpu/drm/ttm/ttm_bo_util.c > > b/drivers/gpu/drm/ttm/ttm_bo_util.c > > index 4a7d3d672f9a..7fa9b3a852eb 100644 > > --- a/drivers/gpu/drm/ttm/ttm_bo_util.c > > +++ b/drivers/gpu/drm/ttm/ttm_bo_util.c > > @@ -585,26 +585,70 @@ int ttm_bo_move_accel_cleanup(struct > > ttm_buffer_object *bo, > >  } > >  EXPORT_SYMBOL(ttm_bo_move_accel_cleanup); > > > > +/** > > + * ttm_bo_pipeline_gutting - purge the contents of a bo > > + * @bo: The buffer object > > + * > > + * Purge the contents of a bo, async if the bo is not idle. > > + * After a successful call, the bo is left unpopulated in > > + * system placement. The function may wait uninterruptible > > + * for idle on OOM. > > + * > > + * Return: 0 if successful, negative error code on failure. > > + */ > >  int ttm_bo_pipeline_gutting(struct ttm_buffer_object *bo) > >  { > >         static const struct ttm_place sys_mem = { .mem_type = > > TTM_PL_SYSTEM }; > >         struct ttm_buffer_object *ghost; > > +       struct ttm_tt *ttm; > >         int ret; > > > > -       ret = ttm_buffer_object_transfer(bo, &ghost); > > +       /* If already idle, no need for ghost object dance. */ > > +       ret = ttm_bo_wait(bo, false, true); > > +       if (ret != -EBUSY) { > > +               if (!bo->ttm) { > > +                       ret = ttm_tt_create(bo, true); > > Why do we now unconditionally add clearing? Below also. Here we've dropped the bo content and we add but do not populate a page vector. Now if someone resurrects this object we obtain new pages and those must be cleared, at least that's the intention. /Thomas 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=-13.8 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=ham 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 3D9EDC2B9F8 for ; Tue, 25 May 2021 13:37:39 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id E5F3B60FE8 for ; Tue, 25 May 2021 13:37:38 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org E5F3B60FE8 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=linux.intel.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=intel-gfx-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 7DA3489C96; Tue, 25 May 2021 13:37:38 +0000 (UTC) Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by gabe.freedesktop.org (Postfix) with ESMTPS id 39E3189C96; Tue, 25 May 2021 13:37:37 +0000 (UTC) IronPort-SDR: nel6YYkeB8QgMioWpFFmwBw6ig84PA3Nln+iJg9+614XeOm2xkjN4/3GqVDJp6B02ACjP7f+w9 Ti3RyjagcxLg== X-IronPort-AV: E=McAfee;i="6200,9189,9995"; a="202211187" X-IronPort-AV: E=Sophos;i="5.82,328,1613462400"; d="scan'208";a="202211187" Received: from orsmga001.jf.intel.com ([10.7.209.18]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 May 2021 06:37:32 -0700 IronPort-SDR: oeNNfTENPVKCqm0o3j/YOHMpdcM+XqG/TqNd6otZaGDXbIKwsUs/iRKp25e2WaLNp5U0aVJDXO DNZZ1paZhcVw== X-IronPort-AV: E=Sophos;i="5.82,328,1613462400"; d="scan'208";a="476426302" Received: from tmuluk-mobl.ger.corp.intel.com ([10.249.254.198]) by orsmga001-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 May 2021 06:37:29 -0700 Message-ID: <30dc2d316b643a07babbb3a985b6ff2bbf533345.camel@linux.intel.com> From: Thomas =?ISO-8859-1?Q?Hellstr=F6m?= To: Matthew Auld Date: Tue, 25 May 2021 15:37:27 +0200 In-Reply-To: References: <20210521153253.518037-1-thomas.hellstrom@linux.intel.com> <20210521153253.518037-10-thomas.hellstrom@linux.intel.com> User-Agent: Evolution 3.38.4 (3.38.4-1.fc33) MIME-Version: 1.0 Subject: Re: [Intel-gfx] [PATCH v3 09/12] drm/ttm: Document and optimize ttm_bo_pipeline_gutting() X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Intel Graphics Development , Christian =?ISO-8859-1?Q?K=F6nig?= , ML dri-devel Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" T24gVHVlLCAyMDIxLTA1LTI1IGF0IDEyOjAwICswMTAwLCBNYXR0aGV3IEF1bGQgd3JvdGU6Cj4g T24gRnJpLCAyMSBNYXkgMjAyMSBhdCAxNjozMywgVGhvbWFzIEhlbGxzdHLDtm0KPiA8dGhvbWFz LmhlbGxzdHJvbUBsaW51eC5pbnRlbC5jb20+IHdyb3RlOgo+ID4gCj4gPiBJZiB0aGUgYm8gaXMg aWRsZSB3aGVuIGNhbGxpbmcgdHRtX2JvX3BpcGVsaW5lX2d1dHRpbmcoKSwgd2UKPiA+IHVubmVj ZXNzYXJpbHkKPiA+IGNyZWF0ZSBhIGdob3N0IG9iamVjdCBhbmQgcHVzaCBpdCBvdXQgdG8gZGVs YXllZCBkZXN0cm95Lgo+ID4gRml4IHRoaXMgYnkgYWRkaW5nIGEgcGF0aCBmb3IgaWRsZSwgYW5k IGRvY3VtZW50IHRoZSBmdW5jdGlvbi4KPiA+IAo+ID4gQWxzbyBhdm9pZCBoYXZpbmcgdGhlIGJv IGVuZCB1cCBpbiBhIGJhZCBzdGF0ZSB2dWxuZXJhYmxlIHRvIHVzZXItCj4gPiBzcGFjZQo+ID4g dHJpZ2dlcmVkIGtlcm5lbCBCVUdzIGlmIHRoZSBjYWxsIHRvIHR0bV90dF9jcmVhdGUoKSBmYWls cy4KPiA+IAo+ID4gRmluYWxseSByZXVzZSB0dG1fYm9fcGlwZWxpbmVfZ3V0dGluZygpIGluIHR0 bV9ib19ldmljdCgpLgo+ID4gCj4gPiBDYzogQ2hyaXN0aWFuIEvDtm5pZyA8Y2hyaXN0aWFuLmtv ZW5pZ0BhbWQuY29tPgo+ID4gU2lnbmVkLW9mZi1ieTogVGhvbWFzIEhlbGxzdHLDtm0gPHRob21h cy5oZWxsc3Ryb21AbGludXguaW50ZWwuY29tPgo+ID4gLS0tCj4gPiDCoGRyaXZlcnMvZ3B1L2Ry bS90dG0vdHRtX2JvLmPCoMKgwqDCoMKgIHwgMjAgKysrKysrLS0tLS0tCj4gPiDCoGRyaXZlcnMv Z3B1L2RybS90dG0vdHRtX2JvX3V0aWwuYyB8IDUyCj4gPiArKysrKysrKysrKysrKysrKysrKysr KysrKysrLS0tCj4gPiDCoGRyaXZlcnMvZ3B1L2RybS90dG0vdHRtX3R0LmPCoMKgwqDCoMKgIHzC oCA1ICsrKwo+ID4gwqBpbmNsdWRlL2RybS90dG0vdHRtX3R0LmjCoMKgwqDCoMKgwqDCoMKgwqAg fCAxMCArKysrKysKPiA+IMKgNCBmaWxlcyBjaGFuZ2VkLCA3MyBpbnNlcnRpb25zKCspLCAxNCBk ZWxldGlvbnMoLSkKPiA+IAo+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRt X2JvLmMKPiA+IGIvZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fYm8uYwo+ID4gaW5kZXggY2ExYjA5 OGI2YTU2Li5hOGZhMzM3NWI4YWEgMTAwNjQ0Cj4gPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vdHRt L3R0bV9iby5jCj4gPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV9iby5jCj4gPiBAQCAt NTAxLDEwICs1MDEsMTUgQEAgc3RhdGljIGludCB0dG1fYm9fZXZpY3Qoc3RydWN0Cj4gPiB0dG1f YnVmZmVyX29iamVjdCAqYm8sCj4gPiDCoMKgwqDCoMKgwqDCoCBiZGV2LT5mdW5jcy0+ZXZpY3Rf ZmxhZ3MoYm8sICZwbGFjZW1lbnQpOwo+ID4gCj4gPiDCoMKgwqDCoMKgwqDCoCBpZiAoIXBsYWNl bWVudC5udW1fcGxhY2VtZW50ICYmCj4gPiAhcGxhY2VtZW50Lm51bV9idXN5X3BsYWNlbWVudCkg ewo+ID4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdHRtX2JvX3dhaXQoYm8sIGZhbHNl LCBmYWxzZSk7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXQgPSB0dG1fYm9f d2FpdChibywgdHJ1ZSwgZmFsc2UpOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg aWYgKHJldCkKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCByZXR1cm4gcmV0Owo+ID4gCj4gPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB0dG1f Ym9fY2xlYW51cF9tZW10eXBlX3VzZShibyk7Cj4gPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCByZXR1cm4gdHRtX3R0X2NyZWF0ZShibywgZmFsc2UpOwo+ID4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgLyoKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKiBT aW5jZSB3ZSd2ZSBhbHJlYWR5IHN5bmNlZCwgdGhpcyBmcmVlcyBiYWNraW5nCj4gPiBzdG9yZQo+ ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAqIGltbWVkaWF0ZWx5Lgo+ID4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAqLwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgcmV0dXJuIHR0bV9ib19waXBlbGluZV9ndXR0aW5nKGJvKTsKPiA+IMKgwqDCoMKg wqDCoMKgIH0KPiA+IAo+ID4gwqDCoMKgwqDCoMKgwqAgcmV0ID0gdHRtX2JvX21lbV9zcGFjZShi bywgJnBsYWNlbWVudCwgJmV2aWN0X21lbSwgY3R4KTsKPiA+IEBAIC05NzQsMTMgKzk3OSw4IEBA IGludCB0dG1fYm9fdmFsaWRhdGUoc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0Cj4gPiAqYm8sCj4g PiDCoMKgwqDCoMKgwqDCoCAvKgo+ID4gwqDCoMKgwqDCoMKgwqDCoCAqIFJlbW92ZSB0aGUgYmFj a2luZyBzdG9yZSBpZiBubyBwbGFjZW1lbnQgaXMgZ2l2ZW4uCj4gPiDCoMKgwqDCoMKgwqDCoMKg ICovCj4gPiAtwqDCoMKgwqDCoMKgIGlmICghcGxhY2VtZW50LT5udW1fcGxhY2VtZW50ICYmICFw bGFjZW1lbnQtCj4gPiA+bnVtX2J1c3lfcGxhY2VtZW50KSB7Cj4gPiAtwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCByZXQgPSB0dG1fYm9fcGlwZWxpbmVfZ3V0dGluZyhibyk7Cj4gPiAtwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAocmV0KQo+ID4gLcKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldHVybiByZXQ7Cj4gPiAtCj4gPiAtwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm4gdHRtX3R0X2NyZWF0ZShibywgZmFsc2UpOwo+ ID4gLcKgwqDCoMKgwqDCoCB9Cj4gPiArwqDCoMKgwqDCoMKgIGlmICghcGxhY2VtZW50LT5udW1f cGxhY2VtZW50ICYmICFwbGFjZW1lbnQtCj4gPiA+bnVtX2J1c3lfcGxhY2VtZW50KQo+ID4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0dXJuIHR0bV9ib19waXBlbGluZV9ndXR0aW5n KGJvKTsKPiA+IAo+ID4gwqDCoMKgwqDCoMKgwqAgLyoKPiA+IMKgwqDCoMKgwqDCoMKgwqAgKiBD aGVjayB3aGV0aGVyIHdlIG5lZWQgdG8gbW92ZSBidWZmZXIuCj4gPiBkaWZmIC0tZ2l0IGEvZHJp dmVycy9ncHUvZHJtL3R0bS90dG1fYm9fdXRpbC5jCj4gPiBiL2RyaXZlcnMvZ3B1L2RybS90dG0v dHRtX2JvX3V0aWwuYwo+ID4gaW5kZXggNGE3ZDNkNjcyZjlhLi43ZmE5YjNhODUyZWIgMTAwNjQ0 Cj4gPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV9ib191dGlsLmMKPiA+ICsrKyBiL2Ry aXZlcnMvZ3B1L2RybS90dG0vdHRtX2JvX3V0aWwuYwo+ID4gQEAgLTU4NSwyNiArNTg1LDcwIEBA IGludCB0dG1fYm9fbW92ZV9hY2NlbF9jbGVhbnVwKHN0cnVjdAo+ID4gdHRtX2J1ZmZlcl9vYmpl Y3QgKmJvLAo+ID4gwqB9Cj4gPiDCoEVYUE9SVF9TWU1CT0wodHRtX2JvX21vdmVfYWNjZWxfY2xl YW51cCk7Cj4gPiAKPiA+ICsvKioKPiA+ICsgKiB0dG1fYm9fcGlwZWxpbmVfZ3V0dGluZyAtIHB1 cmdlIHRoZSBjb250ZW50cyBvZiBhIGJvCj4gPiArICogQGJvOiBUaGUgYnVmZmVyIG9iamVjdAo+ ID4gKyAqCj4gPiArICogUHVyZ2UgdGhlIGNvbnRlbnRzIG9mIGEgYm8sIGFzeW5jIGlmIHRoZSBi byBpcyBub3QgaWRsZS4KPiA+ICsgKiBBZnRlciBhIHN1Y2Nlc3NmdWwgY2FsbCwgdGhlIGJvIGlz IGxlZnQgdW5wb3B1bGF0ZWQgaW4KPiA+ICsgKiBzeXN0ZW0gcGxhY2VtZW50LiBUaGUgZnVuY3Rp b24gbWF5IHdhaXQgdW5pbnRlcnJ1cHRpYmxlCj4gPiArICogZm9yIGlkbGUgb24gT09NLgo+ID4g KyAqCj4gPiArICogUmV0dXJuOiAwIGlmIHN1Y2Nlc3NmdWwsIG5lZ2F0aXZlIGVycm9yIGNvZGUg b24gZmFpbHVyZS4KPiA+ICsgKi8KPiA+IMKgaW50IHR0bV9ib19waXBlbGluZV9ndXR0aW5nKHN0 cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8pCj4gPiDCoHsKPiA+IMKgwqDCoMKgwqDCoMKgIHN0 YXRpYyBjb25zdCBzdHJ1Y3QgdHRtX3BsYWNlIHN5c19tZW0gPSB7IC5tZW1fdHlwZSA9Cj4gPiBU VE1fUExfU1lTVEVNIH07Cj4gPiDCoMKgwqDCoMKgwqDCoCBzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmpl Y3QgKmdob3N0Owo+ID4gK8KgwqDCoMKgwqDCoCBzdHJ1Y3QgdHRtX3R0ICp0dG07Cj4gPiDCoMKg wqDCoMKgwqDCoCBpbnQgcmV0Owo+ID4gCj4gPiAtwqDCoMKgwqDCoMKgIHJldCA9IHR0bV9idWZm ZXJfb2JqZWN0X3RyYW5zZmVyKGJvLCAmZ2hvc3QpOwo+ID4gK8KgwqDCoMKgwqDCoCAvKiBJZiBh bHJlYWR5IGlkbGUsIG5vIG5lZWQgZm9yIGdob3N0IG9iamVjdCBkYW5jZS4gKi8KPiA+ICvCoMKg wqDCoMKgwqAgcmV0ID0gdHRtX2JvX3dhaXQoYm8sIGZhbHNlLCB0cnVlKTsKPiA+ICvCoMKgwqDC oMKgwqAgaWYgKHJldCAhPSAtRUJVU1kpIHsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIGlmICghYm8tPnR0bSkgewo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIHJldCA9IHR0bV90dF9jcmVhdGUoYm8sIHRydWUpOwo+IAo+IFdoeSBkbyB3 ZSBub3cgdW5jb25kaXRpb25hbGx5IGFkZCBjbGVhcmluZz8gQmVsb3cgYWxzby4KCkhlcmUgd2Un dmUgZHJvcHBlZCB0aGUgYm8gY29udGVudCBhbmQgd2UgYWRkIGJ1dCBkbyBub3QgcG9wdWxhdGUg YSBwYWdlCnZlY3Rvci4gTm93IGlmIHNvbWVvbmUgcmVzdXJyZWN0cyB0aGlzIG9iamVjdCB3ZSBv YnRhaW4gbmV3IHBhZ2VzIGFuZAp0aG9zZSBtdXN0IGJlIGNsZWFyZWQsIGF0IGxlYXN0IHRoYXQn cyB0aGUgaW50ZW50aW9uLgoKL1Rob21hcwoKCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fXwpJbnRlbC1nZnggbWFpbGluZyBsaXN0CkludGVsLWdmeEBsaXN0 cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9s aXN0aW5mby9pbnRlbC1nZngK