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=-10.5 required=3.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED,DKIM_INVALID,DKIM_SIGNED,FREEMAIL_FORGED_FROMDOMAIN, FREEMAIL_FROM,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 DB36DC2B9F8 for ; Tue, 25 May 2021 11:00:48 +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 A4F816141B for ; Tue, 25 May 2021 11:00:48 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org A4F816141B Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.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 3A3716E9EB; Tue, 25 May 2021 11:00:45 +0000 (UTC) Received: from mail-qk1-x729.google.com (mail-qk1-x729.google.com [IPv6:2607:f8b0:4864:20::729]) by gabe.freedesktop.org (Postfix) with ESMTPS id 440B66E9EB; Tue, 25 May 2021 11:00:36 +0000 (UTC) Received: by mail-qk1-x729.google.com with SMTP id h20so14400900qko.11; Tue, 25 May 2021 04:00:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=fe0fFM0KlKEWL7dBBw0CbsRMF0mqBewf+9uT7Tvf0no=; b=k5nHMOP4YGDRkVlfhK4viAQqD2z3iWYje7M37KlmtcetRasDU8Zc7YZoDq+paQvTp6 c7pY6/OXyxUr6kaeXDLUJQsiJwkCtSrhvNSx+PWdTHJIj3rO0CU6LdEbn5PCJ5RVRG32 DZEqUneYgknqNeshe3qOnd5Ay0fS6keWOpOKL2ee7uOrVkXtV83kBsWPaE232U8THC6w aUJpohsfQGNDAgmWosfO4tulfx6u2UXetZDDWlMepYiG7WP0h/FIQnmpAX1iTR2WLrel CWYfDYaJjLHAmNn7rRbmJxJ0D81OIzUvSKPtKEtjCGXVk7Nr1sSCNo7yYx1nhrFedeWR itPA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=fe0fFM0KlKEWL7dBBw0CbsRMF0mqBewf+9uT7Tvf0no=; b=R78VLRYikG1UVqIzmgC1qcLCUBPfr2r7n3pAniB/DRYFt0Q93yuaAe2EgHJvYj6xKU Eo8HrpkotEBkcR6pYK3ILc6DcF1DSkQCQ1CwofY+lphnk164V1CCJRw2XaQd0B1aQZCT A3TAuwrjPWOQM6RT1DQ4wmBu3yniHeQUZ7iVx6XM1rEQlhz/ojk5vc8fZ+eaWNLqHhNu cZr9+Po3X4joiPhMamdx6DS67dxsqNMf+VZhghZ/jY6zV8gfvDwm/Am0vgiyclXneLMy yQs1t7A2hyLZBO270NMkQifYQHJuFTJCeWTgiTxkXKPEmAaNaAEtXPOYKw9rO6LrVpyR COVg== X-Gm-Message-State: AOAM533Qhh6tR1Du/6PmIOhnagpUJcm4w7ovUuKmyimpi+mJRLn/QC4z Td7nt4tesy/XF3jLm3NYxMIoMn3HxqwUo8ThoHI= X-Google-Smtp-Source: ABdhPJwjbqIUthbMkl55OvlRxYb0AhMibU0S590s/GFQNe35xpXKl9Ns1DOdBTp2rATk1YviQ8xrtB9EM4mOU3BcQPc= X-Received: by 2002:a05:620a:b09:: with SMTP id t9mr36112672qkg.17.1621940435365; Tue, 25 May 2021 04:00:35 -0700 (PDT) MIME-Version: 1.0 References: <20210521153253.518037-1-thomas.hellstrom@linux.intel.com> <20210521153253.518037-10-thomas.hellstrom@linux.intel.com> In-Reply-To: <20210521153253.518037-10-thomas.hellstrom@linux.intel.com> From: Matthew Auld Date: Tue, 25 May 2021 12:00:08 +0100 Message-ID: Subject: Re: [Intel-gfx] [PATCH v3 09/12] drm/ttm: Document and optimize ttm_bo_pipeline_gutting() To: =?UTF-8?Q?Thomas_Hellstr=C3=B6m?= Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable 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 , =?UTF-8?Q?Christian_K=C3=B6nig?= , ML dri-devel Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" On Fri, 21 May 2021 at 16:33, Thomas Hellstr=C3=B6m wrote: > > If the bo is idle when calling ttm_bo_pipeline_gutting(), we unnecessaril= y > 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=C3=B6nig > Signed-off-by: Thomas Hellstr=C3=B6m > --- > 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 *b= o, > bdev->funcs->evict_flags(bo, &placement); > > if (!placement.num_placement && !placement.num_busy_placement) { > - ttm_bo_wait(bo, false, false); > + ret =3D 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 =3D 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 =3D 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_obj= ect *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 =3D { .mem_type =3D TTM_PL_= SYSTEM }; > struct ttm_buffer_object *ghost; > + struct ttm_tt *ttm; > int ret; > > - ret =3D ttm_buffer_object_transfer(bo, &ghost); > + /* If already idle, no need for ghost object dance. */ > + ret =3D ttm_bo_wait(bo, false, true); > + if (ret !=3D -EBUSY) { > + if (!bo->ttm) { > + ret =3D ttm_tt_create(bo, true); Why do we now unconditionally add clearing? Below also. > + if (ret) > + return ret; > + } else { > + ttm_tt_unpopulate(bo->bdev, bo->ttm); > + if (bo->type =3D=3D ttm_bo_type_device) > + ttm_tt_mark_for_clear(bo->ttm); > + } > + ttm_resource_free(bo, &bo->mem); > + ttm_resource_alloc(bo, &sys_mem, &bo->mem); > + > + return 0; > + } > + > + /* > + * We need an unpopulated ttm_tt after giving our current one, > + * if any, to the ghost object. And we can't afford to fail > + * creating one *after* the operation. > + */ > + > + ttm =3D bo->ttm; > + bo->ttm =3D NULL; > + ret =3D ttm_tt_create(bo, true); > + swap(bo->ttm, ttm); > if (ret) > return ret; > > + ret =3D ttm_buffer_object_transfer(bo, &ghost); > + if (ret) { > + ttm_tt_destroy(bo->bdev, ttm); > + return ret; > + } > + > ret =3D dma_resv_copy_fences(&ghost->base._resv, bo->base.resv); > /* Last resort, wait for the BO to be idle when we are OOM */ > if (ret) > ttm_bo_wait(bo, false, false); > > - ttm_resource_alloc(bo, &sys_mem, &bo->mem); > - bo->ttm =3D NULL; > - > dma_resv_unlock(&ghost->base._resv); > ttm_bo_put(ghost); > + bo->ttm =3D ttm; > + ttm_resource_alloc(bo, &sys_mem, &bo->mem); > > return 0; > } > diff --git a/drivers/gpu/drm/ttm/ttm_tt.c b/drivers/gpu/drm/ttm/ttm_tt.c > index 0e41227116b1..913b330a234b 100644 > --- a/drivers/gpu/drm/ttm/ttm_tt.c > +++ b/drivers/gpu/drm/ttm/ttm_tt.c > @@ -134,6 +134,11 @@ void ttm_tt_destroy_common(struct ttm_device *bdev, = struct ttm_tt *ttm) > } > EXPORT_SYMBOL(ttm_tt_destroy_common); > > +void ttm_tt_mark_for_clear(struct ttm_tt *ttm) > +{ > + ttm->page_flags |=3D TTM_PAGE_FLAG_ZERO_ALLOC; > +} > + > void ttm_tt_destroy(struct ttm_device *bdev, struct ttm_tt *ttm) > { > bdev->funcs->ttm_tt_destroy(bdev, ttm); > diff --git a/include/drm/ttm/ttm_tt.h b/include/drm/ttm/ttm_tt.h > index 3102059db726..daa9c4cf48bb 100644 > --- a/include/drm/ttm/ttm_tt.h > +++ b/include/drm/ttm/ttm_tt.h > @@ -170,6 +170,16 @@ int ttm_tt_populate(struct ttm_device *bdev, struct = ttm_tt *ttm, struct ttm_oper > */ > void ttm_tt_unpopulate(struct ttm_device *bdev, struct ttm_tt *ttm); > > +/** > + * ttm_tt_mark_for_clear - Mark pages for clearing on populate. > + * > + * @ttm: Pointer to the ttm_tt structure > + * > + * Marks pages for clearing so that the next time the page vector is > + * populated, the pages will be cleared. > + */ > +void ttm_tt_mark_for_clear(struct ttm_tt *ttm); > + > void ttm_tt_mgr_init(unsigned long num_pages, unsigned long num_dma32_pa= ges); > > struct ttm_kmap_iter *ttm_kmap_iter_tt_init(struct ttm_kmap_iter_tt *ite= r_tt, > -- > 2.31.1 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/intel-gfx 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=-10.5 required=3.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED,DKIM_INVALID,DKIM_SIGNED,FREEMAIL_FORGED_FROMDOMAIN, FREEMAIL_FROM,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 2545EC2B9F8 for ; Tue, 25 May 2021 11:00:46 +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 D745161284 for ; Tue, 25 May 2021 11:00:45 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org D745161284 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.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 31EA46E9E8; Tue, 25 May 2021 11:00:45 +0000 (UTC) Received: from mail-qk1-x729.google.com (mail-qk1-x729.google.com [IPv6:2607:f8b0:4864:20::729]) by gabe.freedesktop.org (Postfix) with ESMTPS id 440B66E9EB; Tue, 25 May 2021 11:00:36 +0000 (UTC) Received: by mail-qk1-x729.google.com with SMTP id h20so14400900qko.11; Tue, 25 May 2021 04:00:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=fe0fFM0KlKEWL7dBBw0CbsRMF0mqBewf+9uT7Tvf0no=; b=k5nHMOP4YGDRkVlfhK4viAQqD2z3iWYje7M37KlmtcetRasDU8Zc7YZoDq+paQvTp6 c7pY6/OXyxUr6kaeXDLUJQsiJwkCtSrhvNSx+PWdTHJIj3rO0CU6LdEbn5PCJ5RVRG32 DZEqUneYgknqNeshe3qOnd5Ay0fS6keWOpOKL2ee7uOrVkXtV83kBsWPaE232U8THC6w aUJpohsfQGNDAgmWosfO4tulfx6u2UXetZDDWlMepYiG7WP0h/FIQnmpAX1iTR2WLrel CWYfDYaJjLHAmNn7rRbmJxJ0D81OIzUvSKPtKEtjCGXVk7Nr1sSCNo7yYx1nhrFedeWR itPA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=fe0fFM0KlKEWL7dBBw0CbsRMF0mqBewf+9uT7Tvf0no=; b=R78VLRYikG1UVqIzmgC1qcLCUBPfr2r7n3pAniB/DRYFt0Q93yuaAe2EgHJvYj6xKU Eo8HrpkotEBkcR6pYK3ILc6DcF1DSkQCQ1CwofY+lphnk164V1CCJRw2XaQd0B1aQZCT A3TAuwrjPWOQM6RT1DQ4wmBu3yniHeQUZ7iVx6XM1rEQlhz/ojk5vc8fZ+eaWNLqHhNu cZr9+Po3X4joiPhMamdx6DS67dxsqNMf+VZhghZ/jY6zV8gfvDwm/Am0vgiyclXneLMy yQs1t7A2hyLZBO270NMkQifYQHJuFTJCeWTgiTxkXKPEmAaNaAEtXPOYKw9rO6LrVpyR COVg== X-Gm-Message-State: AOAM533Qhh6tR1Du/6PmIOhnagpUJcm4w7ovUuKmyimpi+mJRLn/QC4z Td7nt4tesy/XF3jLm3NYxMIoMn3HxqwUo8ThoHI= X-Google-Smtp-Source: ABdhPJwjbqIUthbMkl55OvlRxYb0AhMibU0S590s/GFQNe35xpXKl9Ns1DOdBTp2rATk1YviQ8xrtB9EM4mOU3BcQPc= X-Received: by 2002:a05:620a:b09:: with SMTP id t9mr36112672qkg.17.1621940435365; Tue, 25 May 2021 04:00:35 -0700 (PDT) MIME-Version: 1.0 References: <20210521153253.518037-1-thomas.hellstrom@linux.intel.com> <20210521153253.518037-10-thomas.hellstrom@linux.intel.com> In-Reply-To: <20210521153253.518037-10-thomas.hellstrom@linux.intel.com> From: Matthew Auld Date: Tue, 25 May 2021 12:00:08 +0100 Message-ID: To: =?UTF-8?Q?Thomas_Hellstr=C3=B6m?= 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 , =?UTF-8?Q?Christian_K=C3=B6nig?= , 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" T24gRnJpLCAyMSBNYXkgMjAyMSBhdCAxNjozMywgVGhvbWFzIEhlbGxzdHLDtm0KPHRob21hcy5o ZWxsc3Ryb21AbGludXguaW50ZWwuY29tPiB3cm90ZToKPgo+IElmIHRoZSBibyBpcyBpZGxlIHdo ZW4gY2FsbGluZyB0dG1fYm9fcGlwZWxpbmVfZ3V0dGluZygpLCB3ZSB1bm5lY2Vzc2FyaWx5Cj4g Y3JlYXRlIGEgZ2hvc3Qgb2JqZWN0IGFuZCBwdXNoIGl0IG91dCB0byBkZWxheWVkIGRlc3Ryb3ku Cj4gRml4IHRoaXMgYnkgYWRkaW5nIGEgcGF0aCBmb3IgaWRsZSwgYW5kIGRvY3VtZW50IHRoZSBm dW5jdGlvbi4KPgo+IEFsc28gYXZvaWQgaGF2aW5nIHRoZSBibyBlbmQgdXAgaW4gYSBiYWQgc3Rh dGUgdnVsbmVyYWJsZSB0byB1c2VyLXNwYWNlCj4gdHJpZ2dlcmVkIGtlcm5lbCBCVUdzIGlmIHRo ZSBjYWxsIHRvIHR0bV90dF9jcmVhdGUoKSBmYWlscy4KPgo+IEZpbmFsbHkgcmV1c2UgdHRtX2Jv X3BpcGVsaW5lX2d1dHRpbmcoKSBpbiB0dG1fYm9fZXZpY3QoKS4KPgo+IENjOiBDaHJpc3RpYW4g S8O2bmlnIDxjaHJpc3RpYW4ua29lbmlnQGFtZC5jb20+Cj4gU2lnbmVkLW9mZi1ieTogVGhvbWFz IEhlbGxzdHLDtm0gPHRob21hcy5oZWxsc3Ryb21AbGludXguaW50ZWwuY29tPgo+IC0tLQo+ICBk cml2ZXJzL2dwdS9kcm0vdHRtL3R0bV9iby5jICAgICAgfCAyMCArKysrKystLS0tLS0KPiAgZHJp dmVycy9ncHUvZHJtL3R0bS90dG1fYm9fdXRpbC5jIHwgNTIgKysrKysrKysrKysrKysrKysrKysr KysrKysrKy0tLQo+ICBkcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV90dC5jICAgICAgfCAgNSArKysK PiAgaW5jbHVkZS9kcm0vdHRtL3R0bV90dC5oICAgICAgICAgIHwgMTAgKysrKysrCj4gIDQgZmls ZXMgY2hhbmdlZCwgNzMgaW5zZXJ0aW9ucygrKSwgMTQgZGVsZXRpb25zKC0pCj4KPiBkaWZmIC0t Z2l0IGEvZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fYm8uYyBiL2RyaXZlcnMvZ3B1L2RybS90dG0v dHRtX2JvLmMKPiBpbmRleCBjYTFiMDk4YjZhNTYuLmE4ZmEzMzc1YjhhYSAxMDA2NDQKPiAtLS0g YS9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV9iby5jCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL3R0 bS90dG1fYm8uYwo+IEBAIC01MDEsMTAgKzUwMSwxNSBAQCBzdGF0aWMgaW50IHR0bV9ib19ldmlj dChzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvLAo+ICAgICAgICAgYmRldi0+ZnVuY3MtPmV2 aWN0X2ZsYWdzKGJvLCAmcGxhY2VtZW50KTsKPgo+ICAgICAgICAgaWYgKCFwbGFjZW1lbnQubnVt X3BsYWNlbWVudCAmJiAhcGxhY2VtZW50Lm51bV9idXN5X3BsYWNlbWVudCkgewo+IC0gICAgICAg ICAgICAgICB0dG1fYm9fd2FpdChibywgZmFsc2UsIGZhbHNlKTsKPiArICAgICAgICAgICAgICAg cmV0ID0gdHRtX2JvX3dhaXQoYm8sIHRydWUsIGZhbHNlKTsKPiArICAgICAgICAgICAgICAgaWYg KHJldCkKPiArICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0Owo+Cj4gLSAgICAgICAg ICAgICAgIHR0bV9ib19jbGVhbnVwX21lbXR5cGVfdXNlKGJvKTsKPiAtICAgICAgICAgICAgICAg cmV0dXJuIHR0bV90dF9jcmVhdGUoYm8sIGZhbHNlKTsKPiArICAgICAgICAgICAgICAgLyoKPiAr ICAgICAgICAgICAgICAgICogU2luY2Ugd2UndmUgYWxyZWFkeSBzeW5jZWQsIHRoaXMgZnJlZXMg YmFja2luZyBzdG9yZQo+ICsgICAgICAgICAgICAgICAgKiBpbW1lZGlhdGVseS4KPiArICAgICAg ICAgICAgICAgICovCj4gKyAgICAgICAgICAgICAgIHJldHVybiB0dG1fYm9fcGlwZWxpbmVfZ3V0 dGluZyhibyk7Cj4gICAgICAgICB9Cj4KPiAgICAgICAgIHJldCA9IHR0bV9ib19tZW1fc3BhY2Uo Ym8sICZwbGFjZW1lbnQsICZldmljdF9tZW0sIGN0eCk7Cj4gQEAgLTk3NCwxMyArOTc5LDggQEAg aW50IHR0bV9ib192YWxpZGF0ZShzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvLAo+ICAgICAg ICAgLyoKPiAgICAgICAgICAqIFJlbW92ZSB0aGUgYmFja2luZyBzdG9yZSBpZiBubyBwbGFjZW1l bnQgaXMgZ2l2ZW4uCj4gICAgICAgICAgKi8KPiAtICAgICAgIGlmICghcGxhY2VtZW50LT5udW1f cGxhY2VtZW50ICYmICFwbGFjZW1lbnQtPm51bV9idXN5X3BsYWNlbWVudCkgewo+IC0gICAgICAg ICAgICAgICByZXQgPSB0dG1fYm9fcGlwZWxpbmVfZ3V0dGluZyhibyk7Cj4gLSAgICAgICAgICAg ICAgIGlmIChyZXQpCj4gLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKPiAtCj4g LSAgICAgICAgICAgICAgIHJldHVybiB0dG1fdHRfY3JlYXRlKGJvLCBmYWxzZSk7Cj4gLSAgICAg ICB9Cj4gKyAgICAgICBpZiAoIXBsYWNlbWVudC0+bnVtX3BsYWNlbWVudCAmJiAhcGxhY2VtZW50 LT5udW1fYnVzeV9wbGFjZW1lbnQpCj4gKyAgICAgICAgICAgICAgIHJldHVybiB0dG1fYm9fcGlw ZWxpbmVfZ3V0dGluZyhibyk7Cj4KPiAgICAgICAgIC8qCj4gICAgICAgICAgKiBDaGVjayB3aGV0 aGVyIHdlIG5lZWQgdG8gbW92ZSBidWZmZXIuCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2Ry bS90dG0vdHRtX2JvX3V0aWwuYyBiL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRtX2JvX3V0aWwuYwo+ IGluZGV4IDRhN2QzZDY3MmY5YS4uN2ZhOWIzYTg1MmViIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMv Z3B1L2RybS90dG0vdHRtX2JvX3V0aWwuYwo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRt X2JvX3V0aWwuYwo+IEBAIC01ODUsMjYgKzU4NSw3MCBAQCBpbnQgdHRtX2JvX21vdmVfYWNjZWxf Y2xlYW51cChzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvLAo+ICB9Cj4gIEVYUE9SVF9TWU1C T0wodHRtX2JvX21vdmVfYWNjZWxfY2xlYW51cCk7Cj4KPiArLyoqCj4gKyAqIHR0bV9ib19waXBl bGluZV9ndXR0aW5nIC0gcHVyZ2UgdGhlIGNvbnRlbnRzIG9mIGEgYm8KPiArICogQGJvOiBUaGUg YnVmZmVyIG9iamVjdAo+ICsgKgo+ICsgKiBQdXJnZSB0aGUgY29udGVudHMgb2YgYSBibywgYXN5 bmMgaWYgdGhlIGJvIGlzIG5vdCBpZGxlLgo+ICsgKiBBZnRlciBhIHN1Y2Nlc3NmdWwgY2FsbCwg dGhlIGJvIGlzIGxlZnQgdW5wb3B1bGF0ZWQgaW4KPiArICogc3lzdGVtIHBsYWNlbWVudC4gVGhl IGZ1bmN0aW9uIG1heSB3YWl0IHVuaW50ZXJydXB0aWJsZQo+ICsgKiBmb3IgaWRsZSBvbiBPT00u Cj4gKyAqCj4gKyAqIFJldHVybjogMCBpZiBzdWNjZXNzZnVsLCBuZWdhdGl2ZSBlcnJvciBjb2Rl IG9uIGZhaWx1cmUuCj4gKyAqLwo+ICBpbnQgdHRtX2JvX3BpcGVsaW5lX2d1dHRpbmcoc3RydWN0 IHR0bV9idWZmZXJfb2JqZWN0ICpibykKPiAgewo+ICAgICAgICAgc3RhdGljIGNvbnN0IHN0cnVj dCB0dG1fcGxhY2Ugc3lzX21lbSA9IHsgLm1lbV90eXBlID0gVFRNX1BMX1NZU1RFTSB9Owo+ICAg ICAgICAgc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpnaG9zdDsKPiArICAgICAgIHN0cnVjdCB0 dG1fdHQgKnR0bTsKPiAgICAgICAgIGludCByZXQ7Cj4KPiAtICAgICAgIHJldCA9IHR0bV9idWZm ZXJfb2JqZWN0X3RyYW5zZmVyKGJvLCAmZ2hvc3QpOwo+ICsgICAgICAgLyogSWYgYWxyZWFkeSBp ZGxlLCBubyBuZWVkIGZvciBnaG9zdCBvYmplY3QgZGFuY2UuICovCj4gKyAgICAgICByZXQgPSB0 dG1fYm9fd2FpdChibywgZmFsc2UsIHRydWUpOwo+ICsgICAgICAgaWYgKHJldCAhPSAtRUJVU1kp IHsKPiArICAgICAgICAgICAgICAgaWYgKCFiby0+dHRtKSB7Cj4gKyAgICAgICAgICAgICAgICAg ICAgICAgcmV0ID0gdHRtX3R0X2NyZWF0ZShibywgdHJ1ZSk7CgpXaHkgZG8gd2Ugbm93IHVuY29u ZGl0aW9uYWxseSBhZGQgY2xlYXJpbmc/IEJlbG93IGFsc28uCgo+ICsgICAgICAgICAgICAgICAg ICAgICAgIGlmIChyZXQpCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4g cmV0Owo+ICsgICAgICAgICAgICAgICB9IGVsc2Ugewo+ICsgICAgICAgICAgICAgICAgICAgICAg IHR0bV90dF91bnBvcHVsYXRlKGJvLT5iZGV2LCBiby0+dHRtKTsKPiArICAgICAgICAgICAgICAg ICAgICAgICBpZiAoYm8tPnR5cGUgPT0gdHRtX2JvX3R5cGVfZGV2aWNlKQo+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgdHRtX3R0X21hcmtfZm9yX2NsZWFyKGJvLT50dG0pOwo+ICsg ICAgICAgICAgICAgICB9Cj4gKyAgICAgICAgICAgICAgIHR0bV9yZXNvdXJjZV9mcmVlKGJvLCAm Ym8tPm1lbSk7Cj4gKyAgICAgICAgICAgICAgIHR0bV9yZXNvdXJjZV9hbGxvYyhibywgJnN5c19t ZW0sICZiby0+bWVtKTsKPiArCj4gKyAgICAgICAgICAgICAgIHJldHVybiAwOwo+ICsgICAgICAg fQo+ICsKPiArICAgICAgIC8qCj4gKyAgICAgICAgKiBXZSBuZWVkIGFuIHVucG9wdWxhdGVkIHR0 bV90dCBhZnRlciBnaXZpbmcgb3VyIGN1cnJlbnQgb25lLAo+ICsgICAgICAgICogaWYgYW55LCB0 byB0aGUgZ2hvc3Qgb2JqZWN0LiBBbmQgd2UgY2FuJ3QgYWZmb3JkIHRvIGZhaWwKPiArICAgICAg ICAqIGNyZWF0aW5nIG9uZSAqYWZ0ZXIqIHRoZSBvcGVyYXRpb24uCj4gKyAgICAgICAgKi8KPiAr Cj4gKyAgICAgICB0dG0gPSBiby0+dHRtOwo+ICsgICAgICAgYm8tPnR0bSA9IE5VTEw7Cj4gKyAg ICAgICByZXQgPSB0dG1fdHRfY3JlYXRlKGJvLCB0cnVlKTsKPiArICAgICAgIHN3YXAoYm8tPnR0 bSwgdHRtKTsKPiAgICAgICAgIGlmIChyZXQpCj4gICAgICAgICAgICAgICAgIHJldHVybiByZXQ7 Cj4KPiArICAgICAgIHJldCA9IHR0bV9idWZmZXJfb2JqZWN0X3RyYW5zZmVyKGJvLCAmZ2hvc3Qp Owo+ICsgICAgICAgaWYgKHJldCkgewo+ICsgICAgICAgICAgICAgICB0dG1fdHRfZGVzdHJveShi by0+YmRldiwgdHRtKTsKPiArICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKPiArICAgICAgIH0K PiArCj4gICAgICAgICByZXQgPSBkbWFfcmVzdl9jb3B5X2ZlbmNlcygmZ2hvc3QtPmJhc2UuX3Jl c3YsIGJvLT5iYXNlLnJlc3YpOwo+ICAgICAgICAgLyogTGFzdCByZXNvcnQsIHdhaXQgZm9yIHRo ZSBCTyB0byBiZSBpZGxlIHdoZW4gd2UgYXJlIE9PTSAqLwo+ICAgICAgICAgaWYgKHJldCkKPiAg ICAgICAgICAgICAgICAgdHRtX2JvX3dhaXQoYm8sIGZhbHNlLCBmYWxzZSk7Cj4KPiAtICAgICAg IHR0bV9yZXNvdXJjZV9hbGxvYyhibywgJnN5c19tZW0sICZiby0+bWVtKTsKPiAtICAgICAgIGJv LT50dG0gPSBOVUxMOwo+IC0KPiAgICAgICAgIGRtYV9yZXN2X3VubG9jaygmZ2hvc3QtPmJhc2Uu X3Jlc3YpOwo+ICAgICAgICAgdHRtX2JvX3B1dChnaG9zdCk7Cj4gKyAgICAgICBiby0+dHRtID0g dHRtOwo+ICsgICAgICAgdHRtX3Jlc291cmNlX2FsbG9jKGJvLCAmc3lzX21lbSwgJmJvLT5tZW0p Owo+Cj4gICAgICAgICByZXR1cm4gMDsKPiAgfQo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9k cm0vdHRtL3R0bV90dC5jIGIvZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fdHQuYwo+IGluZGV4IDBl NDEyMjcxMTZiMS4uOTEzYjMzMGEyMzRiIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS90 dG0vdHRtX3R0LmMKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV90dC5jCj4gQEAgLTEz NCw2ICsxMzQsMTEgQEAgdm9pZCB0dG1fdHRfZGVzdHJveV9jb21tb24oc3RydWN0IHR0bV9kZXZp Y2UgKmJkZXYsIHN0cnVjdCB0dG1fdHQgKnR0bSkKPiAgfQo+ICBFWFBPUlRfU1lNQk9MKHR0bV90 dF9kZXN0cm95X2NvbW1vbik7Cj4KPiArdm9pZCB0dG1fdHRfbWFya19mb3JfY2xlYXIoc3RydWN0 IHR0bV90dCAqdHRtKQo+ICt7Cj4gKyAgICAgICB0dG0tPnBhZ2VfZmxhZ3MgfD0gVFRNX1BBR0Vf RkxBR19aRVJPX0FMTE9DOwo+ICt9Cj4gKwo+ICB2b2lkIHR0bV90dF9kZXN0cm95KHN0cnVjdCB0 dG1fZGV2aWNlICpiZGV2LCBzdHJ1Y3QgdHRtX3R0ICp0dG0pCj4gIHsKPiAgICAgICAgIGJkZXYt PmZ1bmNzLT50dG1fdHRfZGVzdHJveShiZGV2LCB0dG0pOwo+IGRpZmYgLS1naXQgYS9pbmNsdWRl L2RybS90dG0vdHRtX3R0LmggYi9pbmNsdWRlL2RybS90dG0vdHRtX3R0LmgKPiBpbmRleCAzMTAy MDU5ZGI3MjYuLmRhYTljNGNmNDhiYiAxMDA2NDQKPiAtLS0gYS9pbmNsdWRlL2RybS90dG0vdHRt X3R0LmgKPiArKysgYi9pbmNsdWRlL2RybS90dG0vdHRtX3R0LmgKPiBAQCAtMTcwLDYgKzE3MCwx NiBAQCBpbnQgdHRtX3R0X3BvcHVsYXRlKHN0cnVjdCB0dG1fZGV2aWNlICpiZGV2LCBzdHJ1Y3Qg dHRtX3R0ICp0dG0sIHN0cnVjdCB0dG1fb3Blcgo+ICAgKi8KPiAgdm9pZCB0dG1fdHRfdW5wb3B1 bGF0ZShzdHJ1Y3QgdHRtX2RldmljZSAqYmRldiwgc3RydWN0IHR0bV90dCAqdHRtKTsKPgo+ICsv KioKPiArICogdHRtX3R0X21hcmtfZm9yX2NsZWFyIC0gTWFyayBwYWdlcyBmb3IgY2xlYXJpbmcg b24gcG9wdWxhdGUuCj4gKyAqCj4gKyAqIEB0dG06IFBvaW50ZXIgdG8gdGhlIHR0bV90dCBzdHJ1 Y3R1cmUKPiArICoKPiArICogTWFya3MgcGFnZXMgZm9yIGNsZWFyaW5nIHNvIHRoYXQgdGhlIG5l eHQgdGltZSB0aGUgcGFnZSB2ZWN0b3IgaXMKPiArICogcG9wdWxhdGVkLCB0aGUgcGFnZXMgd2ls bCBiZSBjbGVhcmVkLgo+ICsgKi8KPiArdm9pZCB0dG1fdHRfbWFya19mb3JfY2xlYXIoc3RydWN0 IHR0bV90dCAqdHRtKTsKPiArCj4gIHZvaWQgdHRtX3R0X21ncl9pbml0KHVuc2lnbmVkIGxvbmcg bnVtX3BhZ2VzLCB1bnNpZ25lZCBsb25nIG51bV9kbWEzMl9wYWdlcyk7Cj4KPiAgc3RydWN0IHR0 bV9rbWFwX2l0ZXIgKnR0bV9rbWFwX2l0ZXJfdHRfaW5pdChzdHJ1Y3QgdHRtX2ttYXBfaXRlcl90 dCAqaXRlcl90dCwKPiAtLQo+IDIuMzEuMQo+Cj4gX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX18KPiBJbnRlbC1nZnggbWFpbGluZyBsaXN0Cj4gSW50ZWwtZ2Z4 QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwo+IGh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21h aWxtYW4vbGlzdGluZm8vaW50ZWwtZ2Z4Cl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fCkludGVsLWdmeCBtYWlsaW5nIGxpc3QKSW50ZWwtZ2Z4QGxpc3RzLmZy ZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3Rp bmZvL2ludGVsLWdmeAo=