On Fri, Mar 10, 2023 at 04:22:38PM -0800, Sean Christopherson wrote: > /* > - * Check if can do 2M page > + * Try to map a 2M gtt entry. > * @vgpu: target vgpu > * @entry: target pfn's gtt entry > * > - * Return 1 if 2MB huge gtt shadowing is possible, 0 if miscondition, > - * negative if found err. > + * Return 1 if 2MB huge gtt shadow was creation, 0 if the entry needs to be > + * split, negative if found err. > */ > -static int is_2MB_gtt_possible(struct intel_vgpu *vgpu, > - struct intel_gvt_gtt_entry *entry) > +static int try_map_2MB_gtt_entry(struct intel_vgpu *vgpu, > + struct intel_gvt_gtt_entry *entry, dma_addr_t *dma_addr) > { > const struct intel_gvt_gtt_pte_ops *ops = vgpu->gvt->gtt.pte_ops; > unsigned long gfn = ops->get_pfn(entry); > - kvm_pfn_t pfn; > int max_level; > - int ret; > > if (!HAS_PAGE_SIZES(vgpu->gvt->gt->i915, I915_GTT_PAGE_SIZE_2M)) > return 0; > @@ -1173,16 +1171,7 @@ static int is_2MB_gtt_possible(struct intel_vgpu *vgpu, > if (max_level < PG_LEVEL_2M) > return 0; > > - pfn = gfn_to_pfn(vgpu->vfio_device.kvm, gfn); > - if (is_error_noslot_pfn(pfn)) > - return -EINVAL; > - > - if (!pfn_valid(pfn)) > - return -EINVAL; > - > - ret = PageTransHuge(pfn_to_page(pfn)); > - kvm_release_pfn_clean(pfn); > - return ret; > + return intel_gvt_dma_map_guest_page(vgpu, gfn, I915_GTT_PAGE_SIZE_2M, dma_addr); intel_gvt_dma_map_guest_page() returns 0 on success, which is not in consistent with the expected return value of this function, i.e. " Return 1 if 2MB huge gtt shadow was creation, 0 if the entry needs to be split, negative if found err. "