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 6A3E3C11F65 for ; Mon, 28 Jun 2021 19:32:28 +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 0A32861159 for ; Mon, 28 Jun 2021 19:32:26 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 0A32861159 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 C9B1B6E52A; Mon, 28 Jun 2021 19:32:23 +0000 (UTC) Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) by gabe.freedesktop.org (Postfix) with ESMTPS id A06F26E529; Mon, 28 Jun 2021 19:32:22 +0000 (UTC) X-IronPort-AV: E=McAfee;i="6200,9189,10029"; a="187707535" X-IronPort-AV: E=Sophos;i="5.83,306,1616482800"; d="scan'208";a="187707535" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jun 2021 12:32:22 -0700 X-IronPort-AV: E=Sophos;i="5.83,306,1616482800"; d="scan'208";a="641027457" Received: from danielmi-mobl2.ger.corp.intel.com (HELO [10.249.254.242]) ([10.249.254.242]) by fmsmga006-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jun 2021 12:32:21 -0700 Subject: Re: [Intel-gfx] [PATCH v3 2/5] drm/i915/gem: Introduce a selftest for the gem object migrate functionality To: "Ruhl, Michael J" , "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> <1cd06e51484c44a985e4a467007d1752@intel.com> <661d41530ae0406b89d07286e0cb384e@intel.com> From: =?UTF-8?Q?Thomas_Hellstr=c3=b6m?= Message-ID: Date: Mon, 28 Jun 2021 21:32:19 +0200 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: <661d41530ae0406b89d07286e0cb384e@intel.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Content-Language: en-US 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: "Auld, Matthew" Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" On 6/28/21 9:27 PM, Ruhl, Michael J wrote: >> -----Original Message----- >> From: Thomas Hellström >> Sent: Monday, June 28, 2021 3:15 PM >> To: Ruhl, Michael J ; intel- >> gfx@lists.freedesktop.org; dri-devel@lists.freedesktop.org >> Cc: Auld, Matthew >> Subject: Re: [Intel-gfx] [PATCH v3 2/5] drm/i915/gem: Introduce a selftest for >> the gem object migrate functionality >> >> On Mon, 2021-06-28 at 18:53 +0000, Ruhl, Michael J wrote: >>>> -----Original Message----- >>>> From: Intel-gfx On Behalf >>>> Of >>>> Thomas Hellström >>>> Sent: Monday, June 28, 2021 10:46 AM >>>> To: intel-gfx@lists.freedesktop.org; >>>> dri-devel@lists.freedesktop.org >>>> Cc: Thomas Hellström ; Auld, >>>> Matthew >>>> >>>> Subject: [Intel-gfx] [PATCH v3 2/5] drm/i915/gem: Introduce a >>>> selftest for the >>>> gem object migrate functionality >>>> >>>> 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)) { >>> I don't see any  testing of the parameter num_allowed. >>> >>> Is that done somewhere else? >>> >>> Mike >> That's a user-space submitted parameter only, dictating what region the >> object is allowed in when bound to the GPU. It's not exercised in this >> selftest. > Got it. > > Reviewed-by: Michael J. Ruhl > > M Thanks! Thomas >> Thanks, >> 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=-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 DEEBBC11F64 for ; Mon, 28 Jun 2021 19:32:25 +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 73AB761159 for ; Mon, 28 Jun 2021 19:32:24 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 73AB761159 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 B62036E529; Mon, 28 Jun 2021 19:32:23 +0000 (UTC) Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) by gabe.freedesktop.org (Postfix) with ESMTPS id A06F26E529; Mon, 28 Jun 2021 19:32:22 +0000 (UTC) X-IronPort-AV: E=McAfee;i="6200,9189,10029"; a="187707535" X-IronPort-AV: E=Sophos;i="5.83,306,1616482800"; d="scan'208";a="187707535" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jun 2021 12:32:22 -0700 X-IronPort-AV: E=Sophos;i="5.83,306,1616482800"; d="scan'208";a="641027457" Received: from danielmi-mobl2.ger.corp.intel.com (HELO [10.249.254.242]) ([10.249.254.242]) by fmsmga006-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jun 2021 12:32:21 -0700 To: "Ruhl, Michael J" , "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> <1cd06e51484c44a985e4a467007d1752@intel.com> <661d41530ae0406b89d07286e0cb384e@intel.com> From: =?UTF-8?Q?Thomas_Hellstr=c3=b6m?= Message-ID: Date: Mon, 28 Jun 2021 21:32:19 +0200 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: <661d41530ae0406b89d07286e0cb384e@intel.com> Content-Language: en-US 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: , Cc: "Auld, Matthew" Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" Ck9uIDYvMjgvMjEgOToyNyBQTSwgUnVobCwgTWljaGFlbCBKIHdyb3RlOgo+PiAtLS0tLU9yaWdp bmFsIE1lc3NhZ2UtLS0tLQo+PiBGcm9tOiBUaG9tYXMgSGVsbHN0csO2bSA8dGhvbWFzLmhlbGxz dHJvbUBsaW51eC5pbnRlbC5jb20+Cj4+IFNlbnQ6IE1vbmRheSwgSnVuZSAyOCwgMjAyMSAzOjE1 IFBNCj4+IFRvOiBSdWhsLCBNaWNoYWVsIEogPG1pY2hhZWwuai5ydWhsQGludGVsLmNvbT47IGlu dGVsLQo+PiBnZnhAbGlzdHMuZnJlZWRlc2t0b3Aub3JnOyBkcmktZGV2ZWxAbGlzdHMuZnJlZWRl c2t0b3Aub3JnCj4+IENjOiBBdWxkLCBNYXR0aGV3IDxtYXR0aGV3LmF1bGRAaW50ZWwuY29tPgo+ PiBTdWJqZWN0OiBSZTogW0ludGVsLWdmeF0gW1BBVENIIHYzIDIvNV0gZHJtL2k5MTUvZ2VtOiBJ bnRyb2R1Y2UgYSBzZWxmdGVzdCBmb3IKPj4gdGhlIGdlbSBvYmplY3QgbWlncmF0ZSBmdW5jdGlv bmFsaXR5Cj4+Cj4+IE9uIE1vbiwgMjAyMS0wNi0yOCBhdCAxODo1MyArMDAwMCwgUnVobCwgTWlj aGFlbCBKIHdyb3RlOgo+Pj4+IC0tLS0tT3JpZ2luYWwgTWVzc2FnZS0tLS0tCj4+Pj4gRnJvbTog SW50ZWwtZ2Z4IDxpbnRlbC1nZngtYm91bmNlc0BsaXN0cy5mcmVlZGVza3RvcC5vcmc+IE9uIEJl aGFsZgo+Pj4+IE9mCj4+Pj4gVGhvbWFzIEhlbGxzdHLDtm0KPj4+PiBTZW50OiBNb25kYXksIEp1 bmUgMjgsIDIwMjEgMTA6NDYgQU0KPj4+PiBUbzogaW50ZWwtZ2Z4QGxpc3RzLmZyZWVkZXNrdG9w Lm9yZzsKPj4+PiBkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCj4+Pj4gQ2M6IFRob21h cyBIZWxsc3Ryw7ZtIDx0aG9tYXMuaGVsbHN0cm9tQGxpbnV4LmludGVsLmNvbT47IEF1bGQsCj4+ Pj4gTWF0dGhldwo+Pj4+IDxtYXR0aGV3LmF1bGRAaW50ZWwuY29tPgo+Pj4+IFN1YmplY3Q6IFtJ bnRlbC1nZnhdIFtQQVRDSCB2MyAyLzVdIGRybS9pOTE1L2dlbTogSW50cm9kdWNlIGEKPj4+PiBz ZWxmdGVzdCBmb3IgdGhlCj4+Pj4gZ2VtIG9iamVjdCBtaWdyYXRlIGZ1bmN0aW9uYWxpdHkKPj4+ Pgo+Pj4+IEZyb206IE1hdHRoZXcgQXVsZCA8bWF0dGhldy5hdWxkQGludGVsLmNvbT4KPj4+Pgo+ Pj4+IEEgc2VsZnRlc3QgZm9yIHRoZSBnZW0gb2JqZWN0IG1pZ3JhdGUgZnVuY3Rpb25hbGl0eS4g U2xpZ2h0bHkKPj4+PiBhZGFwdGVkCj4+Pj4gZnJvbSB0aGUgb3JpZ2luYWwgYnkgTWF0dGhldyB0 byB0aGUgbmV3IGludGVyZmFjZSBhbmQgbmV3IGZpbGwgYmxpdAo+Pj4+IGNvZGUuCj4+Pj4KPj4+ PiBDby1kZXZlbG9wZWQtYnk6IFRob21hcyBIZWxsc3Ryw7ZtCj4+Pj4gPHRob21hcy5oZWxsc3Ry b21AbGludXguaW50ZWwuY29tPgo+Pj4+IFNpZ25lZC1vZmYtYnk6IFRob21hcyBIZWxsc3Ryw7Zt IDx0aG9tYXMuaGVsbHN0cm9tQGxpbnV4LmludGVsLmNvbT4KPj4+PiBTaWduZWQtb2ZmLWJ5OiBN YXR0aGV3IEF1bGQgPG1hdHRoZXcuYXVsZEBpbnRlbC5jb20+Cj4+Pj4gLS0tCj4+Pj4gZHJpdmVy cy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX29iamVjdC5jwqDCoMKgIHzCoMKgIDEgKwo+Pj4+ IC4uLi9kcm0vaTkxNS9nZW0vc2VsZnRlc3RzL2k5MTVfZ2VtX21pZ3JhdGUuYyB8IDIzNwo+Pj4+ ICsrKysrKysrKysrKysrKysrKwo+Pj4+IC4uLi9kcm0vaTkxNS9zZWxmdGVzdHMvaTkxNV9saXZl X3NlbGZ0ZXN0cy5owqAgfMKgwqAgMSArCj4+Pj4gMyBmaWxlcyBjaGFuZ2VkLCAyMzkgaW5zZXJ0 aW9ucygrKQo+Pj4+IGNyZWF0ZSBtb2RlIDEwMDY0NAo+Pj4+IGRyaXZlcnMvZ3B1L2RybS9pOTE1 L2dlbS9zZWxmdGVzdHMvaTkxNV9nZW1fbWlncmF0ZS5jCj4+Pj4KPj4+PiBkaWZmIC0tZ2l0IGEv ZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX29iamVjdC5jCj4+Pj4gYi9kcml2ZXJz L2dwdS9kcm0vaTkxNS9nZW0vaTkxNV9nZW1fb2JqZWN0LmMKPj4+PiBpbmRleCAxYzE4YmUwNjdi NTguLmZmMTQ3ZmQ1OTg3NCAxMDA2NDQKPj4+PiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9n ZW0vaTkxNV9nZW1fb2JqZWN0LmMKPj4+PiArKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9nZW0v aTkxNV9nZW1fb2JqZWN0LmMKPj4+PiBAQCAtNjQ5LDYgKzY0OSw3IEBAIHN0YXRpYyBjb25zdCBz dHJ1Y3QgZHJtX2dlbV9vYmplY3RfZnVuY3MKPj4+PiBpOTE1X2dlbV9vYmplY3RfZnVuY3MgPSB7 Cj4+Pj4gI2lmIElTX0VOQUJMRUQoQ09ORklHX0RSTV9JOTE1X1NFTEZURVNUKQo+Pj4+ICNpbmNs dWRlICJzZWxmdGVzdHMvaHVnZV9nZW1fb2JqZWN0LmMiCj4+Pj4gI2luY2x1ZGUgInNlbGZ0ZXN0 cy9odWdlX3BhZ2VzLmMiCj4+Pj4gKyNpbmNsdWRlICJzZWxmdGVzdHMvaTkxNV9nZW1fbWlncmF0 ZS5jIgo+Pj4+ICNpbmNsdWRlICJzZWxmdGVzdHMvaTkxNV9nZW1fb2JqZWN0LmMiCj4+Pj4gI2lu Y2x1ZGUgInNlbGZ0ZXN0cy9pOTE1X2dlbV9jb2hlcmVuY3kuYyIKPj4+PiAjZW5kaWYKPj4+PiBk aWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL3NlbGZ0ZXN0cy9pOTE1X2dlbV9t aWdyYXRlLmMKPj4+PiBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2dlbS9zZWxmdGVzdHMvaTkxNV9n ZW1fbWlncmF0ZS5jCj4+Pj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPj4+PiBpbmRleCAwMDAwMDAw MDAwMDAuLmE0MzdiNjZmNjRkOQo+Pj4+IC0tLSAvZGV2L251bGwKPj4+PiArKysgYi9kcml2ZXJz L2dwdS9kcm0vaTkxNS9nZW0vc2VsZnRlc3RzL2k5MTVfZ2VtX21pZ3JhdGUuYwo+Pj4+IEBAIC0w LDAgKzEsMjM3IEBACj4+Pj4gKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVQKPj4+PiAr LyoKPj4+PiArICogQ29weXJpZ2h0IMKpIDIwMjAtMjAyMSBJbnRlbCBDb3Jwb3JhdGlvbgo+Pj4+ ICsgKi8KPj4+PiArCj4+Pj4gKyNpbmNsdWRlICJndC9pbnRlbF9taWdyYXRlLmgiCj4+Pj4gKwo+ Pj4+ICtzdGF0aWMgaW50IGlndF9zbWVtX2NyZWF0ZV9taWdyYXRlKHZvaWQgKmFyZykKPj4+PiAr ewo+Pj4+ICvCoMKgwqDCoMKgwqDCoHN0cnVjdCBpbnRlbF9ndCAqZ3QgPSBhcmc7Cj4+Pj4gK8Kg wqDCoMKgwqDCoMKgc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUgPSBndC0+aTkxNTsKPj4+ PiArwqDCoMKgwqDCoMKgwqBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOwo+Pj4+ICvC oMKgwqDCoMKgwqDCoHN0cnVjdCBpOTE1X2dlbV93d19jdHggd3c7Cj4+Pj4gK8KgwqDCoMKgwqDC oMKgaW50IGVyciA9IDA7Cj4+Pj4gKwo+Pj4+ICvCoMKgwqDCoMKgwqDCoC8qIFN3aXRjaCBvYmpl Y3QgYmFja2luZy1zdG9yZSBvbiBjcmVhdGUgKi8KPj4+PiArwqDCoMKgwqDCoMKgwqBvYmogPSBp OTE1X2dlbV9vYmplY3RfY3JlYXRlX2xtZW0oaTkxNSwgUEFHRV9TSVpFLCAwKTsKPj4+PiArwqDC oMKgwqDCoMKgwqBpZiAoSVNfRVJSKG9iaikpCj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoHJldHVybiBQVFJfRVJSKG9iaik7Cj4+Pj4gKwo+Pj4+ICvCoMKgwqDCoMKgwqDCoGZv cl9pOTE1X2dlbV93dygmd3csIGVyciwgdHJ1ZSkgewo+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBlcnIgPSBpOTE1X2dlbV9vYmplY3RfbG9jayhvYmosICZ3dyk7Cj4+Pj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIChlcnIpCj4+Pj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBjb250aW51ZTsKPj4+PiArCj4+Pj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmICghaTkxNV9nZW1fb2JqZWN0X2Nhbl9taWdy YXRlKG9iaiwKPj4+PiBJTlRFTF9SRUdJT05fU01FTSkpIHsKPj4+PiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVyciA9IC1FSU5WQUw7Cj4+Pj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBjb250aW51ZTsKPj4+PiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgfQo+Pj4+ICsKPj4+PiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgZXJyID0gaTkxNV9nZW1fb2JqZWN0X21pZ3JhdGUob2JqLCAmd3cs Cj4+Pj4gSU5URUxfUkVHSU9OX1NNRU0pOwo+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBpZiAoZXJyKQo+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgY29udGludWU7Cj4+Pj4gKwo+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBlcnIgPSBpOTE1X2dlbV9vYmplY3RfcGluX3BhZ2VzKG9iaik7Cj4+Pj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIChlcnIpCj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBjb250aW51ZTsKPj4+PiArCj4+Pj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIChpOTE1X2dlbV9vYmplY3RfY2FuX21pZ3JhdGUob2Jq LAo+Pj4+IElOVEVMX1JFR0lPTl9MTUVNKSkKPj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVyciA9IC1FSU5WQUw7Cj4+Pj4gKwo+Pj4+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpOTE1X2dlbV9vYmplY3RfdW5waW5fcGFnZXMob2JqKTsK Pj4+PiArwqDCoMKgwqDCoMKgwqB9Cj4+Pj4gK8KgwqDCoMKgwqDCoMKgaTkxNV9nZW1fb2JqZWN0 X3B1dChvYmopOwo+Pj4+ICsKPj4+PiArwqDCoMKgwqDCoMKgwqByZXR1cm4gZXJyOwo+Pj4+ICt9 Cj4+Pj4gKwo+Pj4+ICtzdGF0aWMgaW50IGlndF9sbWVtX2NyZWF0ZV9taWdyYXRlKHZvaWQgKmFy ZykKPj4+PiArewo+Pj4+ICvCoMKgwqDCoMKgwqDCoHN0cnVjdCBpbnRlbF9ndCAqZ3QgPSBhcmc7 Cj4+Pj4gK8KgwqDCoMKgwqDCoMKgc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUgPSBndC0+ aTkxNTsKPj4+PiArwqDCoMKgwqDCoMKgwqBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2Jq Owo+Pj4+ICvCoMKgwqDCoMKgwqDCoHN0cnVjdCBpOTE1X2dlbV93d19jdHggd3c7Cj4+Pj4gK8Kg wqDCoMKgwqDCoMKgaW50IGVyciA9IDA7Cj4+Pj4gKwo+Pj4+ICvCoMKgwqDCoMKgwqDCoC8qIFN3 aXRjaCBvYmplY3QgYmFja2luZy1zdG9yZSBvbiBjcmVhdGUgKi8KPj4+PiArwqDCoMKgwqDCoMKg wqBvYmogPSBpOTE1X2dlbV9vYmplY3RfY3JlYXRlX3NobWVtKGk5MTUsIFBBR0VfU0laRSk7Cj4+ Pj4gK8KgwqDCoMKgwqDCoMKgaWYgKElTX0VSUihvYmopKQo+Pj4+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqByZXR1cm4gUFRSX0VSUihvYmopOwo+Pj4+ICsKPj4+PiArwqDCoMKgwqDC oMKgwqBmb3JfaTkxNV9nZW1fd3coJnd3LCBlcnIsIHRydWUpIHsKPj4+PiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgZXJyID0gaTkxNV9nZW1fb2JqZWN0X2xvY2sob2JqLCAmd3cpOwo+ Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAoZXJyKQo+Pj4+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgY29udGludWU7Cj4+Pj4gKwo+ Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAoIWk5MTVfZ2VtX29iamVjdF9j YW5fbWlncmF0ZShvYmosCj4+Pj4gSU5URUxfUkVHSU9OX0xNRU0pKSB7Cj4+Pj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlcnIgPSAtRUlOVkFMOwo+Pj4+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgY29udGludWU7 Cj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoH0KPj4+PiArCj4+Pj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVyciA9IGk5MTVfZ2VtX29iamVjdF9taWdyYXRlKG9i aiwgJnd3LAo+Pj4+IElOVEVMX1JFR0lPTl9MTUVNKTsKPj4+PiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgaWYgKGVycikKPj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoGNvbnRpbnVlOwo+Pj4+ICsKPj4+PiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgZXJyID0gaTkxNV9nZW1fb2JqZWN0X3Bpbl9wYWdlcyhvYmopOwo+Pj4+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAoZXJyKQo+Pj4+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgY29udGludWU7Cj4+Pj4gKwo+Pj4+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAoaTkxNV9nZW1fb2JqZWN0X2Nhbl9taWdy YXRlKG9iaiwKPj4+PiBJTlRFTF9SRUdJT05fU01FTSkpCj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlcnIgPSAtRUlOVkFMOwo+Pj4+ICsKPj4+PiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaTkxNV9nZW1fb2JqZWN0X3VucGluX3BhZ2Vz KG9iaik7Cj4+Pj4gK8KgwqDCoMKgwqDCoMKgfQo+Pj4+ICvCoMKgwqDCoMKgwqDCoGk5MTVfZ2Vt X29iamVjdF9wdXQob2JqKTsKPj4+PiArCj4+Pj4gK8KgwqDCoMKgwqDCoMKgcmV0dXJuIGVycjsK Pj4+PiArfQo+Pj4+ICsKPj4+PiArc3RhdGljIGludCBsbWVtX3BhZ2VzX21pZ3JhdGVfb25lKHN0 cnVjdCBpOTE1X2dlbV93d19jdHggKnd3LAo+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHN0cnVjdCBkcm1faTkxNV9n ZW1fb2JqZWN0ICpvYmopCj4+Pj4gK3sKPj4+PiArwqDCoMKgwqDCoMKgwqBpbnQgZXJyOwo+Pj4+ ICsKPj4+PiArwqDCoMKgwqDCoMKgwqBlcnIgPSBpOTE1X2dlbV9vYmplY3RfbG9jayhvYmosIHd3 KTsKPj4+PiArwqDCoMKgwqDCoMKgwqBpZiAoZXJyKQo+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqByZXR1cm4gZXJyOwo+Pj4+ICsKPj4+PiArwqDCoMKgwqDCoMKgwqBlcnIgPSBp OTE1X2dlbV9vYmplY3Rfd2FpdChvYmosCj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBJOTE1X1dBSVRfSU5URVJS VVBUSUJMRSB8Cj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBJOTE1X1dBSVRfUFJJT1JJVFkgfAo+Pj4+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgSTkxNV9XQUlUX0FMTCwKPj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIE1BWF9TQ0hFRFVMRV9USU1FT1VU KTsKPj4+PiArwqDCoMKgwqDCoMKgwqBpZiAoZXJyKQo+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqByZXR1cm4gZXJyOwo+Pj4+ICsKPj4+PiArwqDCoMKgwqDCoMKgwqBpZiAoaTkx NV9nZW1fb2JqZWN0X2lzX2xtZW0ob2JqKSkgewo+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBpZiAoIWk5MTVfZ2VtX29iamVjdF9jYW5fbWlncmF0ZShvYmosCj4+Pj4gSU5URUxf UkVHSU9OX1NNRU0pKSB7Cj4+PiBJIGRvbid0IHNlZSBhbnnCoCB0ZXN0aW5nIG9mIHRoZSBwYXJh bWV0ZXIgbnVtX2FsbG93ZWQuCj4+Pgo+Pj4gSXMgdGhhdCBkb25lIHNvbWV3aGVyZSBlbHNlPwo+ Pj4KPj4+IE1pa2UKPj4gVGhhdCdzIGEgdXNlci1zcGFjZSBzdWJtaXR0ZWQgcGFyYW1ldGVyIG9u bHksIGRpY3RhdGluZyB3aGF0IHJlZ2lvbiB0aGUKPj4gb2JqZWN0IGlzIGFsbG93ZWQgaW4gd2hl biBib3VuZCB0byB0aGUgR1BVLiBJdCdzIG5vdCBleGVyY2lzZWQgaW4gdGhpcwo+PiBzZWxmdGVz dC4KPiBHb3QgaXQuCj4KPiBSZXZpZXdlZC1ieTogTWljaGFlbCBKLiBSdWhsIDxtaWNoYWVsLmou cnVobEBpbnRlbC5jb20+Cj4KPiBNCgpUaGFua3MhCgpUaG9tYXMKCgo+PiBUaGFua3MsCj4+IFRo b21hcwo+PgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpJ bnRlbC1nZnggbWFpbGluZyBsaXN0CkludGVsLWdmeEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0 cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9pbnRlbC1nZngK