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=-15.3 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_SANE_1 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 3A5DAC2B9F4 for ; Mon, 28 Jun 2021 15:52:36 +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 DB967619BE for ; Mon, 28 Jun 2021 15:52:35 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org DB967619BE Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=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 64B5A6E4A5; Mon, 28 Jun 2021 15:52:35 +0000 (UTC) Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by gabe.freedesktop.org (Postfix) with ESMTPS id 129366E4A5; Mon, 28 Jun 2021 15:52:34 +0000 (UTC) X-IronPort-AV: E=McAfee;i="6200,9189,10029"; a="271839011" X-IronPort-AV: E=Sophos;i="5.83,306,1616482800"; d="scan'208";a="271839011" Received: from fmsmga007.fm.intel.com ([10.253.24.52]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jun 2021 08:51:46 -0700 X-IronPort-AV: E=Sophos;i="5.83,306,1616482800"; d="scan'208";a="419214738" Received: from vipulcha-mobl.ger.corp.intel.com (HELO [10.213.225.54]) ([10.213.225.54]) by fmsmga007-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jun 2021 08:51:44 -0700 Subject: Re: [PATCH v3 2/5] drm/i915/gem: Introduce a selftest for the gem object migrate functionality To: =?UTF-8?Q?Thomas_Hellstr=c3=b6m?= , intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org References: <20210628144626.76126-1-thomas.hellstrom@linux.intel.com> <20210628144626.76126-3-thomas.hellstrom@linux.intel.com> From: Matthew Auld Message-ID: Date: Mon, 28 Jun 2021 16:51:42 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.10.1 MIME-Version: 1.0 In-Reply-To: <20210628144626.76126-3-thomas.hellstrom@linux.intel.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-GB 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: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" On 28/06/2021 15:46, Thomas Hellström wrote: > From: Matthew Auld > > A selftest for the gem object migrate functionality. Slightly adapted > from the original by Matthew to the new interface and new fill blit > code. > > Co-developed-by: Thomas Hellström > Signed-off-by: Thomas Hellström > Signed-off-by: Matthew Auld > --- > drivers/gpu/drm/i915/gem/i915_gem_object.c | 1 + > .../drm/i915/gem/selftests/i915_gem_migrate.c | 237 ++++++++++++++++++ > .../drm/i915/selftests/i915_live_selftests.h | 1 + > 3 files changed, 239 insertions(+) > create mode 100644 drivers/gpu/drm/i915/gem/selftests/i915_gem_migrate.c > > diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object.c b/drivers/gpu/drm/i915/gem/i915_gem_object.c > index 1c18be067b58..ff147fd59874 100644 > --- a/drivers/gpu/drm/i915/gem/i915_gem_object.c > +++ b/drivers/gpu/drm/i915/gem/i915_gem_object.c > @@ -649,6 +649,7 @@ static const struct drm_gem_object_funcs i915_gem_object_funcs = { > #if IS_ENABLED(CONFIG_DRM_I915_SELFTEST) > #include "selftests/huge_gem_object.c" > #include "selftests/huge_pages.c" > +#include "selftests/i915_gem_migrate.c" > #include "selftests/i915_gem_object.c" > #include "selftests/i915_gem_coherency.c" > #endif > diff --git a/drivers/gpu/drm/i915/gem/selftests/i915_gem_migrate.c b/drivers/gpu/drm/i915/gem/selftests/i915_gem_migrate.c > new file mode 100644 > index 000000000000..a437b66f64d9 > --- /dev/null > +++ b/drivers/gpu/drm/i915/gem/selftests/i915_gem_migrate.c > @@ -0,0 +1,237 @@ > +// SPDX-License-Identifier: MIT > +/* > + * Copyright © 2020-2021 Intel Corporation > + */ > + > +#include "gt/intel_migrate.h" > + > +static int igt_smem_create_migrate(void *arg) > +{ > + struct intel_gt *gt = arg; > + struct drm_i915_private *i915 = gt->i915; > + struct drm_i915_gem_object *obj; > + struct i915_gem_ww_ctx ww; > + int err = 0; > + > + /* Switch object backing-store on create */ > + obj = i915_gem_object_create_lmem(i915, PAGE_SIZE, 0); > + if (IS_ERR(obj)) > + return PTR_ERR(obj); > + > + for_i915_gem_ww(&ww, err, true) { > + err = i915_gem_object_lock(obj, &ww); > + if (err) > + continue; > + > + if (!i915_gem_object_can_migrate(obj, INTEL_REGION_SMEM)) { > + err = -EINVAL; > + continue; > + } > + > + err = i915_gem_object_migrate(obj, &ww, INTEL_REGION_SMEM); > + if (err) > + continue; > + > + err = i915_gem_object_pin_pages(obj); > + if (err) > + continue; > + > + if (i915_gem_object_can_migrate(obj, INTEL_REGION_LMEM)) > + err = -EINVAL; > + > + i915_gem_object_unpin_pages(obj); > + } > + i915_gem_object_put(obj); > + > + return err; > +} > + > +static int igt_lmem_create_migrate(void *arg) > +{ > + struct intel_gt *gt = arg; > + struct drm_i915_private *i915 = gt->i915; > + struct drm_i915_gem_object *obj; > + struct i915_gem_ww_ctx ww; > + int err = 0; > + > + /* Switch object backing-store on create */ > + obj = i915_gem_object_create_shmem(i915, PAGE_SIZE); > + if (IS_ERR(obj)) > + return PTR_ERR(obj); > + > + for_i915_gem_ww(&ww, err, true) { > + err = i915_gem_object_lock(obj, &ww); > + if (err) > + continue; > + > + if (!i915_gem_object_can_migrate(obj, INTEL_REGION_LMEM)) { > + err = -EINVAL; > + continue; > + } > + > + err = i915_gem_object_migrate(obj, &ww, INTEL_REGION_LMEM); > + if (err) > + continue; > + > + err = i915_gem_object_pin_pages(obj); > + if (err) > + continue; > + > + if (i915_gem_object_can_migrate(obj, INTEL_REGION_SMEM)) > + err = -EINVAL; > + > + i915_gem_object_unpin_pages(obj); > + } > + i915_gem_object_put(obj); > + > + return err; > +} > + > +static int lmem_pages_migrate_one(struct i915_gem_ww_ctx *ww, > + struct drm_i915_gem_object *obj) > +{ > + int err; > + > + err = i915_gem_object_lock(obj, ww); > + if (err) > + return err; > + > + err = i915_gem_object_wait(obj, > + I915_WAIT_INTERRUPTIBLE | > + I915_WAIT_PRIORITY | > + I915_WAIT_ALL, > + MAX_SCHEDULE_TIMEOUT); > + if (err) > + return err; > + > + if (i915_gem_object_is_lmem(obj)) { > + if (!i915_gem_object_can_migrate(obj, INTEL_REGION_SMEM)) { > + pr_err("object can't migrate to smem.\n"); > + return -EINVAL; > + } > + > + err = i915_gem_object_migrate(obj, ww, INTEL_REGION_SMEM); > + if (err) { > + pr_err("Object failed migration to smem\n"); > + if (err) > + return err; > + } > + > + if (i915_gem_object_is_lmem(obj)) { > + pr_err("object still backed by lmem\n"); > + err = -EINVAL; > + } > + > + if (!i915_gem_object_has_struct_page(obj)) { > + pr_err("object not backed by struct page\n"); > + err = -EINVAL; > + } > + > + } else { > + if (!i915_gem_object_can_migrate(obj, INTEL_REGION_LMEM)) { > + pr_err("object can't migrate to lmem.\n"); > + return -EINVAL; > + } > + > + err = i915_gem_object_migrate(obj, ww, INTEL_REGION_LMEM); > + if (err) { > + pr_err("Object failed migration to lmem\n"); > + if (err) > + return err; > + } > + > + if (i915_gem_object_has_struct_page(obj)) { > + pr_err("object still backed by struct page\n"); > + err = -EINVAL; > + } > + > + if (!i915_gem_object_is_lmem(obj)) { > + pr_err("object not backed by lmem\n"); > + err = -EINVAL; > + } > + } > + > + return err; > +} > + > +static int igt_lmem_pages_migrate(void *arg) > +{ > + struct intel_gt *gt = arg; > + struct drm_i915_private *i915 = gt->i915; > + struct drm_i915_gem_object *obj; > + struct i915_gem_ww_ctx ww; > + struct i915_request *rq; > + int err; > + int i; > + > + /* From LMEM to shmem and back again */ > + > + obj = i915_gem_object_create_lmem(i915, SZ_2M, 0); > + if (IS_ERR(obj)) > + return PTR_ERR(obj); > + > + err = i915_gem_object_lock(obj, NULL); > + if (err) > + goto out_put; > + > + err = ____i915_gem_object_get_pages(obj); > + if (err) { > + i915_gem_object_unlock(obj); > + goto out_put; > + } > + > + err = intel_context_migrate_clear(gt->migrate.context, NULL, > + obj->mm.pages->sgl, obj->cache_level, > + i915_gem_object_is_lmem(obj), > + 0, &rq); > + if (rq) { > + dma_resv_add_excl_fence(obj->base.resv, &rq->fence); > + i915_request_put(rq); > + } > + i915_gem_object_unlock(obj); > + if (err) > + goto out_put; > + > + for (i = 1; i <= 4; ++i) { > + for_i915_gem_ww(&ww, err, true) { > + err = lmem_pages_migrate_one(&ww, obj); > + if (err) > + continue; > + > + err = i915_gem_object_wait_migration(obj, true); > + if (err) > + continue; > + > + err = intel_migrate_clear(>->migrate, &ww, NULL, > + obj->mm.pages->sgl, > + obj->cache_level, > + i915_gem_object_is_lmem(obj), > + 0xdeadbeaf, &rq); > + if (rq) { > + dma_resv_add_excl_fence(obj->base.resv, > + &rq->fence); > + i915_request_put(rq); > + } > + } > + if (err) > + break; > + } > +out_put: > + i915_gem_object_put(obj); > + > + return err; > +} > + > +int i915_gem_migrate_live_selftests(struct drm_i915_private *i915) > +{ > + static const struct i915_subtest tests[] = { > + SUBTEST(igt_smem_create_migrate), > + SUBTEST(igt_lmem_create_migrate), > + SUBTEST(igt_lmem_pages_migrate), Might be good to dirty the pages before the migration, and then verify they still match at the end? > + }; > + > + if (!HAS_LMEM(i915)) > + return 0; > + > + return intel_gt_live_subtests(tests, &i915->gt); > +} > diff --git a/drivers/gpu/drm/i915/selftests/i915_live_selftests.h b/drivers/gpu/drm/i915/selftests/i915_live_selftests.h > index a68197cf1044..e2fd1b61af71 100644 > --- a/drivers/gpu/drm/i915/selftests/i915_live_selftests.h > +++ b/drivers/gpu/drm/i915/selftests/i915_live_selftests.h > @@ -40,6 +40,7 @@ selftest(hugepages, i915_gem_huge_page_live_selftests) > selftest(gem_contexts, i915_gem_context_live_selftests) > selftest(gem_execbuf, i915_gem_execbuffer_live_selftests) > selftest(client, i915_gem_client_blt_live_selftests) > +selftest(gem_migrate, i915_gem_migrate_live_selftests) > selftest(reset, intel_reset_live_selftests) > selftest(memory_region, intel_memory_region_live_selftests) > selftest(hangcheck, intel_hangcheck_live_selftests) > 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=-15.3 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_SANE_1 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 457EEC2B9F4 for ; Mon, 28 Jun 2021 15:52:40 +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 101C4619BE for ; Mon, 28 Jun 2021 15:52:40 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 101C4619BE Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=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 281626E4AF; Mon, 28 Jun 2021 15:52:36 +0000 (UTC) Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by gabe.freedesktop.org (Postfix) with ESMTPS id 129366E4A5; Mon, 28 Jun 2021 15:52:34 +0000 (UTC) X-IronPort-AV: E=McAfee;i="6200,9189,10029"; a="271839011" X-IronPort-AV: E=Sophos;i="5.83,306,1616482800"; d="scan'208";a="271839011" Received: from fmsmga007.fm.intel.com ([10.253.24.52]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jun 2021 08:51:46 -0700 X-IronPort-AV: E=Sophos;i="5.83,306,1616482800"; d="scan'208";a="419214738" Received: from vipulcha-mobl.ger.corp.intel.com (HELO [10.213.225.54]) ([10.213.225.54]) by fmsmga007-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jun 2021 08:51:44 -0700 To: =?UTF-8?Q?Thomas_Hellstr=c3=b6m?= , intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org References: <20210628144626.76126-1-thomas.hellstrom@linux.intel.com> <20210628144626.76126-3-thomas.hellstrom@linux.intel.com> From: Matthew Auld Message-ID: Date: Mon, 28 Jun 2021 16:51:42 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.10.1 MIME-Version: 1.0 In-Reply-To: <20210628144626.76126-3-thomas.hellstrom@linux.intel.com> Content-Language: en-GB Subject: Re: [Intel-gfx] [PATCH v3 2/5] drm/i915/gem: Introduce a selftest for the gem object migrate functionality 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: , Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" T24gMjgvMDYvMjAyMSAxNTo0NiwgVGhvbWFzIEhlbGxzdHLDtm0gd3JvdGU6Cj4gRnJvbTogTWF0 dGhldyBBdWxkIDxtYXR0aGV3LmF1bGRAaW50ZWwuY29tPgo+IAo+IEEgc2VsZnRlc3QgZm9yIHRo ZSBnZW0gb2JqZWN0IG1pZ3JhdGUgZnVuY3Rpb25hbGl0eS4gU2xpZ2h0bHkgYWRhcHRlZAo+IGZy b20gdGhlIG9yaWdpbmFsIGJ5IE1hdHRoZXcgdG8gdGhlIG5ldyBpbnRlcmZhY2UgYW5kIG5ldyBm aWxsIGJsaXQKPiBjb2RlLgo+IAo+IENvLWRldmVsb3BlZC1ieTogVGhvbWFzIEhlbGxzdHLDtm0g PHRob21hcy5oZWxsc3Ryb21AbGludXguaW50ZWwuY29tPgo+IFNpZ25lZC1vZmYtYnk6IFRob21h cyBIZWxsc3Ryw7ZtIDx0aG9tYXMuaGVsbHN0cm9tQGxpbnV4LmludGVsLmNvbT4KPiBTaWduZWQt b2ZmLWJ5OiBNYXR0aGV3IEF1bGQgPG1hdHRoZXcuYXVsZEBpbnRlbC5jb20+Cj4gLS0tCj4gICBk cml2ZXJzL2dwdS9kcm0vaTkxNS9nZW0vaTkxNV9nZW1fb2JqZWN0LmMgICAgfCAgIDEgKwo+ICAg Li4uL2RybS9pOTE1L2dlbS9zZWxmdGVzdHMvaTkxNV9nZW1fbWlncmF0ZS5jIHwgMjM3ICsrKysr KysrKysrKysrKysrKwo+ICAgLi4uL2RybS9pOTE1L3NlbGZ0ZXN0cy9pOTE1X2xpdmVfc2VsZnRl c3RzLmggIHwgICAxICsKPiAgIDMgZmlsZXMgY2hhbmdlZCwgMjM5IGluc2VydGlvbnMoKykKPiAg IGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vaTkxNS9nZW0vc2VsZnRlc3RzL2k5 MTVfZ2VtX21pZ3JhdGUuYwo+IAo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9n ZW0vaTkxNV9nZW1fb2JqZWN0LmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9nZW0vaTkxNV9nZW1f b2JqZWN0LmMKPiBpbmRleCAxYzE4YmUwNjdiNTguLmZmMTQ3ZmQ1OTg3NCAxMDA2NDQKPiAtLS0g YS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9nZW0vaTkxNV9nZW1fb2JqZWN0LmMKPiArKysgYi9kcml2 ZXJzL2dwdS9kcm0vaTkxNS9nZW0vaTkxNV9nZW1fb2JqZWN0LmMKPiBAQCAtNjQ5LDYgKzY0OSw3 IEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2dlbV9vYmplY3RfZnVuY3MgaTkxNV9nZW1fb2Jq ZWN0X2Z1bmNzID0gewo+ICAgI2lmIElTX0VOQUJMRUQoQ09ORklHX0RSTV9JOTE1X1NFTEZURVNU KQo+ICAgI2luY2x1ZGUgInNlbGZ0ZXN0cy9odWdlX2dlbV9vYmplY3QuYyIKPiAgICNpbmNsdWRl ICJzZWxmdGVzdHMvaHVnZV9wYWdlcy5jIgo+ICsjaW5jbHVkZSAic2VsZnRlc3RzL2k5MTVfZ2Vt X21pZ3JhdGUuYyIKPiAgICNpbmNsdWRlICJzZWxmdGVzdHMvaTkxNV9nZW1fb2JqZWN0LmMiCj4g ICAjaW5jbHVkZSAic2VsZnRlc3RzL2k5MTVfZ2VtX2NvaGVyZW5jeS5jIgo+ICAgI2VuZGlmCj4g ZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2dlbS9zZWxmdGVzdHMvaTkxNV9nZW1f bWlncmF0ZS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL3NlbGZ0ZXN0cy9pOTE1X2dlbV9t aWdyYXRlLmMKPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+IGluZGV4IDAwMDAwMDAwMDAwMC4uYTQz N2I2NmY2NGQ5Cj4gLS0tIC9kZXYvbnVsbAo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2dl bS9zZWxmdGVzdHMvaTkxNV9nZW1fbWlncmF0ZS5jCj4gQEAgLTAsMCArMSwyMzcgQEAKPiArLy8g U1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVAo+ICsvKgo+ICsgKiBDb3B5cmlnaHQgwqkgMjAy MC0yMDIxIEludGVsIENvcnBvcmF0aW9uCj4gKyAqLwo+ICsKPiArI2luY2x1ZGUgImd0L2ludGVs X21pZ3JhdGUuaCIKPiArCj4gK3N0YXRpYyBpbnQgaWd0X3NtZW1fY3JlYXRlX21pZ3JhdGUodm9p ZCAqYXJnKQo+ICt7Cj4gKwlzdHJ1Y3QgaW50ZWxfZ3QgKmd0ID0gYXJnOwo+ICsJc3RydWN0IGRy bV9pOTE1X3ByaXZhdGUgKmk5MTUgPSBndC0+aTkxNTsKPiArCXN0cnVjdCBkcm1faTkxNV9nZW1f b2JqZWN0ICpvYmo7Cj4gKwlzdHJ1Y3QgaTkxNV9nZW1fd3dfY3R4IHd3Owo+ICsJaW50IGVyciA9 IDA7Cj4gKwo+ICsJLyogU3dpdGNoIG9iamVjdCBiYWNraW5nLXN0b3JlIG9uIGNyZWF0ZSAqLwo+ ICsJb2JqID0gaTkxNV9nZW1fb2JqZWN0X2NyZWF0ZV9sbWVtKGk5MTUsIFBBR0VfU0laRSwgMCk7 Cj4gKwlpZiAoSVNfRVJSKG9iaikpCj4gKwkJcmV0dXJuIFBUUl9FUlIob2JqKTsKPiArCj4gKwlm b3JfaTkxNV9nZW1fd3coJnd3LCBlcnIsIHRydWUpIHsKPiArCQllcnIgPSBpOTE1X2dlbV9vYmpl Y3RfbG9jayhvYmosICZ3dyk7Cj4gKwkJaWYgKGVycikKPiArCQkJY29udGludWU7Cj4gKwo+ICsJ CWlmICghaTkxNV9nZW1fb2JqZWN0X2Nhbl9taWdyYXRlKG9iaiwgSU5URUxfUkVHSU9OX1NNRU0p KSB7Cj4gKwkJCWVyciA9IC1FSU5WQUw7Cj4gKwkJCWNvbnRpbnVlOwo+ICsJCX0KPiArCj4gKwkJ ZXJyID0gaTkxNV9nZW1fb2JqZWN0X21pZ3JhdGUob2JqLCAmd3csIElOVEVMX1JFR0lPTl9TTUVN KTsKPiArCQlpZiAoZXJyKQo+ICsJCQljb250aW51ZTsKPiArCj4gKwkJZXJyID0gaTkxNV9nZW1f b2JqZWN0X3Bpbl9wYWdlcyhvYmopOwo+ICsJCWlmIChlcnIpCj4gKwkJCWNvbnRpbnVlOwo+ICsK PiArCQlpZiAoaTkxNV9nZW1fb2JqZWN0X2Nhbl9taWdyYXRlKG9iaiwgSU5URUxfUkVHSU9OX0xN RU0pKQo+ICsJCQllcnIgPSAtRUlOVkFMOwo+ICsKPiArCQlpOTE1X2dlbV9vYmplY3RfdW5waW5f cGFnZXMob2JqKTsKPiArCX0KPiArCWk5MTVfZ2VtX29iamVjdF9wdXQob2JqKTsKPiArCj4gKwly ZXR1cm4gZXJyOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGlndF9sbWVtX2NyZWF0ZV9taWdyYXRl KHZvaWQgKmFyZykKPiArewo+ICsJc3RydWN0IGludGVsX2d0ICpndCA9IGFyZzsKPiArCXN0cnVj dCBkcm1faTkxNV9wcml2YXRlICppOTE1ID0gZ3QtPmk5MTU7Cj4gKwlzdHJ1Y3QgZHJtX2k5MTVf Z2VtX29iamVjdCAqb2JqOwo+ICsJc3RydWN0IGk5MTVfZ2VtX3d3X2N0eCB3dzsKPiArCWludCBl cnIgPSAwOwo+ICsKPiArCS8qIFN3aXRjaCBvYmplY3QgYmFja2luZy1zdG9yZSBvbiBjcmVhdGUg Ki8KPiArCW9iaiA9IGk5MTVfZ2VtX29iamVjdF9jcmVhdGVfc2htZW0oaTkxNSwgUEFHRV9TSVpF KTsKPiArCWlmIChJU19FUlIob2JqKSkKPiArCQlyZXR1cm4gUFRSX0VSUihvYmopOwo+ICsKPiAr CWZvcl9pOTE1X2dlbV93dygmd3csIGVyciwgdHJ1ZSkgewo+ICsJCWVyciA9IGk5MTVfZ2VtX29i amVjdF9sb2NrKG9iaiwgJnd3KTsKPiArCQlpZiAoZXJyKQo+ICsJCQljb250aW51ZTsKPiArCj4g KwkJaWYgKCFpOTE1X2dlbV9vYmplY3RfY2FuX21pZ3JhdGUob2JqLCBJTlRFTF9SRUdJT05fTE1F TSkpIHsKPiArCQkJZXJyID0gLUVJTlZBTDsKPiArCQkJY29udGludWU7Cj4gKwkJfQo+ICsKPiAr CQllcnIgPSBpOTE1X2dlbV9vYmplY3RfbWlncmF0ZShvYmosICZ3dywgSU5URUxfUkVHSU9OX0xN RU0pOwo+ICsJCWlmIChlcnIpCj4gKwkJCWNvbnRpbnVlOwo+ICsKPiArCQllcnIgPSBpOTE1X2dl bV9vYmplY3RfcGluX3BhZ2VzKG9iaik7Cj4gKwkJaWYgKGVycikKPiArCQkJY29udGludWU7Cj4g Kwo+ICsJCWlmIChpOTE1X2dlbV9vYmplY3RfY2FuX21pZ3JhdGUob2JqLCBJTlRFTF9SRUdJT05f U01FTSkpCj4gKwkJCWVyciA9IC1FSU5WQUw7Cj4gKwo+ICsJCWk5MTVfZ2VtX29iamVjdF91bnBp bl9wYWdlcyhvYmopOwo+ICsJfQo+ICsJaTkxNV9nZW1fb2JqZWN0X3B1dChvYmopOwo+ICsKPiAr CXJldHVybiBlcnI7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgbG1lbV9wYWdlc19taWdyYXRlX29u ZShzdHJ1Y3QgaTkxNV9nZW1fd3dfY3R4ICp3dywKPiArCQkJCSAgc3RydWN0IGRybV9pOTE1X2dl bV9vYmplY3QgKm9iaikKPiArewo+ICsJaW50IGVycjsKPiArCj4gKwllcnIgPSBpOTE1X2dlbV9v YmplY3RfbG9jayhvYmosIHd3KTsKPiArCWlmIChlcnIpCj4gKwkJcmV0dXJuIGVycjsKPiArCj4g KwllcnIgPSBpOTE1X2dlbV9vYmplY3Rfd2FpdChvYmosCj4gKwkJCQkgICBJOTE1X1dBSVRfSU5U RVJSVVBUSUJMRSB8Cj4gKwkJCQkgICBJOTE1X1dBSVRfUFJJT1JJVFkgfAo+ICsJCQkJICAgSTkx NV9XQUlUX0FMTCwKPiArCQkJCSAgIE1BWF9TQ0hFRFVMRV9USU1FT1VUKTsKPiArCWlmIChlcnIp Cj4gKwkJcmV0dXJuIGVycjsKPiArCj4gKwlpZiAoaTkxNV9nZW1fb2JqZWN0X2lzX2xtZW0ob2Jq KSkgewo+ICsJCWlmICghaTkxNV9nZW1fb2JqZWN0X2Nhbl9taWdyYXRlKG9iaiwgSU5URUxfUkVH SU9OX1NNRU0pKSB7Cj4gKwkJCXByX2Vycigib2JqZWN0IGNhbid0IG1pZ3JhdGUgdG8gc21lbS5c biIpOwo+ICsJCQlyZXR1cm4gLUVJTlZBTDsKPiArCQl9Cj4gKwo+ICsJCWVyciA9IGk5MTVfZ2Vt X29iamVjdF9taWdyYXRlKG9iaiwgd3csIElOVEVMX1JFR0lPTl9TTUVNKTsKPiArCQlpZiAoZXJy KSB7Cj4gKwkJCXByX2VycigiT2JqZWN0IGZhaWxlZCBtaWdyYXRpb24gdG8gc21lbVxuIik7Cj4g KwkJCWlmIChlcnIpCj4gKwkJCQlyZXR1cm4gZXJyOwo+ICsJCX0KPiArCj4gKwkJaWYgKGk5MTVf Z2VtX29iamVjdF9pc19sbWVtKG9iaikpIHsKPiArCQkJcHJfZXJyKCJvYmplY3Qgc3RpbGwgYmFj a2VkIGJ5IGxtZW1cbiIpOwo+ICsJCQllcnIgPSAtRUlOVkFMOwo+ICsJCX0KPiArCj4gKwkJaWYg KCFpOTE1X2dlbV9vYmplY3RfaGFzX3N0cnVjdF9wYWdlKG9iaikpIHsKPiArCQkJcHJfZXJyKCJv YmplY3Qgbm90IGJhY2tlZCBieSBzdHJ1Y3QgcGFnZVxuIik7Cj4gKwkJCWVyciA9IC1FSU5WQUw7 Cj4gKwkJfQo+ICsKPiArCX0gZWxzZSB7Cj4gKwkJaWYgKCFpOTE1X2dlbV9vYmplY3RfY2FuX21p Z3JhdGUob2JqLCBJTlRFTF9SRUdJT05fTE1FTSkpIHsKPiArCQkJcHJfZXJyKCJvYmplY3QgY2Fu J3QgbWlncmF0ZSB0byBsbWVtLlxuIik7Cj4gKwkJCXJldHVybiAtRUlOVkFMOwo+ICsJCX0KPiAr Cj4gKwkJZXJyID0gaTkxNV9nZW1fb2JqZWN0X21pZ3JhdGUob2JqLCB3dywgSU5URUxfUkVHSU9O X0xNRU0pOwo+ICsJCWlmIChlcnIpIHsKPiArCQkJcHJfZXJyKCJPYmplY3QgZmFpbGVkIG1pZ3Jh dGlvbiB0byBsbWVtXG4iKTsKPiArCQkJaWYgKGVycikKPiArCQkJCXJldHVybiBlcnI7Cj4gKwkJ fQo+ICsKPiArCQlpZiAoaTkxNV9nZW1fb2JqZWN0X2hhc19zdHJ1Y3RfcGFnZShvYmopKSB7Cj4g KwkJCXByX2Vycigib2JqZWN0IHN0aWxsIGJhY2tlZCBieSBzdHJ1Y3QgcGFnZVxuIik7Cj4gKwkJ CWVyciA9IC1FSU5WQUw7Cj4gKwkJfQo+ICsKPiArCQlpZiAoIWk5MTVfZ2VtX29iamVjdF9pc19s bWVtKG9iaikpIHsKPiArCQkJcHJfZXJyKCJvYmplY3Qgbm90IGJhY2tlZCBieSBsbWVtXG4iKTsK PiArCQkJZXJyID0gLUVJTlZBTDsKPiArCQl9Cj4gKwl9Cj4gKwo+ICsJcmV0dXJuIGVycjsKPiAr fQo+ICsKPiArc3RhdGljIGludCBpZ3RfbG1lbV9wYWdlc19taWdyYXRlKHZvaWQgKmFyZykKPiAr ewo+ICsJc3RydWN0IGludGVsX2d0ICpndCA9IGFyZzsKPiArCXN0cnVjdCBkcm1faTkxNV9wcml2 YXRlICppOTE1ID0gZ3QtPmk5MTU7Cj4gKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2Jq Owo+ICsJc3RydWN0IGk5MTVfZ2VtX3d3X2N0eCB3dzsKPiArCXN0cnVjdCBpOTE1X3JlcXVlc3Qg KnJxOwo+ICsJaW50IGVycjsKPiArCWludCBpOwo+ICsKPiArCS8qIEZyb20gTE1FTSB0byBzaG1l bSBhbmQgYmFjayBhZ2FpbiAqLwo+ICsKPiArCW9iaiA9IGk5MTVfZ2VtX29iamVjdF9jcmVhdGVf bG1lbShpOTE1LCBTWl8yTSwgMCk7Cj4gKwlpZiAoSVNfRVJSKG9iaikpCj4gKwkJcmV0dXJuIFBU Ul9FUlIob2JqKTsKPiArCj4gKwllcnIgPSBpOTE1X2dlbV9vYmplY3RfbG9jayhvYmosIE5VTEwp Owo+ICsJaWYgKGVycikKPiArCQlnb3RvIG91dF9wdXQ7Cj4gKwo+ICsJZXJyID0gX19fX2k5MTVf Z2VtX29iamVjdF9nZXRfcGFnZXMob2JqKTsKPiArCWlmIChlcnIpIHsKPiArCQlpOTE1X2dlbV9v YmplY3RfdW5sb2NrKG9iaik7Cj4gKwkJZ290byBvdXRfcHV0Owo+ICsJfQo+ICsKPiArCWVyciA9 IGludGVsX2NvbnRleHRfbWlncmF0ZV9jbGVhcihndC0+bWlncmF0ZS5jb250ZXh0LCBOVUxMLAo+ ICsJCQkJCSAgb2JqLT5tbS5wYWdlcy0+c2dsLCBvYmotPmNhY2hlX2xldmVsLAo+ICsJCQkJCSAg aTkxNV9nZW1fb2JqZWN0X2lzX2xtZW0ob2JqKSwKPiArCQkJCQkgIDAsICZycSk7Cj4gKwlpZiAo cnEpIHsKPiArCQlkbWFfcmVzdl9hZGRfZXhjbF9mZW5jZShvYmotPmJhc2UucmVzdiwgJnJxLT5m ZW5jZSk7Cj4gKwkJaTkxNV9yZXF1ZXN0X3B1dChycSk7Cj4gKwl9Cj4gKwlpOTE1X2dlbV9vYmpl Y3RfdW5sb2NrKG9iaik7Cj4gKwlpZiAoZXJyKQo+ICsJCWdvdG8gb3V0X3B1dDsKPiArCj4gKwlm b3IgKGkgPSAxOyBpIDw9IDQ7ICsraSkgewo+ICsJCWZvcl9pOTE1X2dlbV93dygmd3csIGVyciwg dHJ1ZSkgewo+ICsJCQllcnIgPSBsbWVtX3BhZ2VzX21pZ3JhdGVfb25lKCZ3dywgb2JqKTsKPiAr CQkJaWYgKGVycikKPiArCQkJCWNvbnRpbnVlOwo+ICsKPiArCQkJZXJyID0gaTkxNV9nZW1fb2Jq ZWN0X3dhaXRfbWlncmF0aW9uKG9iaiwgdHJ1ZSk7Cj4gKwkJCWlmIChlcnIpCj4gKwkJCQljb250 aW51ZTsKPiArCj4gKwkJCWVyciA9IGludGVsX21pZ3JhdGVfY2xlYXIoJmd0LT5taWdyYXRlLCAm d3csIE5VTEwsCj4gKwkJCQkJCSAgb2JqLT5tbS5wYWdlcy0+c2dsLAo+ICsJCQkJCQkgIG9iai0+ Y2FjaGVfbGV2ZWwsCj4gKwkJCQkJCSAgaTkxNV9nZW1fb2JqZWN0X2lzX2xtZW0ob2JqKSwKPiAr CQkJCQkJICAweGRlYWRiZWFmLCAmcnEpOwo+ICsJCQlpZiAocnEpIHsKPiArCQkJCWRtYV9yZXN2 X2FkZF9leGNsX2ZlbmNlKG9iai0+YmFzZS5yZXN2LAo+ICsJCQkJCQkJJnJxLT5mZW5jZSk7Cj4g KwkJCQlpOTE1X3JlcXVlc3RfcHV0KHJxKTsKPiArCQkJfQo+ICsJCX0KPiArCQlpZiAoZXJyKQo+ ICsJCQlicmVhazsKPiArCX0KPiArb3V0X3B1dDoKPiArCWk5MTVfZ2VtX29iamVjdF9wdXQob2Jq KTsKPiArCj4gKwlyZXR1cm4gZXJyOwo+ICt9Cj4gKwo+ICtpbnQgaTkxNV9nZW1fbWlncmF0ZV9s aXZlX3NlbGZ0ZXN0cyhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSkKPiArewo+ICsJc3Rh dGljIGNvbnN0IHN0cnVjdCBpOTE1X3N1YnRlc3QgdGVzdHNbXSA9IHsKPiArCQlTVUJURVNUKGln dF9zbWVtX2NyZWF0ZV9taWdyYXRlKSwKPiArCQlTVUJURVNUKGlndF9sbWVtX2NyZWF0ZV9taWdy YXRlKSwKPiArCQlTVUJURVNUKGlndF9sbWVtX3BhZ2VzX21pZ3JhdGUpLAoKTWlnaHQgYmUgZ29v ZCB0byBkaXJ0eSB0aGUgcGFnZXMgYmVmb3JlIHRoZSBtaWdyYXRpb24sIGFuZCB0aGVuIHZlcmlm eSAKdGhleSBzdGlsbCBtYXRjaCBhdCB0aGUgZW5kPwoKPiArCX07Cj4gKwo+ICsJaWYgKCFIQVNf TE1FTShpOTE1KSkKPiArCQlyZXR1cm4gMDsKPiArCj4gKwlyZXR1cm4gaW50ZWxfZ3RfbGl2ZV9z dWJ0ZXN0cyh0ZXN0cywgJmk5MTUtPmd0KTsKPiArfQo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dw dS9kcm0vaTkxNS9zZWxmdGVzdHMvaTkxNV9saXZlX3NlbGZ0ZXN0cy5oIGIvZHJpdmVycy9ncHUv ZHJtL2k5MTUvc2VsZnRlc3RzL2k5MTVfbGl2ZV9zZWxmdGVzdHMuaAo+IGluZGV4IGE2ODE5N2Nm MTA0NC4uZTJmZDFiNjFhZjcxIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L3Nl bGZ0ZXN0cy9pOTE1X2xpdmVfc2VsZnRlc3RzLmgKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkx NS9zZWxmdGVzdHMvaTkxNV9saXZlX3NlbGZ0ZXN0cy5oCj4gQEAgLTQwLDYgKzQwLDcgQEAgc2Vs ZnRlc3QoaHVnZXBhZ2VzLCBpOTE1X2dlbV9odWdlX3BhZ2VfbGl2ZV9zZWxmdGVzdHMpCj4gICBz ZWxmdGVzdChnZW1fY29udGV4dHMsIGk5MTVfZ2VtX2NvbnRleHRfbGl2ZV9zZWxmdGVzdHMpCj4g ICBzZWxmdGVzdChnZW1fZXhlY2J1ZiwgaTkxNV9nZW1fZXhlY2J1ZmZlcl9saXZlX3NlbGZ0ZXN0 cykKPiAgIHNlbGZ0ZXN0KGNsaWVudCwgaTkxNV9nZW1fY2xpZW50X2JsdF9saXZlX3NlbGZ0ZXN0 cykKPiArc2VsZnRlc3QoZ2VtX21pZ3JhdGUsIGk5MTVfZ2VtX21pZ3JhdGVfbGl2ZV9zZWxmdGVz dHMpCj4gICBzZWxmdGVzdChyZXNldCwgaW50ZWxfcmVzZXRfbGl2ZV9zZWxmdGVzdHMpCj4gICBz ZWxmdGVzdChtZW1vcnlfcmVnaW9uLCBpbnRlbF9tZW1vcnlfcmVnaW9uX2xpdmVfc2VsZnRlc3Rz KQo+ICAgc2VsZnRlc3QoaGFuZ2NoZWNrLCBpbnRlbF9oYW5nY2hlY2tfbGl2ZV9zZWxmdGVzdHMp Cj4gCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkludGVs LWdmeCBtYWlsaW5nIGxpc3QKSW50ZWwtZ2Z4QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczov L2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2ludGVsLWdmeAo=