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 DED14C11F66 for ; Mon, 28 Jun 2021 19:54: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 8C9B961C87 for ; Mon, 28 Jun 2021 19:54:36 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 8C9B961C87 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 818DF6E54C; Mon, 28 Jun 2021 19:54:35 +0000 (UTC) Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) by gabe.freedesktop.org (Postfix) with ESMTPS id 513A66E54C; Mon, 28 Jun 2021 19:54:34 +0000 (UTC) X-IronPort-AV: E=McAfee;i="6200,9189,10029"; a="206200489" X-IronPort-AV: E=Sophos;i="5.83,306,1616482800"; d="scan'208";a="206200489" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jun 2021 12:54:32 -0700 X-IronPort-AV: E=Sophos;i="5.83,306,1616482800"; d="scan'208";a="641032875" 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:54:30 -0700 Subject: Re: [PATCH v3 1/5] drm/i915/gem: Implement object migration 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-2-thomas.hellstrom@linux.intel.com> <6ea416ea-b2d8-1485-6375-52810699f838@linux.intel.com> <615aebfc2bfd45dc836e798182501ef3@intel.com> From: =?UTF-8?Q?Thomas_Hellstr=c3=b6m?= Message-ID: <3d6bcd4e-0d9a-b5b8-04e0-0361c4bef92d@linux.intel.com> Date: Mon, 28 Jun 2021 21:54:29 +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: <615aebfc2bfd45dc836e798182501ef3@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" , lkp Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" On 6/28/21 9:50 PM, Ruhl, Michael J wrote: >> -----Original Message----- >> From: Thomas Hellström >> Sent: Monday, June 28, 2021 3:03 PM >> To: Ruhl, Michael J ; intel- >> gfx@lists.freedesktop.org; dri-devel@lists.freedesktop.org >> Cc: Auld, Matthew ; lkp >> Subject: Re: [PATCH v3 1/5] drm/i915/gem: Implement object migration >> >> >> On 6/28/21 8:11 PM, Ruhl, Michael J wrote: >>>> -----Original Message----- >>>> From: dri-devel 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 >>>> ; lkp >>>> Subject: [PATCH v3 1/5] drm/i915/gem: Implement object migration >>>> >>>> Introduce an interface to migrate objects between regions. >>>> This is primarily intended to migrate objects to LMEM for display and >>>> to SYSTEM for dma-buf, but might be reused in one form or another for >>>> performance-based migration. >>>> >>>> v2: >>>> - Verify that the memory region given as an id really exists. >>>> (Reported by Matthew Auld) >>>> - Call i915_gem_object_{init,release}_memory_region() when switching >>>> region >>>> to handle also switching region lists. (Reported by Matthew Auld) >>>> v3: >>>> - Fix i915_gem_object_can_migrate() to return true if object is already in >>>> the correct region, even if the object ops doesn't have a migrate() >>>> callback. >>>> - Update typo in commit message. >>>> - Fix kerneldoc of i915_gem_object_wait_migration(). >>>> >>>> Reported-by: kernel test robot >>>> Signed-off-by: Thomas Hellström >>>> --- >>>> drivers/gpu/drm/i915/gem/i915_gem_object.c | 96 >>>> +++++++++++++++++++ >>>> drivers/gpu/drm/i915/gem/i915_gem_object.h | 12 +++ >>>> .../gpu/drm/i915/gem/i915_gem_object_types.h | 9 ++ >>>> drivers/gpu/drm/i915/gem/i915_gem_ttm.c | 69 +++++++++---- >>>> drivers/gpu/drm/i915/gem/i915_gem_wait.c | 19 ++++ >>>> 5 files changed, 188 insertions(+), 17 deletions(-) >>>> >>>> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object.c >>>> b/drivers/gpu/drm/i915/gem/i915_gem_object.c >>>> index 07e8ff9a8aae..1c18be067b58 100644 >>>> --- a/drivers/gpu/drm/i915/gem/i915_gem_object.c >>>> +++ b/drivers/gpu/drm/i915/gem/i915_gem_object.c >>>> @@ -513,6 +513,102 @@ bool i915_gem_object_has_iomem(const struct >>>> drm_i915_gem_object *obj) >>>> return obj->mem_flags & I915_BO_FLAG_IOMEM; >>>> } >>>> >>>> +/** >>>> + * i915_gem_object_can_migrate - Whether an object likely can be >> migrated >>>> + * >>>> + * @obj: The object to migrate >>>> + * @id: The region intended to migrate to >>>> + * >>>> + * Check whether the object backend supports migration to the >>>> + * given region. Note that pinning may affect the ability to migrate. >>>> + * >>>> + * Return: true if migration is possible, false otherwise. >>>> + */ >>>> +bool i915_gem_object_can_migrate(struct drm_i915_gem_object *obj, >>>> + enum intel_region_id id) >>>> +{ >>>> + struct drm_i915_private *i915 = to_i915(obj->base.dev); >>>> + unsigned int num_allowed = obj->mm.n_placements; >>>> + struct intel_memory_region *mr; >>>> + unsigned int i; >>>> + >>>> + GEM_BUG_ON(id >= INTEL_REGION_UNKNOWN); >>>> + GEM_BUG_ON(obj->mm.madv != I915_MADV_WILLNEED); >>>> + >>>> + mr = i915->mm.regions[id]; >>>> + if (!mr) >>>> + return false; >>>> + >>>> + if (obj->mm.region == mr) >>>> + return true; >>>> + >>>> + if (!i915_gem_object_evictable(obj)) >>>> + return false; >>>> + >>>> + if (!obj->ops->migrate) >>>> + return false; >>>> + >>>> + if (!(obj->flags & I915_BO_ALLOC_USER)) >>>> + return true; >>>> + >>>> + if (num_allowed == 0) >>>> + return false; >>>> + >>>> + for (i = 0; i < num_allowed; ++i) { >>>> + if (mr == obj->mm.placements[i]) >>>> + return true; >>>> + } >>> Hi Thomas, >>> >>> I am a little confused over the difference in checks between this function >>> and i915_gem_object_migrate(). >>> >>> Why is the lack of an mr a BUG_ON in _object_migrate(), but here it just >>> false? >>> >>> So that means that under certain circumstances, you could not have a mr? >>> >>> If that is the case, when? >>> >>> Would that be when the I915_BO_ALLOC_USER is set? >>> >>> If so, should there be a check for "non" user vs user? >>> >>> Or maybe document this function pointing out why there are differences >>> and why? >> Yes, I'll give it some more documentation. The basic idea is that the >> above function also could be >> used to validate user supplied data, whereas there might be cases where >> we want to use the gem_object_migrate() function and override the above. >> >> >>>> + return false; >>>> +} >>>> + >>>> +/** >>>> + * i915_gem_object_migrate - Migrate an object to the desired region id >>>> + * @obj: The object to migrate. >>>> + * @ww: An optional struct i915_gem_ww_ctx. If NULL, the backend may >>>> + * not be successful in evicting other objects to make room for this object. >>> Is the ww for future consideration? (I don't see any use of it in the patch). >> Yes, but it will remain optional. >> >> >>>> + * @id: The region id to migrate to. >>>> + * >>>> + * Attempt to migrate the object to the desired memory region. The >>>> + * object backend must support migration and the object may not be >>>> + * pinned, (explicitly pinned pages or pinned vmas). The object must >>>> + * be locked. >>>> + * On successful completion, the object will have pages pointing to >>>> + * memory in the new region, but an async migration task may not have >>>> + * completed yet, and to accomplish that, >>>> i915_gem_object_wait_migration() >>>> + * must be called. >>>> + * >>>> + * Return: 0 on success. Negative error code on failure. In particular may >>>> + * return -ENXIO on lack of region space, -EDEADLK for deadlock >> avoidance >>>> + * if @ww is set, -EINTR or -ERESTARTSYS if signal pending, and >>>> + * -EBUSY if the object is pinned. >>>> + */ >>>> +int i915_gem_object_migrate(struct drm_i915_gem_object *obj, >>>> + struct i915_gem_ww_ctx *ww, >>>> + enum intel_region_id id) >>>> +{ >>>> + struct drm_i915_private *i915 = to_i915(obj->base.dev); >>>> + struct intel_memory_region *mr; >>>> + >>>> + GEM_BUG_ON(id >= INTEL_REGION_UNKNOWN); >>>> + GEM_BUG_ON(obj->mm.madv != I915_MADV_WILLNEED); >>>> + assert_object_held(obj); >>>> + >>>> + mr = i915->mm.regions[id]; >>>> + GEM_BUG_ON(!mr); >>>> + >>>> + if (obj->mm.region == mr) >>>> + return 0; >>>> + >>>> + if (!i915_gem_object_evictable(obj)) >>>> + return -EBUSY; >>>> + >>>> + if (!obj->ops->migrate) >>>> + return -EOPNOTSUPP; >>> Why aren't you using _can_migrate here? >> It's just in case we want to override. I'll add some more comments about >> this. >> >>>> + return obj->ops->migrate(obj, mr); >>>> +} >>>> + >>>> void i915_gem_init__objects(struct drm_i915_private *i915) >>>> { >>>> INIT_WORK(&i915->mm.free_work, __i915_gem_free_work); >>>> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object.h >>>> b/drivers/gpu/drm/i915/gem/i915_gem_object.h >>>> index ea3224a480c4..8cbd7a5334e2 100644 >>>> --- a/drivers/gpu/drm/i915/gem/i915_gem_object.h >>>> +++ b/drivers/gpu/drm/i915/gem/i915_gem_object.h >>>> @@ -17,6 +17,8 @@ >>>> #include "i915_gem_ww.h" >>>> #include "i915_vma_types.h" >>>> >>>> +enum intel_region_id; >>>> + >>>> /* >>>> * XXX: There is a prevalence of the assumption that we fit the >>>> * object's page count inside a 32bit _signed_ variable. Let's document >>>> @@ -597,6 +599,16 @@ bool i915_gem_object_migratable(struct >>>> drm_i915_gem_object *obj); >>>> >>>> bool i915_gem_object_validates_to_lmem(struct drm_i915_gem_object >>>> *obj); >>>> >>>> +int i915_gem_object_migrate(struct drm_i915_gem_object *obj, >>>> + struct i915_gem_ww_ctx *ww, >>>> + enum intel_region_id id); >>>> + >>>> +bool i915_gem_object_can_migrate(struct drm_i915_gem_object *obj, >>>> + enum intel_region_id id); >>>> + >>>> +int i915_gem_object_wait_migration(struct drm_i915_gem_object *obj, >>>> + unsigned int flags); >>>> + >>>> #ifdef CONFIG_MMU_NOTIFIER >>>> static inline bool >>>> i915_gem_object_is_userptr(struct drm_i915_gem_object *obj) >>>> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object_types.h >>>> b/drivers/gpu/drm/i915/gem/i915_gem_object_types.h >>>> index 441f913c87e6..ef3de2ae9723 100644 >>>> --- a/drivers/gpu/drm/i915/gem/i915_gem_object_types.h >>>> +++ b/drivers/gpu/drm/i915/gem/i915_gem_object_types.h >>>> @@ -18,6 +18,7 @@ >>>> >>>> struct drm_i915_gem_object; >>>> struct intel_fronbuffer; >>>> +struct intel_memory_region; >>>> >>>> /* >>>> * struct i915_lut_handle tracks the fast lookups from handle to vma used >>>> @@ -77,6 +78,14 @@ struct drm_i915_gem_object_ops { >>>> * delayed_free - Override the default delayed free implementation >>>> */ >>>> void (*delayed_free)(struct drm_i915_gem_object *obj); >>>> + >>>> + /** >>>> + * migrate - Migrate object to a different region either for >>>> + * pinning or for as long as the object lock is held. >>>> + */ >>>> + int (*migrate)(struct drm_i915_gem_object *obj, >>>> + struct intel_memory_region *mr); >>>> + >>>> void (*release)(struct drm_i915_gem_object *obj); >>>> >>>> const struct vm_operations_struct *mmap_ops; >>>> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_ttm.c >>>> b/drivers/gpu/drm/i915/gem/i915_gem_ttm.c >>>> index c39d982c4fa6..8f89185b6507 100644 >>>> --- a/drivers/gpu/drm/i915/gem/i915_gem_ttm.c >>>> +++ b/drivers/gpu/drm/i915/gem/i915_gem_ttm.c >>>> @@ -617,7 +617,8 @@ struct ttm_device_funcs *i915_ttm_driver(void) >>>> return &i915_ttm_bo_driver; >>>> } >>>> >>>> -static int i915_ttm_get_pages(struct drm_i915_gem_object *obj) >>>> +static int __i915_ttm_get_pages(struct drm_i915_gem_object *obj, >>>> + struct ttm_placement *placement) >>>> { >>>> struct ttm_buffer_object *bo = i915_gem_to_ttm(obj); >>>> struct ttm_operation_ctx ctx = { >>>> @@ -625,19 +626,12 @@ static int i915_ttm_get_pages(struct >>>> drm_i915_gem_object *obj) >>>> .no_wait_gpu = false, >>>> }; >>>> struct sg_table *st; >>>> - struct ttm_place requested, busy[I915_TTM_MAX_PLACEMENTS]; >>>> - struct ttm_placement placement; >>>> int real_num_busy; >>>> int ret; >>>> >>>> - GEM_BUG_ON(obj->mm.n_placements > >>>> I915_TTM_MAX_PLACEMENTS); >>>> - >>>> - /* Move to the requested placement. */ >>>> - i915_ttm_placement_from_obj(obj, &requested, busy, &placement); >>>> - >>>> /* First try only the requested placement. No eviction. */ >>>> - real_num_busy = >>>> fetch_and_zero(&placement.num_busy_placement); >>>> - ret = ttm_bo_validate(bo, &placement, &ctx); >>>> + real_num_busy = fetch_and_zero(&placement- >>>>> num_busy_placement); >>>> + ret = ttm_bo_validate(bo, placement, &ctx); >>>> if (ret) { >>>> ret = i915_ttm_err_to_gem(ret); >>>> /* >>>> @@ -652,8 +646,8 @@ static int i915_ttm_get_pages(struct >>>> drm_i915_gem_object *obj) >>>> * If the initial attempt fails, allow all accepted placements, >>>> * evicting if necessary. >>>> */ >>>> - placement.num_busy_placement = real_num_busy; >>>> - ret = ttm_bo_validate(bo, &placement, &ctx); >>>> + placement->num_busy_placement = real_num_busy; >>>> + ret = ttm_bo_validate(bo, placement, &ctx); >>>> if (ret) >>>> return i915_ttm_err_to_gem(ret); >>>> } >>>> @@ -668,16 +662,56 @@ static int i915_ttm_get_pages(struct >>>> drm_i915_gem_object *obj) >>>> i915_ttm_adjust_gem_after_move(obj); >>>> } >>>> >>>> - /* Object either has a page vector or is an iomem object */ >>>> - st = bo->ttm ? i915_ttm_tt_get_st(bo->ttm) : obj->ttm.cached_io_st; >>>> - if (IS_ERR(st)) >>>> - return PTR_ERR(st); >>>> + if (!obj->mm.pages) { >>>> + /* Object either has a page vector or is an iomem object */ >>>> + st = bo->ttm ? i915_ttm_tt_get_st(bo->ttm) : obj- >>>>> ttm.cached_io_st; >>>> + if (IS_ERR(st)) >>>> + return PTR_ERR(st); >>>> >>>> - __i915_gem_object_set_pages(obj, st, i915_sg_dma_sizes(st->sgl)); >>>> + __i915_gem_object_set_pages(obj, st, >>>> i915_sg_dma_sizes(st->sgl)); >>>> + } >>>> >>>> return ret; >>>> } >>>> >>>> +static int i915_ttm_get_pages(struct drm_i915_gem_object *obj) >>>> +{ >>>> + struct ttm_place requested, busy[I915_TTM_MAX_PLACEMENTS]; >>>> + struct ttm_placement placement; >>>> + >>>> + GEM_BUG_ON(obj->mm.n_placements > >>>> I915_TTM_MAX_PLACEMENTS); >>>> + >>>> + /* Move to the requested placement. */ >>>> + i915_ttm_placement_from_obj(obj, &requested, busy, &placement); >>>> + >>>> + return __i915_ttm_get_pages(obj, &placement); >>>> +} >>>> + >>>> +static int i915_ttm_migrate(struct drm_i915_gem_object *obj, >>>> + struct intel_memory_region *mr) >>>> +{ >>>> + struct ttm_place requested; >>>> + struct ttm_placement placement; >>>> + int ret; >>>> + >>>> + i915_ttm_place_from_region(mr, &requested, obj->flags); >>>> + placement.num_placement = 1; >>>> + placement.num_busy_placement = 1; >>>> + placement.placement = &requested; >>>> + placement.busy_placement = &requested; >>>> + >>>> + ret = __i915_ttm_get_pages(obj, &placement); >>>> + if (ret) >>>> + return ret; >>>> + >>>> + if (obj->mm.region != mr) { >>>> + i915_gem_object_release_memory_region(obj); >>>> + i915_gem_object_init_memory_region(obj, mr); >>>> + } >>> Perhaps a minor nit: >>> >>> Doing this after we have done the _get_pages() just doesn't seem right. >>> >>> I.e. we do work on the object, and then we init some portion of it. >>> >>> Do we need to do this incase the migration/placement fails? If so, >>> maybe a comment to that effect? >> This is simply switching memory region under the lock, and to also move >> to another memory region list. Is it the naming _release_ and _init_ >> that is confusing? > Hmm, re-reading my question, I am wondering if I was unclear. > > My "real" question was, can the release/init occur before the _get_pages()? > > But looking at this some more, I can see answer is probably no. > > I was going to suggest calling _init_ _set_, but when I looked at it, it was > doing init things as well as setting things > > Maybe just a comment like: > > /* Complete the migration by updating the memory region info. */ > if (object->mm...) Sure, I'll add that. Note that another thread would have to take the object lock anyway to inspect both the region and the pages, so it shouldn't be confused by the order here. /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 A246AC11F64 for ; Mon, 28 Jun 2021 19:54: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 27E1E61CA3 for ; Mon, 28 Jun 2021 19:54:36 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 27E1E61CA3 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 8485C6E550; Mon, 28 Jun 2021 19:54:35 +0000 (UTC) Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) by gabe.freedesktop.org (Postfix) with ESMTPS id 513A66E54C; Mon, 28 Jun 2021 19:54:34 +0000 (UTC) X-IronPort-AV: E=McAfee;i="6200,9189,10029"; a="206200489" X-IronPort-AV: E=Sophos;i="5.83,306,1616482800"; d="scan'208";a="206200489" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jun 2021 12:54:32 -0700 X-IronPort-AV: E=Sophos;i="5.83,306,1616482800"; d="scan'208";a="641032875" 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:54:30 -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-2-thomas.hellstrom@linux.intel.com> <6ea416ea-b2d8-1485-6375-52810699f838@linux.intel.com> <615aebfc2bfd45dc836e798182501ef3@intel.com> From: =?UTF-8?Q?Thomas_Hellstr=c3=b6m?= Message-ID: <3d6bcd4e-0d9a-b5b8-04e0-0361c4bef92d@linux.intel.com> Date: Mon, 28 Jun 2021 21:54:29 +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: <615aebfc2bfd45dc836e798182501ef3@intel.com> Content-Language: en-US Subject: Re: [Intel-gfx] [PATCH v3 1/5] drm/i915/gem: Implement object migration 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" Ck9uIDYvMjgvMjEgOTo1MCBQTSwgUnVobCwgTWljaGFlbCBKIHdyb3RlOgo+PiAtLS0tLU9yaWdp bmFsIE1lc3NhZ2UtLS0tLQo+PiBGcm9tOiBUaG9tYXMgSGVsbHN0csO2bSA8dGhvbWFzLmhlbGxz dHJvbUBsaW51eC5pbnRlbC5jb20+Cj4+IFNlbnQ6IE1vbmRheSwgSnVuZSAyOCwgMjAyMSAzOjAz IFBNCj4+IFRvOiBSdWhsLCBNaWNoYWVsIEogPG1pY2hhZWwuai5ydWhsQGludGVsLmNvbT47IGlu dGVsLQo+PiBnZnhAbGlzdHMuZnJlZWRlc2t0b3Aub3JnOyBkcmktZGV2ZWxAbGlzdHMuZnJlZWRl c2t0b3Aub3JnCj4+IENjOiBBdWxkLCBNYXR0aGV3IDxtYXR0aGV3LmF1bGRAaW50ZWwuY29tPjsg bGtwIDxsa3BAaW50ZWwuY29tPgo+PiBTdWJqZWN0OiBSZTogW1BBVENIIHYzIDEvNV0gZHJtL2k5 MTUvZ2VtOiBJbXBsZW1lbnQgb2JqZWN0IG1pZ3JhdGlvbgo+Pgo+Pgo+PiBPbiA2LzI4LzIxIDg6 MTEgUE0sIFJ1aGwsIE1pY2hhZWwgSiB3cm90ZToKPj4+PiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2Ut LS0tLQo+Pj4+IEZyb206IGRyaS1kZXZlbCA8ZHJpLWRldmVsLWJvdW5jZXNAbGlzdHMuZnJlZWRl c2t0b3Aub3JnPiBPbiBCZWhhbGYgT2YKPj4+PiBUaG9tYXMgSGVsbHN0csO2bQo+Pj4+IFNlbnQ6 IE1vbmRheSwgSnVuZSAyOCwgMjAyMSAxMDo0NiBBTQo+Pj4+IFRvOiBpbnRlbC1nZnhAbGlzdHMu ZnJlZWRlc2t0b3Aub3JnOyBkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCj4+Pj4gQ2M6 IFRob21hcyBIZWxsc3Ryw7ZtIDx0aG9tYXMuaGVsbHN0cm9tQGxpbnV4LmludGVsLmNvbT47IEF1 bGQsCj4+IE1hdHRoZXcKPj4+PiA8bWF0dGhldy5hdWxkQGludGVsLmNvbT47IGxrcCA8bGtwQGlu dGVsLmNvbT4KPj4+PiBTdWJqZWN0OiBbUEFUQ0ggdjMgMS81XSBkcm0vaTkxNS9nZW06IEltcGxl bWVudCBvYmplY3QgbWlncmF0aW9uCj4+Pj4KPj4+PiBJbnRyb2R1Y2UgYW4gaW50ZXJmYWNlIHRv IG1pZ3JhdGUgb2JqZWN0cyBiZXR3ZWVuIHJlZ2lvbnMuCj4+Pj4gVGhpcyBpcyBwcmltYXJpbHkg aW50ZW5kZWQgdG8gbWlncmF0ZSBvYmplY3RzIHRvIExNRU0gZm9yIGRpc3BsYXkgYW5kCj4+Pj4g dG8gU1lTVEVNIGZvciBkbWEtYnVmLCBidXQgbWlnaHQgYmUgcmV1c2VkIGluIG9uZSBmb3JtIG9y IGFub3RoZXIgZm9yCj4+Pj4gcGVyZm9ybWFuY2UtYmFzZWQgbWlncmF0aW9uLgo+Pj4+Cj4+Pj4g djI6Cj4+Pj4gLSBWZXJpZnkgdGhhdCB0aGUgbWVtb3J5IHJlZ2lvbiBnaXZlbiBhcyBhbiBpZCBy ZWFsbHkgZXhpc3RzLgo+Pj4+ICAgIChSZXBvcnRlZCBieSBNYXR0aGV3IEF1bGQpCj4+Pj4gLSBD YWxsIGk5MTVfZ2VtX29iamVjdF97aW5pdCxyZWxlYXNlfV9tZW1vcnlfcmVnaW9uKCkgd2hlbiBz d2l0Y2hpbmcKPj4+PiByZWdpb24KPj4+PiAgICB0byBoYW5kbGUgYWxzbyBzd2l0Y2hpbmcgcmVn aW9uIGxpc3RzLiAoUmVwb3J0ZWQgYnkgTWF0dGhldyBBdWxkKQo+Pj4+IHYzOgo+Pj4+IC0gRml4 IGk5MTVfZ2VtX29iamVjdF9jYW5fbWlncmF0ZSgpIHRvIHJldHVybiB0cnVlIGlmIG9iamVjdCBp cyBhbHJlYWR5IGluCj4+Pj4gICAgdGhlIGNvcnJlY3QgcmVnaW9uLCBldmVuIGlmIHRoZSBvYmpl Y3Qgb3BzIGRvZXNuJ3QgaGF2ZSBhIG1pZ3JhdGUoKQo+Pj4+ICAgIGNhbGxiYWNrLgo+Pj4+IC0g VXBkYXRlIHR5cG8gaW4gY29tbWl0IG1lc3NhZ2UuCj4+Pj4gLSBGaXgga2VybmVsZG9jIG9mIGk5 MTVfZ2VtX29iamVjdF93YWl0X21pZ3JhdGlvbigpLgo+Pj4+Cj4+Pj4gUmVwb3J0ZWQtYnk6IGtl cm5lbCB0ZXN0IHJvYm90IDxsa3BAaW50ZWwuY29tPgo+Pj4+IFNpZ25lZC1vZmYtYnk6IFRob21h cyBIZWxsc3Ryw7ZtIDx0aG9tYXMuaGVsbHN0cm9tQGxpbnV4LmludGVsLmNvbT4KPj4+PiAtLS0K Pj4+PiBkcml2ZXJzL2dwdS9kcm0vaTkxNS9nZW0vaTkxNV9nZW1fb2JqZWN0LmMgICAgfCA5Ngo+ Pj4+ICsrKysrKysrKysrKysrKysrKysKPj4+PiBkcml2ZXJzL2dwdS9kcm0vaTkxNS9nZW0vaTkx NV9nZW1fb2JqZWN0LmggICAgfCAxMiArKysKPj4+PiAuLi4vZ3B1L2RybS9pOTE1L2dlbS9pOTE1 X2dlbV9vYmplY3RfdHlwZXMuaCAgfCAgOSArKwo+Pj4+IGRyaXZlcnMvZ3B1L2RybS9pOTE1L2dl bS9pOTE1X2dlbV90dG0uYyAgICAgICB8IDY5ICsrKysrKysrKy0tLS0KPj4+PiBkcml2ZXJzL2dw dS9kcm0vaTkxNS9nZW0vaTkxNV9nZW1fd2FpdC5jICAgICAgfCAxOSArKysrCj4+Pj4gNSBmaWxl cyBjaGFuZ2VkLCAxODggaW5zZXJ0aW9ucygrKSwgMTcgZGVsZXRpb25zKC0pCj4+Pj4KPj4+PiBk aWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX29iamVjdC5jCj4+ Pj4gYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9nZW0vaTkxNV9nZW1fb2JqZWN0LmMKPj4+PiBpbmRl eCAwN2U4ZmY5YThhYWUuLjFjMThiZTA2N2I1OCAxMDA2NDQKPj4+PiAtLS0gYS9kcml2ZXJzL2dw dS9kcm0vaTkxNS9nZW0vaTkxNV9nZW1fb2JqZWN0LmMKPj4+PiArKysgYi9kcml2ZXJzL2dwdS9k cm0vaTkxNS9nZW0vaTkxNV9nZW1fb2JqZWN0LmMKPj4+PiBAQCAtNTEzLDYgKzUxMywxMDIgQEAg Ym9vbCBpOTE1X2dlbV9vYmplY3RfaGFzX2lvbWVtKGNvbnN0IHN0cnVjdAo+Pj4+IGRybV9pOTE1 X2dlbV9vYmplY3QgKm9iaikKPj4+PiAJcmV0dXJuIG9iai0+bWVtX2ZsYWdzICYgSTkxNV9CT19G TEFHX0lPTUVNOwo+Pj4+IH0KPj4+Pgo+Pj4+ICsvKioKPj4+PiArICogaTkxNV9nZW1fb2JqZWN0 X2Nhbl9taWdyYXRlIC0gV2hldGhlciBhbiBvYmplY3QgbGlrZWx5IGNhbiBiZQo+PiBtaWdyYXRl ZAo+Pj4+ICsgKgo+Pj4+ICsgKiBAb2JqOiBUaGUgb2JqZWN0IHRvIG1pZ3JhdGUKPj4+PiArICog QGlkOiBUaGUgcmVnaW9uIGludGVuZGVkIHRvIG1pZ3JhdGUgdG8KPj4+PiArICoKPj4+PiArICog Q2hlY2sgd2hldGhlciB0aGUgb2JqZWN0IGJhY2tlbmQgc3VwcG9ydHMgbWlncmF0aW9uIHRvIHRo ZQo+Pj4+ICsgKiBnaXZlbiByZWdpb24uIE5vdGUgdGhhdCBwaW5uaW5nIG1heSBhZmZlY3QgdGhl IGFiaWxpdHkgdG8gbWlncmF0ZS4KPj4+PiArICoKPj4+PiArICogUmV0dXJuOiB0cnVlIGlmIG1p Z3JhdGlvbiBpcyBwb3NzaWJsZSwgZmFsc2Ugb3RoZXJ3aXNlLgo+Pj4+ICsgKi8KPj4+PiArYm9v bCBpOTE1X2dlbV9vYmplY3RfY2FuX21pZ3JhdGUoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3Qg Km9iaiwKPj4+PiArCQkJCSBlbnVtIGludGVsX3JlZ2lvbl9pZCBpZCkKPj4+PiArewo+Pj4+ICsJ c3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUgPSB0b19pOTE1KG9iai0+YmFzZS5kZXYpOwo+ Pj4+ICsJdW5zaWduZWQgaW50IG51bV9hbGxvd2VkID0gb2JqLT5tbS5uX3BsYWNlbWVudHM7Cj4+ Pj4gKwlzdHJ1Y3QgaW50ZWxfbWVtb3J5X3JlZ2lvbiAqbXI7Cj4+Pj4gKwl1bnNpZ25lZCBpbnQg aTsKPj4+PiArCj4+Pj4gKwlHRU1fQlVHX09OKGlkID49IElOVEVMX1JFR0lPTl9VTktOT1dOKTsK Pj4+PiArCUdFTV9CVUdfT04ob2JqLT5tbS5tYWR2ICE9IEk5MTVfTUFEVl9XSUxMTkVFRCk7Cj4+ Pj4gKwo+Pj4+ICsJbXIgPSBpOTE1LT5tbS5yZWdpb25zW2lkXTsKPj4+PiArCWlmICghbXIpCj4+ Pj4gKwkJcmV0dXJuIGZhbHNlOwo+Pj4+ICsKPj4+PiArCWlmIChvYmotPm1tLnJlZ2lvbiA9PSBt cikKPj4+PiArCQlyZXR1cm4gdHJ1ZTsKPj4+PiArCj4+Pj4gKwlpZiAoIWk5MTVfZ2VtX29iamVj dF9ldmljdGFibGUob2JqKSkKPj4+PiArCQlyZXR1cm4gZmFsc2U7Cj4+Pj4gKwo+Pj4+ICsJaWYg KCFvYmotPm9wcy0+bWlncmF0ZSkKPj4+PiArCQlyZXR1cm4gZmFsc2U7Cj4+Pj4gKwo+Pj4+ICsJ aWYgKCEob2JqLT5mbGFncyAmIEk5MTVfQk9fQUxMT0NfVVNFUikpCj4+Pj4gKwkJcmV0dXJuIHRy dWU7Cj4+Pj4gKwo+Pj4+ICsJaWYgKG51bV9hbGxvd2VkID09IDApCj4+Pj4gKwkJcmV0dXJuIGZh bHNlOwo+Pj4+ICsKPj4+PiArCWZvciAoaSA9IDA7IGkgPCBudW1fYWxsb3dlZDsgKytpKSB7Cj4+ Pj4gKwkJaWYgKG1yID09IG9iai0+bW0ucGxhY2VtZW50c1tpXSkKPj4+PiArCQkJcmV0dXJuIHRy dWU7Cj4+Pj4gKwl9Cj4+PiBIaSBUaG9tYXMsCj4+Pgo+Pj4gSSBhbSBhIGxpdHRsZSBjb25mdXNl ZCBvdmVyIHRoZSBkaWZmZXJlbmNlIGluIGNoZWNrcyBiZXR3ZWVuIHRoaXMgZnVuY3Rpb24KPj4+ IGFuZCBpOTE1X2dlbV9vYmplY3RfbWlncmF0ZSgpLgo+Pj4KPj4+IFdoeSBpcyB0aGUgbGFjayBv ZiBhbiBtciBhIEJVR19PTiBpbiBfb2JqZWN0X21pZ3JhdGUoKSwgYnV0IGhlcmUgaXQganVzdAo+ Pj4gZmFsc2U/Cj4+Pgo+Pj4gU28gdGhhdCBtZWFucyB0aGF0IHVuZGVyIGNlcnRhaW4gY2lyY3Vt c3RhbmNlcywgeW91IGNvdWxkIG5vdCBoYXZlIGEgbXI/Cj4+Pgo+Pj4gSWYgdGhhdCBpcyB0aGUg Y2FzZSwgd2hlbj8KPj4+Cj4+PiBXb3VsZCB0aGF0IGJlIHdoZW4gdGhlIEk5MTVfQk9fQUxMT0Nf VVNFUiBpcyBzZXQ/Cj4+Pgo+Pj4gSWYgc28sIHNob3VsZCB0aGVyZSBiZSBhIGNoZWNrIGZvciAi bm9uIiB1c2VyIHZzIHVzZXI/Cj4+Pgo+Pj4gT3IgbWF5YmUgZG9jdW1lbnQgdGhpcyBmdW5jdGlv biBwb2ludGluZyBvdXQgd2h5IHRoZXJlIGFyZSBkaWZmZXJlbmNlcwo+Pj4gYW5kIHdoeT8KPj4g WWVzLCBJJ2xsIGdpdmUgaXQgc29tZSBtb3JlIGRvY3VtZW50YXRpb24uIFRoZSBiYXNpYyBpZGVh IGlzIHRoYXQgdGhlCj4+IGFib3ZlIGZ1bmN0aW9uIGFsc28gY291bGQgYmUKPj4gdXNlZCB0byB2 YWxpZGF0ZSB1c2VyIHN1cHBsaWVkIGRhdGEsIHdoZXJlYXMgdGhlcmUgbWlnaHQgYmUgY2FzZXMg d2hlcmUKPj4gd2Ugd2FudCB0byB1c2UgdGhlIGdlbV9vYmplY3RfbWlncmF0ZSgpIGZ1bmN0aW9u IGFuZCBvdmVycmlkZSB0aGUgYWJvdmUuCj4+Cj4+Cj4+Pj4gKwlyZXR1cm4gZmFsc2U7Cj4+Pj4g K30KPj4+PiArCj4+Pj4gKy8qKgo+Pj4+ICsgKiBpOTE1X2dlbV9vYmplY3RfbWlncmF0ZSAtIE1p Z3JhdGUgYW4gb2JqZWN0IHRvIHRoZSBkZXNpcmVkIHJlZ2lvbiBpZAo+Pj4+ICsgKiBAb2JqOiBU aGUgb2JqZWN0IHRvIG1pZ3JhdGUuCj4+Pj4gKyAqIEB3dzogQW4gb3B0aW9uYWwgc3RydWN0IGk5 MTVfZ2VtX3d3X2N0eC4gSWYgTlVMTCwgdGhlIGJhY2tlbmQgbWF5Cj4+Pj4gKyAqIG5vdCBiZSBz dWNjZXNzZnVsIGluIGV2aWN0aW5nIG90aGVyIG9iamVjdHMgdG8gbWFrZSByb29tIGZvciB0aGlz IG9iamVjdC4KPj4+IElzIHRoZSB3dyBmb3IgZnV0dXJlIGNvbnNpZGVyYXRpb24/ICAoSSBkb24n dCBzZWUgYW55IHVzZSBvZiBpdCBpbiB0aGUgcGF0Y2gpLgo+PiBZZXMsIGJ1dCBpdCB3aWxsIHJl bWFpbiBvcHRpb25hbC4KPj4KPj4KPj4+PiArICogQGlkOiBUaGUgcmVnaW9uIGlkIHRvIG1pZ3Jh dGUgdG8uCj4+Pj4gKyAqCj4+Pj4gKyAqIEF0dGVtcHQgdG8gbWlncmF0ZSB0aGUgb2JqZWN0IHRv IHRoZSBkZXNpcmVkIG1lbW9yeSByZWdpb24uIFRoZQo+Pj4+ICsgKiBvYmplY3QgYmFja2VuZCBt dXN0IHN1cHBvcnQgbWlncmF0aW9uIGFuZCB0aGUgb2JqZWN0IG1heSBub3QgYmUKPj4+PiArICog cGlubmVkLCAoZXhwbGljaXRseSBwaW5uZWQgcGFnZXMgb3IgcGlubmVkIHZtYXMpLiBUaGUgb2Jq ZWN0IG11c3QKPj4+PiArICogYmUgbG9ja2VkLgo+Pj4+ICsgKiBPbiBzdWNjZXNzZnVsIGNvbXBs ZXRpb24sIHRoZSBvYmplY3Qgd2lsbCBoYXZlIHBhZ2VzIHBvaW50aW5nIHRvCj4+Pj4gKyAqIG1l bW9yeSBpbiB0aGUgbmV3IHJlZ2lvbiwgYnV0IGFuIGFzeW5jIG1pZ3JhdGlvbiB0YXNrIG1heSBu b3QgaGF2ZQo+Pj4+ICsgKiBjb21wbGV0ZWQgeWV0LCBhbmQgdG8gYWNjb21wbGlzaCB0aGF0LAo+ Pj4+IGk5MTVfZ2VtX29iamVjdF93YWl0X21pZ3JhdGlvbigpCj4+Pj4gKyAqIG11c3QgYmUgY2Fs bGVkLgo+Pj4+ICsgKgo+Pj4+ICsgKiBSZXR1cm46IDAgb24gc3VjY2Vzcy4gTmVnYXRpdmUgZXJy b3IgY29kZSBvbiBmYWlsdXJlLiBJbiBwYXJ0aWN1bGFyIG1heQo+Pj4+ICsgKiByZXR1cm4gLUVO WElPIG9uIGxhY2sgb2YgcmVnaW9uIHNwYWNlLCAtRURFQURMSyBmb3IgZGVhZGxvY2sKPj4gYXZv aWRhbmNlCj4+Pj4gKyAqIGlmIEB3dyBpcyBzZXQsIC1FSU5UUiBvciAtRVJFU1RBUlRTWVMgaWYg c2lnbmFsIHBlbmRpbmcsIGFuZAo+Pj4+ICsgKiAtRUJVU1kgaWYgdGhlIG9iamVjdCBpcyBwaW5u ZWQuCj4+Pj4gKyAqLwo+Pj4+ICtpbnQgaTkxNV9nZW1fb2JqZWN0X21pZ3JhdGUoc3RydWN0IGRy bV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKPj4+PiArCQkJICAgIHN0cnVjdCBpOTE1X2dlbV93d19j dHggKnd3LAo+Pj4+ICsJCQkgICAgZW51bSBpbnRlbF9yZWdpb25faWQgaWQpCj4+Pj4gK3sKPj4+ PiArCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1ID0gdG9faTkxNShvYmotPmJhc2UuZGV2 KTsKPj4+PiArCXN0cnVjdCBpbnRlbF9tZW1vcnlfcmVnaW9uICptcjsKPj4+PiArCj4+Pj4gKwlH RU1fQlVHX09OKGlkID49IElOVEVMX1JFR0lPTl9VTktOT1dOKTsKPj4+PiArCUdFTV9CVUdfT04o b2JqLT5tbS5tYWR2ICE9IEk5MTVfTUFEVl9XSUxMTkVFRCk7Cj4+Pj4gKwlhc3NlcnRfb2JqZWN0 X2hlbGQob2JqKTsKPj4+PiArCj4+Pj4gKwltciA9IGk5MTUtPm1tLnJlZ2lvbnNbaWRdOwo+Pj4+ ICsJR0VNX0JVR19PTighbXIpOwo+Pj4+ICsKPj4+PiArCWlmIChvYmotPm1tLnJlZ2lvbiA9PSBt cikKPj4+PiArCQlyZXR1cm4gMDsKPj4+PiArCj4+Pj4gKwlpZiAoIWk5MTVfZ2VtX29iamVjdF9l dmljdGFibGUob2JqKSkKPj4+PiArCQlyZXR1cm4gLUVCVVNZOwo+Pj4+ICsKPj4+PiArCWlmICgh b2JqLT5vcHMtPm1pZ3JhdGUpCj4+Pj4gKwkJcmV0dXJuIC1FT1BOT1RTVVBQOwo+Pj4gV2h5IGFy ZW4ndCB5b3UgdXNpbmcgX2Nhbl9taWdyYXRlIGhlcmU/Cj4+IEl0J3MganVzdCBpbiBjYXNlIHdl IHdhbnQgdG8gb3ZlcnJpZGUuIEknbGwgYWRkIHNvbWUgbW9yZSBjb21tZW50cyBhYm91dAo+PiB0 aGlzLgo+Pgo+Pj4+ICsJcmV0dXJuIG9iai0+b3BzLT5taWdyYXRlKG9iaiwgbXIpOwo+Pj4+ICt9 Cj4+Pj4gKwo+Pj4+IHZvaWQgaTkxNV9nZW1faW5pdF9fb2JqZWN0cyhzdHJ1Y3QgZHJtX2k5MTVf cHJpdmF0ZSAqaTkxNSkKPj4+PiB7Cj4+Pj4gCUlOSVRfV09SSygmaTkxNS0+bW0uZnJlZV93b3Jr LCBfX2k5MTVfZ2VtX2ZyZWVfd29yayk7Cj4+Pj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2Ry bS9pOTE1L2dlbS9pOTE1X2dlbV9vYmplY3QuaAo+Pj4+IGIvZHJpdmVycy9ncHUvZHJtL2k5MTUv Z2VtL2k5MTVfZ2VtX29iamVjdC5oCj4+Pj4gaW5kZXggZWEzMjI0YTQ4MGM0Li44Y2JkN2E1MzM0 ZTIgMTAwNjQ0Cj4+Pj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX29i amVjdC5oCj4+Pj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX29iamVj dC5oCj4+Pj4gQEAgLTE3LDYgKzE3LDggQEAKPj4+PiAjaW5jbHVkZSAiaTkxNV9nZW1fd3cuaCIK Pj4+PiAjaW5jbHVkZSAiaTkxNV92bWFfdHlwZXMuaCIKPj4+Pgo+Pj4+ICtlbnVtIGludGVsX3Jl Z2lvbl9pZDsKPj4+PiArCj4+Pj4gLyoKPj4+PiAgICAqIFhYWDogVGhlcmUgaXMgYSBwcmV2YWxl bmNlIG9mIHRoZSBhc3N1bXB0aW9uIHRoYXQgd2UgZml0IHRoZQo+Pj4+ICAgICogb2JqZWN0J3Mg cGFnZSBjb3VudCBpbnNpZGUgYSAzMmJpdCBfc2lnbmVkXyB2YXJpYWJsZS4gTGV0J3MgZG9jdW1l bnQKPj4+PiBAQCAtNTk3LDYgKzU5OSwxNiBAQCBib29sIGk5MTVfZ2VtX29iamVjdF9taWdyYXRh YmxlKHN0cnVjdAo+Pj4+IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaik7Cj4+Pj4KPj4+PiBib29s IGk5MTVfZ2VtX29iamVjdF92YWxpZGF0ZXNfdG9fbG1lbShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29i amVjdAo+Pj4+ICpvYmopOwo+Pj4+Cj4+Pj4gK2ludCBpOTE1X2dlbV9vYmplY3RfbWlncmF0ZShz dHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAo+Pj4+ICsJCQkgICAgc3RydWN0IGk5MTVf Z2VtX3d3X2N0eCAqd3csCj4+Pj4gKwkJCSAgICBlbnVtIGludGVsX3JlZ2lvbl9pZCBpZCk7Cj4+ Pj4gKwo+Pj4+ICtib29sIGk5MTVfZ2VtX29iamVjdF9jYW5fbWlncmF0ZShzdHJ1Y3QgZHJtX2k5 MTVfZ2VtX29iamVjdCAqb2JqLAo+Pj4+ICsJCQkJIGVudW0gaW50ZWxfcmVnaW9uX2lkIGlkKTsK Pj4+PiArCj4+Pj4gK2ludCBpOTE1X2dlbV9vYmplY3Rfd2FpdF9taWdyYXRpb24oc3RydWN0IGRy bV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKPj4+PiArCQkJCSAgIHVuc2lnbmVkIGludCBmbGFncyk7 Cj4+Pj4gKwo+Pj4+ICNpZmRlZiBDT05GSUdfTU1VX05PVElGSUVSCj4+Pj4gc3RhdGljIGlubGlu ZSBib29sCj4+Pj4gaTkxNV9nZW1fb2JqZWN0X2lzX3VzZXJwdHIoc3RydWN0IGRybV9pOTE1X2dl bV9vYmplY3QgKm9iaikKPj4+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2Vt L2k5MTVfZ2VtX29iamVjdF90eXBlcy5oCj4+Pj4gYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9nZW0v aTkxNV9nZW1fb2JqZWN0X3R5cGVzLmgKPj4+PiBpbmRleCA0NDFmOTEzYzg3ZTYuLmVmM2RlMmFl OTcyMyAxMDA2NDQKPj4+PiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9nZW0vaTkxNV9nZW1f b2JqZWN0X3R5cGVzLmgKPj4+PiArKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9nZW0vaTkxNV9n ZW1fb2JqZWN0X3R5cGVzLmgKPj4+PiBAQCAtMTgsNiArMTgsNyBAQAo+Pj4+Cj4+Pj4gc3RydWN0 IGRybV9pOTE1X2dlbV9vYmplY3Q7Cj4+Pj4gc3RydWN0IGludGVsX2Zyb25idWZmZXI7Cj4+Pj4g K3N0cnVjdCBpbnRlbF9tZW1vcnlfcmVnaW9uOwo+Pj4+Cj4+Pj4gLyoKPj4+PiAgICAqIHN0cnVj dCBpOTE1X2x1dF9oYW5kbGUgdHJhY2tzIHRoZSBmYXN0IGxvb2t1cHMgZnJvbSBoYW5kbGUgdG8g dm1hIHVzZWQKPj4+PiBAQCAtNzcsNiArNzgsMTQgQEAgc3RydWN0IGRybV9pOTE1X2dlbV9vYmpl Y3Rfb3BzIHsKPj4+PiAJICogZGVsYXllZF9mcmVlIC0gT3ZlcnJpZGUgdGhlIGRlZmF1bHQgZGVs YXllZCBmcmVlIGltcGxlbWVudGF0aW9uCj4+Pj4gCSAqLwo+Pj4+IAl2b2lkICgqZGVsYXllZF9m cmVlKShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKTsKPj4+PiArCj4+Pj4gKwkvKioK Pj4+PiArCSAqIG1pZ3JhdGUgLSBNaWdyYXRlIG9iamVjdCB0byBhIGRpZmZlcmVudCByZWdpb24g ZWl0aGVyIGZvcgo+Pj4+ICsJICogcGlubmluZyBvciBmb3IgYXMgbG9uZyBhcyB0aGUgb2JqZWN0 IGxvY2sgaXMgaGVsZC4KPj4+PiArCSAqLwo+Pj4+ICsJaW50ICgqbWlncmF0ZSkoc3RydWN0IGRy bV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKPj4+PiArCQkgICAgICAgc3RydWN0IGludGVsX21lbW9y eV9yZWdpb24gKm1yKTsKPj4+PiArCj4+Pj4gCXZvaWQgKCpyZWxlYXNlKShzdHJ1Y3QgZHJtX2k5 MTVfZ2VtX29iamVjdCAqb2JqKTsKPj4+Pgo+Pj4+IAljb25zdCBzdHJ1Y3Qgdm1fb3BlcmF0aW9u c19zdHJ1Y3QgKm1tYXBfb3BzOwo+Pj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkx NS9nZW0vaTkxNV9nZW1fdHRtLmMKPj4+PiBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2dlbS9pOTE1 X2dlbV90dG0uYwo+Pj4+IGluZGV4IGMzOWQ5ODJjNGZhNi4uOGY4OTE4NWI2NTA3IDEwMDY0NAo+ Pj4+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2dlbS9pOTE1X2dlbV90dG0uYwo+Pj4+ICsr KyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2dlbS9pOTE1X2dlbV90dG0uYwo+Pj4+IEBAIC02MTcs NyArNjE3LDggQEAgc3RydWN0IHR0bV9kZXZpY2VfZnVuY3MgKmk5MTVfdHRtX2RyaXZlcih2b2lk KQo+Pj4+IAlyZXR1cm4gJmk5MTVfdHRtX2JvX2RyaXZlcjsKPj4+PiB9Cj4+Pj4KPj4+PiAtc3Rh dGljIGludCBpOTE1X3R0bV9nZXRfcGFnZXMoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9i aikKPj4+PiArc3RhdGljIGludCBfX2k5MTVfdHRtX2dldF9wYWdlcyhzdHJ1Y3QgZHJtX2k5MTVf Z2VtX29iamVjdCAqb2JqLAo+Pj4+ICsJCQkJc3RydWN0IHR0bV9wbGFjZW1lbnQgKnBsYWNlbWVu dCkKPj4+PiB7Cj4+Pj4gCXN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8gPSBpOTE1X2dlbV90 b190dG0ob2JqKTsKPj4+PiAJc3RydWN0IHR0bV9vcGVyYXRpb25fY3R4IGN0eCA9IHsKPj4+PiBA QCAtNjI1LDE5ICs2MjYsMTIgQEAgc3RhdGljIGludCBpOTE1X3R0bV9nZXRfcGFnZXMoc3RydWN0 Cj4+Pj4gZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQo+Pj4+IAkJLm5vX3dhaXRfZ3B1ID0gZmFs c2UsCj4+Pj4gCX07Cj4+Pj4gCXN0cnVjdCBzZ190YWJsZSAqc3Q7Cj4+Pj4gLQlzdHJ1Y3QgdHRt X3BsYWNlIHJlcXVlc3RlZCwgYnVzeVtJOTE1X1RUTV9NQVhfUExBQ0VNRU5UU107Cj4+Pj4gLQlz dHJ1Y3QgdHRtX3BsYWNlbWVudCBwbGFjZW1lbnQ7Cj4+Pj4gCWludCByZWFsX251bV9idXN5Owo+ Pj4+IAlpbnQgcmV0Owo+Pj4+Cj4+Pj4gLQlHRU1fQlVHX09OKG9iai0+bW0ubl9wbGFjZW1lbnRz ID4KPj4+PiBJOTE1X1RUTV9NQVhfUExBQ0VNRU5UUyk7Cj4+Pj4gLQo+Pj4+IC0JLyogTW92ZSB0 byB0aGUgcmVxdWVzdGVkIHBsYWNlbWVudC4gKi8KPj4+PiAtCWk5MTVfdHRtX3BsYWNlbWVudF9m cm9tX29iaihvYmosICZyZXF1ZXN0ZWQsIGJ1c3ksICZwbGFjZW1lbnQpOwo+Pj4+IC0KPj4+PiAJ LyogRmlyc3QgdHJ5IG9ubHkgdGhlIHJlcXVlc3RlZCBwbGFjZW1lbnQuIE5vIGV2aWN0aW9uLiAq Lwo+Pj4+IC0JcmVhbF9udW1fYnVzeSA9Cj4+Pj4gZmV0Y2hfYW5kX3plcm8oJnBsYWNlbWVudC5u dW1fYnVzeV9wbGFjZW1lbnQpOwo+Pj4+IC0JcmV0ID0gdHRtX2JvX3ZhbGlkYXRlKGJvLCAmcGxh Y2VtZW50LCAmY3R4KTsKPj4+PiArCXJlYWxfbnVtX2J1c3kgPSBmZXRjaF9hbmRfemVybygmcGxh Y2VtZW50LQo+Pj4+PiBudW1fYnVzeV9wbGFjZW1lbnQpOwo+Pj4+ICsJcmV0ID0gdHRtX2JvX3Zh bGlkYXRlKGJvLCBwbGFjZW1lbnQsICZjdHgpOwo+Pj4+IAlpZiAocmV0KSB7Cj4+Pj4gCQlyZXQg PSBpOTE1X3R0bV9lcnJfdG9fZ2VtKHJldCk7Cj4+Pj4gCQkvKgo+Pj4+IEBAIC02NTIsOCArNjQ2 LDggQEAgc3RhdGljIGludCBpOTE1X3R0bV9nZXRfcGFnZXMoc3RydWN0Cj4+Pj4gZHJtX2k5MTVf Z2VtX29iamVjdCAqb2JqKQo+Pj4+IAkJICogSWYgdGhlIGluaXRpYWwgYXR0ZW1wdCBmYWlscywg YWxsb3cgYWxsIGFjY2VwdGVkIHBsYWNlbWVudHMsCj4+Pj4gCQkgKiBldmljdGluZyBpZiBuZWNl c3NhcnkuCj4+Pj4gCQkgKi8KPj4+PiAtCQlwbGFjZW1lbnQubnVtX2J1c3lfcGxhY2VtZW50ID0g cmVhbF9udW1fYnVzeTsKPj4+PiAtCQlyZXQgPSB0dG1fYm9fdmFsaWRhdGUoYm8sICZwbGFjZW1l bnQsICZjdHgpOwo+Pj4+ICsJCXBsYWNlbWVudC0+bnVtX2J1c3lfcGxhY2VtZW50ID0gcmVhbF9u dW1fYnVzeTsKPj4+PiArCQlyZXQgPSB0dG1fYm9fdmFsaWRhdGUoYm8sIHBsYWNlbWVudCwgJmN0 eCk7Cj4+Pj4gCQlpZiAocmV0KQo+Pj4+IAkJCXJldHVybiBpOTE1X3R0bV9lcnJfdG9fZ2VtKHJl dCk7Cj4+Pj4gCX0KPj4+PiBAQCAtNjY4LDE2ICs2NjIsNTYgQEAgc3RhdGljIGludCBpOTE1X3R0 bV9nZXRfcGFnZXMoc3RydWN0Cj4+Pj4gZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQo+Pj4+IAkJ aTkxNV90dG1fYWRqdXN0X2dlbV9hZnRlcl9tb3ZlKG9iaik7Cj4+Pj4gCX0KPj4+Pgo+Pj4+IC0J LyogT2JqZWN0IGVpdGhlciBoYXMgYSBwYWdlIHZlY3RvciBvciBpcyBhbiBpb21lbSBvYmplY3Qg Ki8KPj4+PiAtCXN0ID0gYm8tPnR0bSA/IGk5MTVfdHRtX3R0X2dldF9zdChiby0+dHRtKSA6IG9i ai0+dHRtLmNhY2hlZF9pb19zdDsKPj4+PiAtCWlmIChJU19FUlIoc3QpKQo+Pj4+IC0JCXJldHVy biBQVFJfRVJSKHN0KTsKPj4+PiArCWlmICghb2JqLT5tbS5wYWdlcykgewo+Pj4+ICsJCS8qIE9i amVjdCBlaXRoZXIgaGFzIGEgcGFnZSB2ZWN0b3Igb3IgaXMgYW4gaW9tZW0gb2JqZWN0ICovCj4+ Pj4gKwkJc3QgPSBiby0+dHRtID8gaTkxNV90dG1fdHRfZ2V0X3N0KGJvLT50dG0pIDogb2JqLQo+ Pj4+PiB0dG0uY2FjaGVkX2lvX3N0Owo+Pj4+ICsJCWlmIChJU19FUlIoc3QpKQo+Pj4+ICsJCQly ZXR1cm4gUFRSX0VSUihzdCk7Cj4+Pj4KPj4+PiAtCV9faTkxNV9nZW1fb2JqZWN0X3NldF9wYWdl cyhvYmosIHN0LCBpOTE1X3NnX2RtYV9zaXplcyhzdC0+c2dsKSk7Cj4+Pj4gKwkJX19pOTE1X2dl bV9vYmplY3Rfc2V0X3BhZ2VzKG9iaiwgc3QsCj4+Pj4gaTkxNV9zZ19kbWFfc2l6ZXMoc3QtPnNn bCkpOwo+Pj4+ICsJfQo+Pj4+Cj4+Pj4gCXJldHVybiByZXQ7Cj4+Pj4gfQo+Pj4+Cj4+Pj4gK3N0 YXRpYyBpbnQgaTkxNV90dG1fZ2V0X3BhZ2VzKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpv YmopCj4+Pj4gK3sKPj4+PiArCXN0cnVjdCB0dG1fcGxhY2UgcmVxdWVzdGVkLCBidXN5W0k5MTVf VFRNX01BWF9QTEFDRU1FTlRTXTsKPj4+PiArCXN0cnVjdCB0dG1fcGxhY2VtZW50IHBsYWNlbWVu dDsKPj4+PiArCj4+Pj4gKwlHRU1fQlVHX09OKG9iai0+bW0ubl9wbGFjZW1lbnRzID4KPj4+PiBJ OTE1X1RUTV9NQVhfUExBQ0VNRU5UUyk7Cj4+Pj4gKwo+Pj4+ICsJLyogTW92ZSB0byB0aGUgcmVx dWVzdGVkIHBsYWNlbWVudC4gKi8KPj4+PiArCWk5MTVfdHRtX3BsYWNlbWVudF9mcm9tX29iaihv YmosICZyZXF1ZXN0ZWQsIGJ1c3ksICZwbGFjZW1lbnQpOwo+Pj4+ICsKPj4+PiArCXJldHVybiBf X2k5MTVfdHRtX2dldF9wYWdlcyhvYmosICZwbGFjZW1lbnQpOwo+Pj4+ICt9Cj4+Pj4gKwo+Pj4+ ICtzdGF0aWMgaW50IGk5MTVfdHRtX21pZ3JhdGUoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3Qg Km9iaiwKPj4+PiArCQkJICAgIHN0cnVjdCBpbnRlbF9tZW1vcnlfcmVnaW9uICptcikKPj4+PiAr ewo+Pj4+ICsJc3RydWN0IHR0bV9wbGFjZSByZXF1ZXN0ZWQ7Cj4+Pj4gKwlzdHJ1Y3QgdHRtX3Bs YWNlbWVudCBwbGFjZW1lbnQ7Cj4+Pj4gKwlpbnQgcmV0Owo+Pj4+ICsKPj4+PiArCWk5MTVfdHRt X3BsYWNlX2Zyb21fcmVnaW9uKG1yLCAmcmVxdWVzdGVkLCBvYmotPmZsYWdzKTsKPj4+PiArCXBs YWNlbWVudC5udW1fcGxhY2VtZW50ID0gMTsKPj4+PiArCXBsYWNlbWVudC5udW1fYnVzeV9wbGFj ZW1lbnQgPSAxOwo+Pj4+ICsJcGxhY2VtZW50LnBsYWNlbWVudCA9ICZyZXF1ZXN0ZWQ7Cj4+Pj4g KwlwbGFjZW1lbnQuYnVzeV9wbGFjZW1lbnQgPSAmcmVxdWVzdGVkOwo+Pj4+ICsKPj4+PiArCXJl dCA9IF9faTkxNV90dG1fZ2V0X3BhZ2VzKG9iaiwgJnBsYWNlbWVudCk7Cj4+Pj4gKwlpZiAocmV0 KQo+Pj4+ICsJCXJldHVybiByZXQ7Cj4+Pj4gKwo+Pj4+ICsJaWYgKG9iai0+bW0ucmVnaW9uICE9 IG1yKSB7Cj4+Pj4gKwkJaTkxNV9nZW1fb2JqZWN0X3JlbGVhc2VfbWVtb3J5X3JlZ2lvbihvYmop Owo+Pj4+ICsJCWk5MTVfZ2VtX29iamVjdF9pbml0X21lbW9yeV9yZWdpb24ob2JqLCBtcik7Cj4+ Pj4gKwl9Cj4+PiBQZXJoYXBzIGEgbWlub3Igbml0Ogo+Pj4KPj4+IERvaW5nIHRoaXMgYWZ0ZXIg d2UgaGF2ZSBkb25lIHRoZSBfZ2V0X3BhZ2VzKCkganVzdCBkb2Vzbid0IHNlZW0gcmlnaHQuCj4+ Pgo+Pj4gSS5lLiB3ZSBkbyB3b3JrIG9uIHRoZSBvYmplY3QsIGFuZCB0aGVuIHdlIGluaXQgc29t ZSBwb3J0aW9uIG9mIGl0Lgo+Pj4KPj4+IERvIHdlIG5lZWQgdG8gZG8gdGhpcyBpbmNhc2UgdGhl IG1pZ3JhdGlvbi9wbGFjZW1lbnQgZmFpbHM/ICBJZiBzbywKPj4+IG1heWJlIGEgY29tbWVudCB0 byB0aGF0IGVmZmVjdD8KPj4gVGhpcyBpcyBzaW1wbHkgc3dpdGNoaW5nIG1lbW9yeSByZWdpb24g dW5kZXIgdGhlIGxvY2ssIGFuZCB0byBhbHNvIG1vdmUKPj4gdG8gYW5vdGhlciBtZW1vcnkgcmVn aW9uIGxpc3QuIElzIGl0IHRoZSBuYW1pbmcgX3JlbGVhc2VfIGFuZCBfaW5pdF8KPj4gdGhhdCBp cyBjb25mdXNpbmc/Cj4gSG1tLCByZS1yZWFkaW5nIG15IHF1ZXN0aW9uLCBJIGFtIHdvbmRlcmlu ZyBpZiBJIHdhcyB1bmNsZWFyLgo+Cj4gTXkgInJlYWwiIHF1ZXN0aW9uIHdhcywgY2FuIHRoZSBy ZWxlYXNlL2luaXQgb2NjdXIgYmVmb3JlIHRoZSBfZ2V0X3BhZ2VzKCk/Cj4KPiBCdXQgbG9va2lu ZyBhdCB0aGlzIHNvbWUgbW9yZSwgSSBjYW4gc2VlIGFuc3dlciBpcyBwcm9iYWJseSBuby4KPgo+ IEkgd2FzIGdvaW5nIHRvIHN1Z2dlc3QgY2FsbGluZyBfaW5pdF8gX3NldF8sIGJ1dCB3aGVuIEkg bG9va2VkIGF0IGl0LCBpdCB3YXMKPiBkb2luZyBpbml0IHRoaW5ncyBhcyB3ZWxsIGFzIHNldHRp bmcgdGhpbmdzCj4KPiBNYXliZSBqdXN0IGEgY29tbWVudCBsaWtlOgo+Cj4gLyogQ29tcGxldGUg dGhlIG1pZ3JhdGlvbiBieSB1cGRhdGluZyB0aGUgbWVtb3J5IHJlZ2lvbiBpbmZvLiAqLwo+IGlm IChvYmplY3QtPm1tLi4uKQoKU3VyZSwgSSdsbCBhZGQgdGhhdC4gTm90ZSB0aGF0IGFub3RoZXIg dGhyZWFkIHdvdWxkIGhhdmUgdG8gdGFrZSB0aGUgCm9iamVjdCBsb2NrIGFueXdheSB0byBpbnNw ZWN0IGJvdGggdGhlIHJlZ2lvbiBhbmQgdGhlIHBhZ2VzLCBzbyBpdCAKc2hvdWxkbid0IGJlIGNv bmZ1c2VkIGJ5IHRoZSBvcmRlciBoZXJlLgoKL1Rob21hcwoKCl9fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fCkludGVsLWdmeCBtYWlsaW5nIGxpc3QKSW50ZWwt Z2Z4QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9t YWlsbWFuL2xpc3RpbmZvL2ludGVsLWdmeAo=