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=-16.7 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,URIBL_BLOCKED,USER_AGENT_GIT 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 DCB13C4708E for ; Thu, 27 May 2021 14:47: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 A8F5160D07 for ; Thu, 27 May 2021 14:47:48 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org A8F5160D07 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 915486EE63; Thu, 27 May 2021 14:47:42 +0000 (UTC) Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by gabe.freedesktop.org (Postfix) with ESMTPS id CEC2B6F3DA; Thu, 27 May 2021 14:47:38 +0000 (UTC) IronPort-SDR: 4/GTy29PuzJzgDgwhaDjt75hrH9QGbkE6uBd+PfgIf7EeEuAJ2Ze5aT1AYSfA0eCC7kCcLECOb Ecl90th+K78A== X-IronPort-AV: E=McAfee;i="6200,9189,9996"; a="202515612" X-IronPort-AV: E=Sophos;i="5.82,334,1613462400"; d="scan'208";a="202515612" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by fmsmga103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 May 2021 07:47:38 -0700 IronPort-SDR: mWHu6VM9R+lcDRw3qCQ9DD0nAw8+LzXxP/OOIbZgpK4pBeTIzHXNYMKpp1yu1nbCMFj/z2tQeQ ZuI3YHqbGYtg== X-IronPort-AV: E=Sophos;i="5.82,334,1613462400"; d="scan'208";a="443597968" Received: from ibanaga-mobl.ger.corp.intel.com (HELO thellst-mobl1.intel.com) ([10.249.254.58]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 May 2021 07:47:37 -0700 From: =?UTF-8?q?Thomas=20Hellstr=C3=B6m?= To: intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org Subject: [PATCH v5 09/15] drm/ttm: Document and optimize ttm_bo_pipeline_gutting() Date: Thu, 27 May 2021 16:47:04 +0200 Message-Id: <20210527144710.1975553-10-thomas.hellstrom@linux.intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210527144710.1975553-1-thomas.hellstrom@linux.intel.com> References: <20210527144710.1975553-1-thomas.hellstrom@linux.intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 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: =?UTF-8?q?Thomas=20Hellstr=C3=B6m?= , =?UTF-8?q?Christian=20K=C3=B6nig?= Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" 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 Reviewed-by: Christian König --- v4: - Clarify why we mark bo for clearing after ttm_bo_pipeline_gutting() (Reported by Matthew Auld) v5: - Make ttm_tt_mark_for_clear() inline (Suggested by Christian König) --- drivers/gpu/drm/ttm/ttm_bo.c | 20 +++++------ drivers/gpu/drm/ttm/ttm_bo_util.c | 55 ++++++++++++++++++++++++++++--- include/drm/ttm/ttm_tt.h | 13 ++++++++ 3 files changed, 74 insertions(+), 14 deletions(-) diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c index 51a94fd63bd7..be0406466460 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); @@ -976,13 +981,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 a46f705ba78b..99819c68d8d2 100644 --- a/drivers/gpu/drm/ttm/ttm_bo_util.c +++ b/drivers/gpu/drm/ttm/ttm_bo_util.c @@ -565,26 +565,73 @@ 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) { + /* See comment below about clearing. */ + ret = ttm_tt_create(bo, true); + if (ret) + return ret; + } else { + ttm_tt_unpopulate(bo->bdev, bo->ttm); + if (bo->type == 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. If the bo subsequently gets + * resurrected, make sure it's cleared (if ttm_bo_type_device) + * to avoid leaking sensitive information to user-space. + */ + + ttm = bo->ttm; + bo->ttm = NULL; + ret = ttm_tt_create(bo, true); + swap(bo->ttm, ttm); if (ret) return ret; + ret = ttm_buffer_object_transfer(bo, &ghost); + if (ret) { + ttm_tt_destroy(bo->bdev, ttm); + return ret; + } + ret = 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 = NULL; - dma_resv_unlock(&ghost->base._resv); ttm_bo_put(ghost); + bo->ttm = ttm; + ttm_resource_alloc(bo, &sys_mem, &bo->mem); return 0; } diff --git a/include/drm/ttm/ttm_tt.h b/include/drm/ttm/ttm_tt.h index 3102059db726..818680c6a8ed 100644 --- a/include/drm/ttm/ttm_tt.h +++ b/include/drm/ttm/ttm_tt.h @@ -170,6 +170,19 @@ 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. + */ +static inline void ttm_tt_mark_for_clear(struct ttm_tt *ttm) +{ + ttm->page_flags |= TTM_PAGE_FLAG_ZERO_ALLOC; +} + void ttm_tt_mgr_init(unsigned long num_pages, unsigned long num_dma32_pages); struct ttm_kmap_iter *ttm_kmap_iter_tt_init(struct ttm_kmap_iter_tt *iter_tt, -- 2.31.1 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=-16.7 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,URIBL_BLOCKED,USER_AGENT_GIT 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 71CB2C4708B for ; Thu, 27 May 2021 14:47: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 3D13F6128B for ; Thu, 27 May 2021 14:47:46 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 3D13F6128B 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 E13BA6F3DA; Thu, 27 May 2021 14:47:40 +0000 (UTC) Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by gabe.freedesktop.org (Postfix) with ESMTPS id CEC2B6F3DA; Thu, 27 May 2021 14:47:38 +0000 (UTC) IronPort-SDR: 4/GTy29PuzJzgDgwhaDjt75hrH9QGbkE6uBd+PfgIf7EeEuAJ2Ze5aT1AYSfA0eCC7kCcLECOb Ecl90th+K78A== X-IronPort-AV: E=McAfee;i="6200,9189,9996"; a="202515612" X-IronPort-AV: E=Sophos;i="5.82,334,1613462400"; d="scan'208";a="202515612" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by fmsmga103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 May 2021 07:47:38 -0700 IronPort-SDR: mWHu6VM9R+lcDRw3qCQ9DD0nAw8+LzXxP/OOIbZgpK4pBeTIzHXNYMKpp1yu1nbCMFj/z2tQeQ ZuI3YHqbGYtg== X-IronPort-AV: E=Sophos;i="5.82,334,1613462400"; d="scan'208";a="443597968" Received: from ibanaga-mobl.ger.corp.intel.com (HELO thellst-mobl1.intel.com) ([10.249.254.58]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 May 2021 07:47:37 -0700 From: =?UTF-8?q?Thomas=20Hellstr=C3=B6m?= To: intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org Date: Thu, 27 May 2021 16:47:04 +0200 Message-Id: <20210527144710.1975553-10-thomas.hellstrom@linux.intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210527144710.1975553-1-thomas.hellstrom@linux.intel.com> References: <20210527144710.1975553-1-thomas.hellstrom@linux.intel.com> MIME-Version: 1.0 Subject: [Intel-gfx] [PATCH v5 09/15] 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: =?UTF-8?q?Thomas=20Hellstr=C3=B6m?= , =?UTF-8?q?Christian=20K=C3=B6nig?= Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" SWYgdGhlIGJvIGlzIGlkbGUgd2hlbiBjYWxsaW5nIHR0bV9ib19waXBlbGluZV9ndXR0aW5nKCks IHdlIHVubmVjZXNzYXJpbHkKY3JlYXRlIGEgZ2hvc3Qgb2JqZWN0IGFuZCBwdXNoIGl0IG91dCB0 byBkZWxheWVkIGRlc3Ryb3kuCkZpeCB0aGlzIGJ5IGFkZGluZyBhIHBhdGggZm9yIGlkbGUsIGFu ZCBkb2N1bWVudCB0aGUgZnVuY3Rpb24uCgpBbHNvIGF2b2lkIGhhdmluZyB0aGUgYm8gZW5kIHVw IGluIGEgYmFkIHN0YXRlIHZ1bG5lcmFibGUgdG8gdXNlci1zcGFjZQp0cmlnZ2VyZWQga2VybmVs IEJVR3MgaWYgdGhlIGNhbGwgdG8gdHRtX3R0X2NyZWF0ZSgpIGZhaWxzLgoKRmluYWxseSByZXVz ZSB0dG1fYm9fcGlwZWxpbmVfZ3V0dGluZygpIGluIHR0bV9ib19ldmljdCgpLgoKQ2M6IENocmlz dGlhbiBLw7ZuaWcgPGNocmlzdGlhbi5rb2VuaWdAYW1kLmNvbT4KU2lnbmVkLW9mZi1ieTogVGhv bWFzIEhlbGxzdHLDtm0gPHRob21hcy5oZWxsc3Ryb21AbGludXguaW50ZWwuY29tPgpSZXZpZXdl ZC1ieTogQ2hyaXN0aWFuIEvDtm5pZyA8Y2hyaXN0aWFuLmtvZW5pZ0BhbWQuY29tPgotLS0KdjQ6 Ci0gQ2xhcmlmeSB3aHkgd2UgbWFyayBibyBmb3IgY2xlYXJpbmcgYWZ0ZXIgdHRtX2JvX3BpcGVs aW5lX2d1dHRpbmcoKQogIChSZXBvcnRlZCBieSBNYXR0aGV3IEF1bGQpCnY1OgotIE1ha2UgdHRt X3R0X21hcmtfZm9yX2NsZWFyKCkgaW5saW5lIChTdWdnZXN0ZWQgYnkgQ2hyaXN0aWFuIEvDtm5p ZykKLS0tCiBkcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV9iby5jICAgICAgfCAyMCArKysrKy0tLS0t LQogZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fYm9fdXRpbC5jIHwgNTUgKysrKysrKysrKysrKysr KysrKysrKysrKysrKy0tLQogaW5jbHVkZS9kcm0vdHRtL3R0bV90dC5oICAgICAgICAgIHwgMTMg KysrKysrKysKIDMgZmlsZXMgY2hhbmdlZCwgNzQgaW5zZXJ0aW9ucygrKSwgMTQgZGVsZXRpb25z KC0pCgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fYm8uYyBiL2RyaXZlcnMv Z3B1L2RybS90dG0vdHRtX2JvLmMKaW5kZXggNTFhOTRmZDYzYmQ3Li5iZTA0MDY0NjY0NjAgMTAw NjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRtX2JvLmMKKysrIGIvZHJpdmVycy9ncHUv ZHJtL3R0bS90dG1fYm8uYwpAQCAtNTAxLDEwICs1MDEsMTUgQEAgc3RhdGljIGludCB0dG1fYm9f ZXZpY3Qoc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibywKIAliZGV2LT5mdW5jcy0+ZXZpY3Rf ZmxhZ3MoYm8sICZwbGFjZW1lbnQpOwogCiAJaWYgKCFwbGFjZW1lbnQubnVtX3BsYWNlbWVudCAm JiAhcGxhY2VtZW50Lm51bV9idXN5X3BsYWNlbWVudCkgewotCQl0dG1fYm9fd2FpdChibywgZmFs c2UsIGZhbHNlKTsKKwkJcmV0ID0gdHRtX2JvX3dhaXQoYm8sIHRydWUsIGZhbHNlKTsKKwkJaWYg KHJldCkKKwkJCXJldHVybiByZXQ7CiAKLQkJdHRtX2JvX2NsZWFudXBfbWVtdHlwZV91c2UoYm8p OwotCQlyZXR1cm4gdHRtX3R0X2NyZWF0ZShibywgZmFsc2UpOworCQkvKgorCQkgKiBTaW5jZSB3 ZSd2ZSBhbHJlYWR5IHN5bmNlZCwgdGhpcyBmcmVlcyBiYWNraW5nIHN0b3JlCisJCSAqIGltbWVk aWF0ZWx5LgorCQkgKi8KKwkJcmV0dXJuIHR0bV9ib19waXBlbGluZV9ndXR0aW5nKGJvKTsKIAl9 CiAKIAlyZXQgPSB0dG1fYm9fbWVtX3NwYWNlKGJvLCAmcGxhY2VtZW50LCAmZXZpY3RfbWVtLCBj dHgpOwpAQCAtOTc2LDEzICs5ODEsOCBAQCBpbnQgdHRtX2JvX3ZhbGlkYXRlKHN0cnVjdCB0dG1f YnVmZmVyX29iamVjdCAqYm8sCiAJLyoKIAkgKiBSZW1vdmUgdGhlIGJhY2tpbmcgc3RvcmUgaWYg bm8gcGxhY2VtZW50IGlzIGdpdmVuLgogCSAqLwotCWlmICghcGxhY2VtZW50LT5udW1fcGxhY2Vt ZW50ICYmICFwbGFjZW1lbnQtPm51bV9idXN5X3BsYWNlbWVudCkgewotCQlyZXQgPSB0dG1fYm9f cGlwZWxpbmVfZ3V0dGluZyhibyk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCi0JCXJl dHVybiB0dG1fdHRfY3JlYXRlKGJvLCBmYWxzZSk7Ci0JfQorCWlmICghcGxhY2VtZW50LT5udW1f cGxhY2VtZW50ICYmICFwbGFjZW1lbnQtPm51bV9idXN5X3BsYWNlbWVudCkKKwkJcmV0dXJuIHR0 bV9ib19waXBlbGluZV9ndXR0aW5nKGJvKTsKIAogCS8qCiAJICogQ2hlY2sgd2hldGhlciB3ZSBu ZWVkIHRvIG1vdmUgYnVmZmVyLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3R0bS90dG1f Ym9fdXRpbC5jIGIvZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fYm9fdXRpbC5jCmluZGV4IGE0NmY3 MDViYTc4Yi4uOTk4MTljNjhkOGQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0 bV9ib191dGlsLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fYm9fdXRpbC5jCkBAIC01 NjUsMjYgKzU2NSw3MyBAQCBpbnQgdHRtX2JvX21vdmVfYWNjZWxfY2xlYW51cChzdHJ1Y3QgdHRt X2J1ZmZlcl9vYmplY3QgKmJvLAogfQogRVhQT1JUX1NZTUJPTCh0dG1fYm9fbW92ZV9hY2NlbF9j bGVhbnVwKTsKIAorLyoqCisgKiB0dG1fYm9fcGlwZWxpbmVfZ3V0dGluZyAtIHB1cmdlIHRoZSBj b250ZW50cyBvZiBhIGJvCisgKiBAYm86IFRoZSBidWZmZXIgb2JqZWN0CisgKgorICogUHVyZ2Ug dGhlIGNvbnRlbnRzIG9mIGEgYm8sIGFzeW5jIGlmIHRoZSBibyBpcyBub3QgaWRsZS4KKyAqIEFm dGVyIGEgc3VjY2Vzc2Z1bCBjYWxsLCB0aGUgYm8gaXMgbGVmdCB1bnBvcHVsYXRlZCBpbgorICog c3lzdGVtIHBsYWNlbWVudC4gVGhlIGZ1bmN0aW9uIG1heSB3YWl0IHVuaW50ZXJydXB0aWJsZQor ICogZm9yIGlkbGUgb24gT09NLgorICoKKyAqIFJldHVybjogMCBpZiBzdWNjZXNzZnVsLCBuZWdh dGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi8KIGludCB0dG1fYm9fcGlwZWxpbmVfZ3V0 dGluZyhzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvKQogewogCXN0YXRpYyBjb25zdCBzdHJ1 Y3QgdHRtX3BsYWNlIHN5c19tZW0gPSB7IC5tZW1fdHlwZSA9IFRUTV9QTF9TWVNURU0gfTsKIAlz dHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmdob3N0OworCXN0cnVjdCB0dG1fdHQgKnR0bTsKIAlp bnQgcmV0OwogCi0JcmV0ID0gdHRtX2J1ZmZlcl9vYmplY3RfdHJhbnNmZXIoYm8sICZnaG9zdCk7 CisJLyogSWYgYWxyZWFkeSBpZGxlLCBubyBuZWVkIGZvciBnaG9zdCBvYmplY3QgZGFuY2UuICov CisJcmV0ID0gdHRtX2JvX3dhaXQoYm8sIGZhbHNlLCB0cnVlKTsKKwlpZiAocmV0ICE9IC1FQlVT WSkgeworCQlpZiAoIWJvLT50dG0pIHsKKwkJCS8qIFNlZSBjb21tZW50IGJlbG93IGFib3V0IGNs ZWFyaW5nLiAqLworCQkJcmV0ID0gdHRtX3R0X2NyZWF0ZShibywgdHJ1ZSk7CisJCQlpZiAocmV0 KQorCQkJCXJldHVybiByZXQ7CisJCX0gZWxzZSB7CisJCQl0dG1fdHRfdW5wb3B1bGF0ZShiby0+ YmRldiwgYm8tPnR0bSk7CisJCQlpZiAoYm8tPnR5cGUgPT0gdHRtX2JvX3R5cGVfZGV2aWNlKQor CQkJCXR0bV90dF9tYXJrX2Zvcl9jbGVhcihiby0+dHRtKTsKKwkJfQorCQl0dG1fcmVzb3VyY2Vf ZnJlZShibywgJmJvLT5tZW0pOworCQl0dG1fcmVzb3VyY2VfYWxsb2MoYm8sICZzeXNfbWVtLCAm Ym8tPm1lbSk7CisKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBXZSBuZWVkIGFuIHVucG9w dWxhdGVkIHR0bV90dCBhZnRlciBnaXZpbmcgb3VyIGN1cnJlbnQgb25lLAorCSAqIGlmIGFueSwg dG8gdGhlIGdob3N0IG9iamVjdC4gQW5kIHdlIGNhbid0IGFmZm9yZCB0byBmYWlsCisJICogY3Jl YXRpbmcgb25lICphZnRlciogdGhlIG9wZXJhdGlvbi4gSWYgdGhlIGJvIHN1YnNlcXVlbnRseSBn ZXRzCisJICogcmVzdXJyZWN0ZWQsIG1ha2Ugc3VyZSBpdCdzIGNsZWFyZWQgKGlmIHR0bV9ib190 eXBlX2RldmljZSkKKwkgKiB0byBhdm9pZCBsZWFraW5nIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbiB0 byB1c2VyLXNwYWNlLgorCSAqLworCisJdHRtID0gYm8tPnR0bTsKKwliby0+dHRtID0gTlVMTDsK KwlyZXQgPSB0dG1fdHRfY3JlYXRlKGJvLCB0cnVlKTsKKwlzd2FwKGJvLT50dG0sIHR0bSk7CiAJ aWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAorCXJldCA9IHR0bV9idWZmZXJfb2JqZWN0X3RyYW5z ZmVyKGJvLCAmZ2hvc3QpOworCWlmIChyZXQpIHsKKwkJdHRtX3R0X2Rlc3Ryb3koYm8tPmJkZXYs IHR0bSk7CisJCXJldHVybiByZXQ7CisJfQorCiAJcmV0ID0gZG1hX3Jlc3ZfY29weV9mZW5jZXMo Jmdob3N0LT5iYXNlLl9yZXN2LCBiby0+YmFzZS5yZXN2KTsKIAkvKiBMYXN0IHJlc29ydCwgd2Fp dCBmb3IgdGhlIEJPIHRvIGJlIGlkbGUgd2hlbiB3ZSBhcmUgT09NICovCiAJaWYgKHJldCkKIAkJ dHRtX2JvX3dhaXQoYm8sIGZhbHNlLCBmYWxzZSk7CiAKLQl0dG1fcmVzb3VyY2VfYWxsb2MoYm8s ICZzeXNfbWVtLCAmYm8tPm1lbSk7Ci0JYm8tPnR0bSA9IE5VTEw7Ci0KIAlkbWFfcmVzdl91bmxv Y2soJmdob3N0LT5iYXNlLl9yZXN2KTsKIAl0dG1fYm9fcHV0KGdob3N0KTsKKwliby0+dHRtID0g dHRtOworCXR0bV9yZXNvdXJjZV9hbGxvYyhibywgJnN5c19tZW0sICZiby0+bWVtKTsKIAogCXJl dHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vdHRtL3R0bV90dC5oIGIvaW5jbHVk ZS9kcm0vdHRtL3R0bV90dC5oCmluZGV4IDMxMDIwNTlkYjcyNi4uODE4NjgwYzZhOGVkIDEwMDY0 NAotLS0gYS9pbmNsdWRlL2RybS90dG0vdHRtX3R0LmgKKysrIGIvaW5jbHVkZS9kcm0vdHRtL3R0 bV90dC5oCkBAIC0xNzAsNiArMTcwLDE5IEBAIGludCB0dG1fdHRfcG9wdWxhdGUoc3RydWN0IHR0 bV9kZXZpY2UgKmJkZXYsIHN0cnVjdCB0dG1fdHQgKnR0bSwgc3RydWN0IHR0bV9vcGVyCiAgKi8K IHZvaWQgdHRtX3R0X3VucG9wdWxhdGUoc3RydWN0IHR0bV9kZXZpY2UgKmJkZXYsIHN0cnVjdCB0 dG1fdHQgKnR0bSk7CiAKKy8qKgorICogdHRtX3R0X21hcmtfZm9yX2NsZWFyIC0gTWFyayBwYWdl cyBmb3IgY2xlYXJpbmcgb24gcG9wdWxhdGUuCisgKgorICogQHR0bTogUG9pbnRlciB0byB0aGUg dHRtX3R0IHN0cnVjdHVyZQorICoKKyAqIE1hcmtzIHBhZ2VzIGZvciBjbGVhcmluZyBzbyB0aGF0 IHRoZSBuZXh0IHRpbWUgdGhlIHBhZ2UgdmVjdG9yIGlzCisgKiBwb3B1bGF0ZWQsIHRoZSBwYWdl cyB3aWxsIGJlIGNsZWFyZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB0dG1fdHRfbWFya19m b3JfY2xlYXIoc3RydWN0IHR0bV90dCAqdHRtKQoreworCXR0bS0+cGFnZV9mbGFncyB8PSBUVE1f UEFHRV9GTEFHX1pFUk9fQUxMT0M7Cit9CisKIHZvaWQgdHRtX3R0X21ncl9pbml0KHVuc2lnbmVk IGxvbmcgbnVtX3BhZ2VzLCB1bnNpZ25lZCBsb25nIG51bV9kbWEzMl9wYWdlcyk7CiAKIHN0cnVj dCB0dG1fa21hcF9pdGVyICp0dG1fa21hcF9pdGVyX3R0X2luaXQoc3RydWN0IHR0bV9rbWFwX2l0 ZXJfdHQgKml0ZXJfdHQsCi0tIAoyLjMxLjEKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fCkludGVsLWdmeCBtYWlsaW5nIGxpc3QKSW50ZWwtZ2Z4QGxpc3Rz LmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xp c3RpbmZvL2ludGVsLWdmeAo=