From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga07.intel.com ([134.134.136.100]:1727 "EHLO mga07.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753674AbdDEIMp (ORCPT ); Wed, 5 Apr 2017 04:12:45 -0400 Message-ID: <58E4A443.7040001@intel.com> Date: Wed, 05 Apr 2017 16:01:07 +0800 From: Zhi Wang MIME-Version: 1.0 To: Zhenyu Wang , Zhiyuan Lv CC: =?UTF-8?B?TWljaGHFgiBXaW5pYXJza2k=?= , Michel Thierry , Joonas Lahtinen , Chris Wilson , Zhenyu Wang , Zhiyuan Lv , Greg KH , stable@vger.kernel.org Subject: Re: [PATCH 1/3] drm/i915: Move the release of PT page to the upper caller References: <1491374018-20317-1-git-send-email-zhi.a.wang@intel.com> <58E49059.9020205@intel.com> In-Reply-To: <58E49059.9020205@intel.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Sender: stable-owner@vger.kernel.org List-ID: Thanks for the efforts! The commits in linux tree are: 3e52d71e drm/i915: A hotfix for making aliasing PPGTT work for GVT-g 26d12c6 drm/i915: Let execlist_update_context() cover !FULL_PPGTT mode. a18dbba drm/i915: Move the release of PT page to the upper caller Thanks, Zhi. On 04/05/17 14:36, Zhi Wang wrote: > Hi Greg: > Would you mind to take these three patches into next > linux-stable-4.10.x? Another two patches are: > > [PATCH 2/3] drm/i915: Let execlist_update_context() cover !FULL_PPGTT mode. > > [PATCH 3/3] drm/i915: A hotfix for making aliasing PPGTT work for GVT-g > > Thank you so much! :P > > Thanks, > Zhi. > > On 04/05/17 14:33, Zhi Wang wrote: >> a PT page will be released if it doesn't contain any meaningful mappings >> during PPGTT page table shrinking. The PT entry in the upper level will >> be set to a scratch entry. >> >> Normally this works nicely, but in virtualization world, the PPGTT page >> table is tracked by hypervisor. Releasing the PT page before modifying >> the upper level PT entry would cause extra efforts. >> >> As the tracked page has been returned to OS before losing track from >> hypervisor, it could be written in any pattern. Hypervisor has to >> recognize >> if a page is still being used as a PT page by validating these writing >> patterns. It's complicated. Better let the guest modify the PT entry in >> upper level PT first, then release the PT page. >> >> Reviewed-by: Chris Wilson >> Reviewed-by: Michał Winiarski >> Cc: Michał Winiarski >> Cc: Michel Thierry >> Cc: Joonas Lahtinen >> Cc: Chris Wilson >> Cc: Zhenyu Wang >> Cc: Zhiyuan Lv >> Cc: Greg KH #v4.10+ >> Cc: stable@vger.kernel.org >> Signed-off-by: Zhi Wang >> Link: >> https://patchwork.freedesktop.org/patch/122697/msgid/1479728666-25333-1-git-send-email-zhi.a.wang@intel.com >> >> Signed-off-by: Chris Wilson >> Link: >> http://patchwork.freedesktop.org/patch/msgid/1480402516-22275-1-git-send-email-zhi.a.wang@intel.com >> >> --- >> drivers/gpu/drm/i915/i915_gem_gtt.c | 18 +++++++----------- >> 1 file changed, 7 insertions(+), 11 deletions(-) >> >> diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c >> b/drivers/gpu/drm/i915/i915_gem_gtt.c >> index b4bde14..6cee707 100644 >> --- a/drivers/gpu/drm/i915/i915_gem_gtt.c >> +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c >> @@ -736,10 +736,8 @@ static bool gen8_ppgtt_clear_pt(struct >> i915_address_space *vm, >> >> bitmap_clear(pt->used_ptes, pte, num_entries); >> >> - if (bitmap_empty(pt->used_ptes, GEN8_PTES)) { >> - free_pt(to_i915(vm->dev), pt); >> + if (bitmap_empty(pt->used_ptes, GEN8_PTES)) >> return true; >> - } >> >> pt_vaddr = kmap_px(pt); >> >> @@ -775,13 +773,12 @@ static bool gen8_ppgtt_clear_pd(struct >> i915_address_space *vm, >> pde_vaddr = kmap_px(pd); >> pde_vaddr[pde] = scratch_pde; >> kunmap_px(ppgtt, pde_vaddr); >> + free_pt(to_i915(vm->dev), pt); >> } >> } >> >> - if (bitmap_empty(pd->used_pdes, I915_PDES)) { >> - free_pd(to_i915(vm->dev), pd); >> + if (bitmap_empty(pd->used_pdes, I915_PDES)) >> return true; >> - } >> >> return false; >> } >> @@ -795,7 +792,6 @@ static bool gen8_ppgtt_clear_pdp(struct >> i915_address_space *vm, >> uint64_t length) >> { >> struct i915_hw_ppgtt *ppgtt = i915_vm_to_ppgtt(vm); >> - struct drm_i915_private *dev_priv = to_i915(vm->dev); >> struct i915_page_directory *pd; >> uint64_t pdpe; >> gen8_ppgtt_pdpe_t *pdpe_vaddr; >> @@ -813,16 +809,14 @@ static bool gen8_ppgtt_clear_pdp(struct >> i915_address_space *vm, >> pdpe_vaddr[pdpe] = scratch_pdpe; >> kunmap_px(ppgtt, pdpe_vaddr); >> } >> + free_pd(to_i915(vm->dev), pd); >> } >> } >> >> mark_tlbs_dirty(ppgtt); >> >> - if (USES_FULL_48BIT_PPGTT(dev_priv) && >> - bitmap_empty(pdp->used_pdpes, I915_PDPES_PER_PDP(dev_priv))) { >> - free_pdp(dev_priv, pdp); >> + if (bitmap_empty(pdp->used_pdpes, I915_PDPES_PER_PDP(dev_priv))) >> return true; >> - } >> >> return false; >> } >> @@ -836,6 +830,7 @@ static void gen8_ppgtt_clear_pml4(struct >> i915_address_space *vm, >> uint64_t start, >> uint64_t length) >> { >> + struct drm_i915_private *dev_priv = to_i915(vm->dev); >> struct i915_hw_ppgtt *ppgtt = i915_vm_to_ppgtt(vm); >> struct i915_page_directory_pointer *pdp; >> uint64_t pml4e; >> @@ -854,6 +849,7 @@ static void gen8_ppgtt_clear_pml4(struct >> i915_address_space *vm, >> pml4e_vaddr = kmap_px(pml4); >> pml4e_vaddr[pml4e] = scratch_pml4e; >> kunmap_px(ppgtt, pml4e_vaddr); >> + free_pdp(dev_priv, pdp); >> } >> } >> } >>