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.8 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,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 2BBE9C433B4 for ; Thu, 20 May 2021 15:10:51 +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 ED015611ED for ; Thu, 20 May 2021 15:10:50 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org ED015611ED 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 822876F47E; Thu, 20 May 2021 15:10:41 +0000 (UTC) Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by gabe.freedesktop.org (Postfix) with ESMTPS id 8B8C36E222; Thu, 20 May 2021 15:10:39 +0000 (UTC) IronPort-SDR: +/X7bcty0zXF6mtjyrXOBEZuXwDozxjIOWImHz52BqMm+AiOUxXeHG6xCLHgEae8Ds+csIvlLt xdmVx7yqYuBQ== X-IronPort-AV: E=McAfee;i="6200,9189,9989"; a="222341214" X-IronPort-AV: E=Sophos;i="5.82,313,1613462400"; d="scan'208";a="222341214" Received: from orsmga006.jf.intel.com ([10.7.209.51]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 20 May 2021 08:10:06 -0700 IronPort-SDR: /9hSwakneEPVnVDZhXNKI70+o49IW/xXCgRkt/WNJajpddL6blTd7hS97+wX27Jhw7Uh9t/0G7 Fg/FPDJ1+0Vg== X-IronPort-AV: E=Sophos;i="5.82,313,1613462400"; d="scan'208";a="395728200" Received: from cbjoerns-mobl1.ger.corp.intel.com (HELO thellst-mobl1.intel.com) ([10.249.254.247]) by orsmga006-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 20 May 2021 08:10:05 -0700 From: =?UTF-8?q?Thomas=20Hellstr=C3=B6m?= To: intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org Subject: [RFC PATCH 4/5] drm/ttm: Document and optimize ttm_bo_pipeline_gutting() Date: Thu, 20 May 2021 17:09:46 +0200 Message-Id: <20210520150947.803891-5-thomas.hellstrom@linux.intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210520150947.803891-1-thomas.hellstrom@linux.intel.com> References: <20210520150947.803891-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 --- drivers/gpu/drm/ttm/ttm_bo.c | 20 +++++----- drivers/gpu/drm/ttm/ttm_bo_util.c | 63 ++++++++++++++++++++++++------- drivers/gpu/drm/ttm/ttm_tt.c | 5 +++ include/drm/ttm/ttm_tt.h | 10 +++++ 4 files changed, 75 insertions(+), 23 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 919ee03f7eb3..1860e2e7563f 100644 --- a/drivers/gpu/drm/ttm/ttm_bo_util.c +++ b/drivers/gpu/drm/ttm/ttm_bo_util.c @@ -479,7 +479,8 @@ static void ttm_transfered_destroy(struct ttm_buffer_object *bo) */ static int ttm_buffer_object_transfer(struct ttm_buffer_object *bo, - struct ttm_buffer_object **new_obj) + struct ttm_buffer_object **new_obj, + bool realloc_tt) { struct ttm_transfer_obj *fbo; int ret; @@ -493,6 +494,17 @@ static int ttm_buffer_object_transfer(struct ttm_buffer_object *bo, ttm_bo_get(bo); fbo->bo = bo; + if (realloc_tt) { + bo->ttm = NULL; + ret = ttm_tt_create(bo, true); + if (ret) { + bo->ttm = fbo->base.ttm; + kfree(fbo); + ttm_bo_put(bo); + return ret; + } + } + /** * Fix up members that we shouldn't copy directly: * TODO: Explicit member copy would probably be better here. @@ -763,7 +775,7 @@ static int ttm_bo_move_to_ghost(struct ttm_buffer_object *bo, dma_fence_put(bo->moving); bo->moving = dma_fence_get(fence); - ret = ttm_buffer_object_transfer(bo, &ghost_obj); + ret = ttm_buffer_object_transfer(bo, &ghost_obj, false); if (ret) return ret; @@ -836,26 +848,51 @@ 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; int ret; - ret = ttm_buffer_object_transfer(bo, &ghost); - if (ret) - return ret; + /* If already idle, no need for ghost object dance. */ + ret = ttm_bo_wait(bo, false, true); + if (ret == -EBUSY) { + ret = ttm_buffer_object_transfer(bo, &ghost, true); + if (ret) + 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); + 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); + } else { + if (!bo->ttm) { + 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); + } - dma_resv_unlock(&ghost->base._resv); - ttm_bo_put(ghost); + 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 539e0232cb3b..0b1053e93db2 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 |= 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 134d09ef7766..91552c83ac79 100644 --- a/include/drm/ttm/ttm_tt.h +++ b/include/drm/ttm/ttm_tt.h @@ -157,6 +157,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_pages); #if IS_ENABLED(CONFIG_AGP) -- 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.8 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,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 EA5F6C43461 for ; Thu, 20 May 2021 15:10:56 +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 B1F46611ED for ; Thu, 20 May 2021 15:10:56 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org B1F46611ED 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 90C976F47D; Thu, 20 May 2021 15:10:43 +0000 (UTC) Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by gabe.freedesktop.org (Postfix) with ESMTPS id 8B8C36E222; Thu, 20 May 2021 15:10:39 +0000 (UTC) IronPort-SDR: +/X7bcty0zXF6mtjyrXOBEZuXwDozxjIOWImHz52BqMm+AiOUxXeHG6xCLHgEae8Ds+csIvlLt xdmVx7yqYuBQ== X-IronPort-AV: E=McAfee;i="6200,9189,9989"; a="222341214" X-IronPort-AV: E=Sophos;i="5.82,313,1613462400"; d="scan'208";a="222341214" Received: from orsmga006.jf.intel.com ([10.7.209.51]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 20 May 2021 08:10:06 -0700 IronPort-SDR: /9hSwakneEPVnVDZhXNKI70+o49IW/xXCgRkt/WNJajpddL6blTd7hS97+wX27Jhw7Uh9t/0G7 Fg/FPDJ1+0Vg== X-IronPort-AV: E=Sophos;i="5.82,313,1613462400"; d="scan'208";a="395728200" Received: from cbjoerns-mobl1.ger.corp.intel.com (HELO thellst-mobl1.intel.com) ([10.249.254.247]) by orsmga006-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 20 May 2021 08:10:05 -0700 From: =?UTF-8?q?Thomas=20Hellstr=C3=B6m?= To: intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org Date: Thu, 20 May 2021 17:09:46 +0200 Message-Id: <20210520150947.803891-5-thomas.hellstrom@linux.intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210520150947.803891-1-thomas.hellstrom@linux.intel.com> References: <20210520150947.803891-1-thomas.hellstrom@linux.intel.com> MIME-Version: 1.0 Subject: [Intel-gfx] [RFC PATCH 4/5] 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 bWFzIEhlbGxzdHLDtm0gPHRob21hcy5oZWxsc3Ryb21AbGludXguaW50ZWwuY29tPgotLS0KIGRy aXZlcnMvZ3B1L2RybS90dG0vdHRtX2JvLmMgICAgICB8IDIwICsrKysrLS0tLS0KIGRyaXZlcnMv Z3B1L2RybS90dG0vdHRtX2JvX3V0aWwuYyB8IDYzICsrKysrKysrKysrKysrKysrKysrKysrKy0t LS0tLS0KIGRyaXZlcnMvZ3B1L2RybS90dG0vdHRtX3R0LmMgICAgICB8ICA1ICsrKwogaW5jbHVk ZS9kcm0vdHRtL3R0bV90dC5oICAgICAgICAgIHwgMTAgKysrKysKIDQgZmlsZXMgY2hhbmdlZCwg NzUgaW5zZXJ0aW9ucygrKSwgMjMgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9n cHUvZHJtL3R0bS90dG1fYm8uYyBiL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRtX2JvLmMKaW5kZXgg Y2ExYjA5OGI2YTU2Li5hOGZhMzM3NWI4YWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS90 dG0vdHRtX2JvLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fYm8uYwpAQCAtNTAxLDEw ICs1MDEsMTUgQEAgc3RhdGljIGludCB0dG1fYm9fZXZpY3Qoc3RydWN0IHR0bV9idWZmZXJfb2Jq ZWN0ICpibywKIAliZGV2LT5mdW5jcy0+ZXZpY3RfZmxhZ3MoYm8sICZwbGFjZW1lbnQpOwogCiAJ aWYgKCFwbGFjZW1lbnQubnVtX3BsYWNlbWVudCAmJiAhcGxhY2VtZW50Lm51bV9idXN5X3BsYWNl bWVudCkgewotCQl0dG1fYm9fd2FpdChibywgZmFsc2UsIGZhbHNlKTsKKwkJcmV0ID0gdHRtX2Jv X3dhaXQoYm8sIHRydWUsIGZhbHNlKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CiAKLQkJ dHRtX2JvX2NsZWFudXBfbWVtdHlwZV91c2UoYm8pOwotCQlyZXR1cm4gdHRtX3R0X2NyZWF0ZShi bywgZmFsc2UpOworCQkvKgorCQkgKiBTaW5jZSB3ZSd2ZSBhbHJlYWR5IHN5bmNlZCwgdGhpcyBm cmVlcyBiYWNraW5nIHN0b3JlCisJCSAqIGltbWVkaWF0ZWx5LgorCQkgKi8KKwkJcmV0dXJuIHR0 bV9ib19waXBlbGluZV9ndXR0aW5nKGJvKTsKIAl9CiAKIAlyZXQgPSB0dG1fYm9fbWVtX3NwYWNl KGJvLCAmcGxhY2VtZW50LCAmZXZpY3RfbWVtLCBjdHgpOwpAQCAtOTc0LDEzICs5NzksOCBAQCBp bnQgdHRtX2JvX3ZhbGlkYXRlKHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8sCiAJLyoKIAkg KiBSZW1vdmUgdGhlIGJhY2tpbmcgc3RvcmUgaWYgbm8gcGxhY2VtZW50IGlzIGdpdmVuLgogCSAq LwotCWlmICghcGxhY2VtZW50LT5udW1fcGxhY2VtZW50ICYmICFwbGFjZW1lbnQtPm51bV9idXN5 X3BsYWNlbWVudCkgewotCQlyZXQgPSB0dG1fYm9fcGlwZWxpbmVfZ3V0dGluZyhibyk7Ci0JCWlm IChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCi0JCXJldHVybiB0dG1fdHRfY3JlYXRlKGJvLCBmYWxz ZSk7Ci0JfQorCWlmICghcGxhY2VtZW50LT5udW1fcGxhY2VtZW50ICYmICFwbGFjZW1lbnQtPm51 bV9idXN5X3BsYWNlbWVudCkKKwkJcmV0dXJuIHR0bV9ib19waXBlbGluZV9ndXR0aW5nKGJvKTsK IAogCS8qCiAJICogQ2hlY2sgd2hldGhlciB3ZSBuZWVkIHRvIG1vdmUgYnVmZmVyLgpkaWZmIC0t Z2l0IGEvZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fYm9fdXRpbC5jIGIvZHJpdmVycy9ncHUvZHJt L3R0bS90dG1fYm9fdXRpbC5jCmluZGV4IDkxOWVlMDNmN2ViMy4uMTg2MGUyZTc1NjNmIDEwMDY0 NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV9ib191dGlsLmMKKysrIGIvZHJpdmVycy9n cHUvZHJtL3R0bS90dG1fYm9fdXRpbC5jCkBAIC00NzksNyArNDc5LDggQEAgc3RhdGljIHZvaWQg dHRtX3RyYW5zZmVyZWRfZGVzdHJveShzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvKQogICov CiAKIHN0YXRpYyBpbnQgdHRtX2J1ZmZlcl9vYmplY3RfdHJhbnNmZXIoc3RydWN0IHR0bV9idWZm ZXJfb2JqZWN0ICpibywKLQkJCQkgICAgICBzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKipuZXdf b2JqKQorCQkJCSAgICAgIHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqKm5ld19vYmosCisJCQkJ ICAgICAgYm9vbCByZWFsbG9jX3R0KQogewogCXN0cnVjdCB0dG1fdHJhbnNmZXJfb2JqICpmYm87 CiAJaW50IHJldDsKQEAgLTQ5Myw2ICs0OTQsMTcgQEAgc3RhdGljIGludCB0dG1fYnVmZmVyX29i amVjdF90cmFuc2ZlcihzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvLAogCXR0bV9ib19nZXQo Ym8pOwogCWZiby0+Ym8gPSBibzsKIAorCWlmIChyZWFsbG9jX3R0KSB7CisJCWJvLT50dG0gPSBO VUxMOworCQlyZXQgPSB0dG1fdHRfY3JlYXRlKGJvLCB0cnVlKTsKKwkJaWYgKHJldCkgeworCQkJ Ym8tPnR0bSA9IGZiby0+YmFzZS50dG07CisJCQlrZnJlZShmYm8pOworCQkJdHRtX2JvX3B1dChi byk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCiAJLyoqCiAJICogRml4IHVwIG1lbWJlcnMg dGhhdCB3ZSBzaG91bGRuJ3QgY29weSBkaXJlY3RseToKIAkgKiBUT0RPOiBFeHBsaWNpdCBtZW1i ZXIgY29weSB3b3VsZCBwcm9iYWJseSBiZSBiZXR0ZXIgaGVyZS4KQEAgLTc2Myw3ICs3NzUsNyBA QCBzdGF0aWMgaW50IHR0bV9ib19tb3ZlX3RvX2dob3N0KHN0cnVjdCB0dG1fYnVmZmVyX29iamVj dCAqYm8sCiAJZG1hX2ZlbmNlX3B1dChiby0+bW92aW5nKTsKIAliby0+bW92aW5nID0gZG1hX2Zl bmNlX2dldChmZW5jZSk7CiAKLQlyZXQgPSB0dG1fYnVmZmVyX29iamVjdF90cmFuc2Zlcihibywg Jmdob3N0X29iaik7CisJcmV0ID0gdHRtX2J1ZmZlcl9vYmplY3RfdHJhbnNmZXIoYm8sICZnaG9z dF9vYmosIGZhbHNlKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCkBAIC04MzYsMjYgKzg0 OCw1MSBAQCBpbnQgdHRtX2JvX21vdmVfYWNjZWxfY2xlYW51cChzdHJ1Y3QgdHRtX2J1ZmZlcl9v YmplY3QgKmJvLAogfQogRVhQT1JUX1NZTUJPTCh0dG1fYm9fbW92ZV9hY2NlbF9jbGVhbnVwKTsK IAorLyoqCisgKiB0dG1fYm9fcGlwZWxpbmVfZ3V0dGluZyAtIHB1cmdlIHRoZSBjb250ZW50cyBv ZiBhIGJvCisgKiBAYm86IFRoZSBidWZmZXIgb2JqZWN0CisgKgorICogUHVyZ2UgdGhlIGNvbnRl bnRzIG9mIGEgYm8sIGFzeW5jIGlmIHRoZSBibyBpcyBub3QgaWRsZS4KKyAqIEFmdGVyIGEgc3Vj Y2Vzc2Z1bCBjYWxsLCB0aGUgYm8gaXMgbGVmdCB1bnBvcHVsYXRlZCBpbgorICogc3lzdGVtIHBs YWNlbWVudC4gVGhlIGZ1bmN0aW9uIG1heSB3YWl0IHVuaW50ZXJydXB0aWJsZQorICogZm9yIGlk bGUgb24gT09NLgorICoKKyAqIFJldHVybjogMCBpZiBzdWNjZXNzZnVsLCBuZWdhdGl2ZSBlcnJv ciBjb2RlIG9uIGZhaWx1cmUuCisgKi8KIGludCB0dG1fYm9fcGlwZWxpbmVfZ3V0dGluZyhzdHJ1 Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvKQogewogCXN0YXRpYyBjb25zdCBzdHJ1Y3QgdHRtX3Bs YWNlIHN5c19tZW0gPSB7IC5tZW1fdHlwZSA9IFRUTV9QTF9TWVNURU0gfTsKIAlzdHJ1Y3QgdHRt X2J1ZmZlcl9vYmplY3QgKmdob3N0OwogCWludCByZXQ7CiAKLQlyZXQgPSB0dG1fYnVmZmVyX29i amVjdF90cmFuc2ZlcihibywgJmdob3N0KTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OworCS8q IElmIGFscmVhZHkgaWRsZSwgbm8gbmVlZCBmb3IgZ2hvc3Qgb2JqZWN0IGRhbmNlLiAqLworCXJl dCA9IHR0bV9ib193YWl0KGJvLCBmYWxzZSwgdHJ1ZSk7CisJaWYgKHJldCA9PSAtRUJVU1kpIHsK KwkJcmV0ID0gdHRtX2J1ZmZlcl9vYmplY3RfdHJhbnNmZXIoYm8sICZnaG9zdCwgdHJ1ZSk7CisJ CWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OwogCi0JcmV0ID0gZG1hX3Jlc3ZfY29weV9mZW5jZXMo Jmdob3N0LT5iYXNlLl9yZXN2LCBiby0+YmFzZS5yZXN2KTsKLQkvKiBMYXN0IHJlc29ydCwgd2Fp dCBmb3IgdGhlIEJPIHRvIGJlIGlkbGUgd2hlbiB3ZSBhcmUgT09NICovCi0JaWYgKHJldCkKLQkJ dHRtX2JvX3dhaXQoYm8sIGZhbHNlLCBmYWxzZSk7CisJCXJldCA9IGRtYV9yZXN2X2NvcHlfZmVu Y2VzKCZnaG9zdC0+YmFzZS5fcmVzdiwgYm8tPmJhc2UucmVzdik7CisJCS8qIExhc3QgcmVzb3J0 LCB3YWl0IGZvciB0aGUgQk8gdG8gYmUgaWRsZSB3aGVuIHdlIGFyZSBPT00gKi8KKwkJaWYgKHJl dCkKKwkJCXR0bV9ib193YWl0KGJvLCBmYWxzZSwgZmFsc2UpOwogCi0JdHRtX3Jlc291cmNlX2Fs bG9jKGJvLCAmc3lzX21lbSwgJmJvLT5tZW0pOwotCWJvLT50dG0gPSBOVUxMOworCQlkbWFfcmVz dl91bmxvY2soJmdob3N0LT5iYXNlLl9yZXN2KTsKKwkJdHRtX2JvX3B1dChnaG9zdCk7CisJfSBl bHNlIHsKKwkJaWYgKCFiby0+dHRtKSB7CisJCQlyZXQgPSB0dG1fdHRfY3JlYXRlKGJvLCB0cnVl KTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKwkJfSBlbHNlIHsKKwkJCXR0bV90dF91 bnBvcHVsYXRlKGJvLT5iZGV2LCBiby0+dHRtKTsKKwkJCWlmIChiby0+dHlwZSA9PSB0dG1fYm9f dHlwZV9kZXZpY2UpCisJCQkJdHRtX3R0X21hcmtfZm9yX2NsZWFyKGJvLT50dG0pOworCQl9CisJ CXR0bV9yZXNvdXJjZV9mcmVlKGJvLCAmYm8tPm1lbSk7CisJfQogCi0JZG1hX3Jlc3ZfdW5sb2Nr KCZnaG9zdC0+YmFzZS5fcmVzdik7Ci0JdHRtX2JvX3B1dChnaG9zdCk7CisJdHRtX3Jlc291cmNl X2FsbG9jKGJvLCAmc3lzX21lbSwgJmJvLT5tZW0pOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1n aXQgYS9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV90dC5jIGIvZHJpdmVycy9ncHUvZHJtL3R0bS90 dG1fdHQuYwppbmRleCA1MzllMDIzMmNiM2IuLjBiMTA1M2U5M2RiMiAxMDA2NDQKLS0tIGEvZHJp dmVycy9ncHUvZHJtL3R0bS90dG1fdHQuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV90 dC5jCkBAIC0xMzQsNiArMTM0LDExIEBAIHZvaWQgdHRtX3R0X2Rlc3Ryb3lfY29tbW9uKHN0cnVj dCB0dG1fZGV2aWNlICpiZGV2LCBzdHJ1Y3QgdHRtX3R0ICp0dG0pCiB9CiBFWFBPUlRfU1lNQk9M KHR0bV90dF9kZXN0cm95X2NvbW1vbik7CiAKK3ZvaWQgdHRtX3R0X21hcmtfZm9yX2NsZWFyKHN0 cnVjdCB0dG1fdHQgKnR0bSkKK3sKKwl0dG0tPnBhZ2VfZmxhZ3MgfD0gVFRNX1BBR0VfRkxBR19a RVJPX0FMTE9DOworfQorCiB2b2lkIHR0bV90dF9kZXN0cm95KHN0cnVjdCB0dG1fZGV2aWNlICpi ZGV2LCBzdHJ1Y3QgdHRtX3R0ICp0dG0pCiB7CiAJYmRldi0+ZnVuY3MtPnR0bV90dF9kZXN0cm95 KGJkZXYsIHR0bSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS90dG0vdHRtX3R0LmggYi9pbmNs dWRlL2RybS90dG0vdHRtX3R0LmgKaW5kZXggMTM0ZDA5ZWY3NzY2Li45MTU1MmM4M2FjNzkgMTAw NjQ0Ci0tLSBhL2luY2x1ZGUvZHJtL3R0bS90dG1fdHQuaAorKysgYi9pbmNsdWRlL2RybS90dG0v dHRtX3R0LmgKQEAgLTE1Nyw2ICsxNTcsMTYgQEAgaW50IHR0bV90dF9wb3B1bGF0ZShzdHJ1Y3Qg dHRtX2RldmljZSAqYmRldiwgc3RydWN0IHR0bV90dCAqdHRtLCBzdHJ1Y3QgdHRtX29wZXIKICAq Lwogdm9pZCB0dG1fdHRfdW5wb3B1bGF0ZShzdHJ1Y3QgdHRtX2RldmljZSAqYmRldiwgc3RydWN0 IHR0bV90dCAqdHRtKTsKIAorLyoqCisgKiB0dG1fdHRfbWFya19mb3JfY2xlYXIgLSBNYXJrIHBh Z2VzIGZvciBjbGVhcmluZyBvbiBwb3B1bGF0ZS4KKyAqCisgKiBAdHRtOiBQb2ludGVyIHRvIHRo ZSB0dG1fdHQgc3RydWN0dXJlCisgKgorICogTWFya3MgcGFnZXMgZm9yIGNsZWFyaW5nIHNvIHRo YXQgdGhlIG5leHQgdGltZSB0aGUgcGFnZSB2ZWN0b3IgaXMKKyAqIHBvcHVsYXRlZCwgdGhlIHBh Z2VzIHdpbGwgYmUgY2xlYXJlZC4KKyAqLwordm9pZCB0dG1fdHRfbWFya19mb3JfY2xlYXIoc3Ry dWN0IHR0bV90dCAqdHRtKTsKKwogdm9pZCB0dG1fdHRfbWdyX2luaXQodW5zaWduZWQgbG9uZyBu dW1fcGFnZXMsIHVuc2lnbmVkIGxvbmcgbnVtX2RtYTMyX3BhZ2VzKTsKIAogI2lmIElTX0VOQUJM RUQoQ09ORklHX0FHUCkKLS0gCjIuMzEuMQoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX18KSW50ZWwtZ2Z4IG1haWxpbmcgbGlzdApJbnRlbC1nZnhAbGlzdHMu ZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlz dGluZm8vaW50ZWwtZ2Z4Cg==