From nobody Wed Feb 11 20:21:42 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 49CE5C6FD19 for ; Sat, 11 Mar 2023 00:24:00 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231146AbjCKAX5 (ORCPT ); Fri, 10 Mar 2023 19:23:57 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44034 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230146AbjCKAXj (ORCPT ); Fri, 10 Mar 2023 19:23:39 -0500 Received: from mail-pf1-x449.google.com (mail-pf1-x449.google.com [IPv6:2607:f8b0:4864:20::449]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2B28B4C6EA for ; Fri, 10 Mar 2023 16:23:19 -0800 (PST) Received: by mail-pf1-x449.google.com with SMTP id h14-20020aa786ce000000b005a89856900eso3613593pfo.14 for ; Fri, 10 Mar 2023 16:23:19 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; t=1678494199; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=dV8sNcyAW0n6X3OiA2R9lVjH4Ll5YuXDWn2FowKm87g=; b=h2hFNdoiZHdwrWGNcaEB/AQu51ahfugVa0zZizoS7QsJE89HqVuLJVyqNvgvd88iBK me0aSbiLd3m9jQAdP4be16J3EamKef/zkhiZ8H9I0++QXNGVvaBX4JlCjBNkrV770IxF vK1qcoDgiG8eG9uN5BbJ+1pd1X2/slSmvHRy2d94KJ6TkaYyfiHjZiawDoOz4oNTgtmQ wMEFUehtwWmzdnnBcBDczYp5PNvPGlhNrUUV21FjS3Zvc6w8s7J3JJNCFk5eteKW5Teh 6afgrwW4K8+pvEJ6iE8UxjDcodkIbeov5HFbNu6p7Rc9ulZEZVy7KSIyqswaDsXCzWLl 1n7w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1678494199; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=dV8sNcyAW0n6X3OiA2R9lVjH4Ll5YuXDWn2FowKm87g=; b=x2NTklI3h5zPT+OHIDgmRHvleRJDc0+K4huro/2jFKUp8zY1hYniGCl0QmZ7Dc+PnK q294QQltPXnkjURpbIKrwzWagpkcSIPXqg5+eLE/YTuLojkxqRifacEFhsHzo58cBkmd sMpHzc3ueyRoKJZJiTpC/DbyU1x+se6ko0FhtrOWI5e0gvq8v3uu9fDaV6i4D+QRBgTn 5bSNRBUmFv+PdCIajNugNjRkWGynOUuDOhND8F2RYV85cVvbZr4MrgM8hZBLl6BfzSeo vahYwIK9W9vBv01QLAHRbB+SJ5ekGv854noYtBbKevvPOve2+KmCin3x6BEEHuS4p4T2 jyBA== X-Gm-Message-State: AO0yUKVoJrFxW1zp32vZbtjiAZZQwBUM9wDRLrQNtqluNUYf6fZO8+PG 4gHmo18yf4emMKJXiqJG7HKYP23sfyE= X-Google-Smtp-Source: AK7set+oTUQVQ98NL8nLmkTce37rt0J2X5Ciq9/ekBdbpCSBWIX/zJhgQ4enOFiT3EdM+nyqTe7FZ4gAxDQ= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a17:902:f98d:b0:19a:80b9:78ce with SMTP id ky13-20020a170902f98d00b0019a80b978cemr1675508plb.0.1678494199278; Fri, 10 Mar 2023 16:23:19 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 10 Mar 2023 16:22:38 -0800 In-Reply-To: <20230311002258.852397-1-seanjc@google.com> Mime-Version: 1.0 References: <20230311002258.852397-1-seanjc@google.com> X-Mailer: git-send-email 2.40.0.rc1.284.g88254d51c5-goog Message-ID: <20230311002258.852397-8-seanjc@google.com> Subject: [PATCH v2 07/27] drm/i915/gvt: Don't rely on KVM's gfn_to_pfn() to query possible 2M GTT From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini , Zhenyu Wang , Zhi Wang Cc: kvm@vger.kernel.org, intel-gvt-dev@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, linux-kernel@vger.kernel.org, Yan Zhao , Ben Gardon Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Now that gvt_pin_guest_page() explicitly verifies the pinned PFN is a transparent hugepage page, don't use KVM's gfn_to_pfn() to pre-check if a 2M GTT entry is possible and instead just try to map the GFN with a 2MB entry. Using KVM to query pfn that is ultimately managed through VFIO is odd, and KVM's gfn_to_pfn() is not intended for non-KVM consumption; it's exported only because of KVM vendor modules (x86 and PPC). Signed-off-by: Sean Christopherson --- drivers/gpu/drm/i915/gvt/gtt.c | 33 +++++++++++---------------------- 1 file changed, 11 insertions(+), 22 deletions(-) diff --git a/drivers/gpu/drm/i915/gvt/gtt.c b/drivers/gpu/drm/i915/gvt/gtt.c index 15848b041a0d..e60bcce241f8 100644 --- a/drivers/gpu/drm/i915/gvt/gtt.c +++ b/drivers/gpu/drm/i915/gvt/gtt.c @@ -1146,21 +1146,19 @@ static inline void ppgtt_generate_shadow_entry(stru= ct intel_gvt_gtt_entry *se, } =20 /* - * 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 =3D vgpu->gvt->gtt.pte_ops; unsigned long gfn =3D ops->get_pfn(entry); - kvm_pfn_t pfn; int max_level; - int ret; =20 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 *vg= pu, if (max_level < PG_LEVEL_2M) return 0; =20 - pfn =3D gfn_to_pfn(vgpu->vfio_device.kvm, gfn); - if (is_error_noslot_pfn(pfn)) - return -EINVAL; - - if (!pfn_valid(pfn)) - return -EINVAL; - - ret =3D 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); } =20 static int split_2MB_gtt_entry(struct intel_vgpu *vgpu, @@ -1278,7 +1267,7 @@ static int ppgtt_populate_shadow_entry(struct intel_v= gpu *vgpu, { const struct intel_gvt_gtt_pte_ops *pte_ops =3D vgpu->gvt->gtt.pte_ops; struct intel_gvt_gtt_entry se =3D *ge; - unsigned long gfn, page_size =3D PAGE_SIZE; + unsigned long gfn; dma_addr_t dma_addr; int ret; =20 @@ -1301,13 +1290,12 @@ static int ppgtt_populate_shadow_entry(struct intel= _vgpu *vgpu, return split_64KB_gtt_entry(vgpu, spt, index, &se); case GTT_TYPE_PPGTT_PTE_2M_ENTRY: gvt_vdbg_mm("shadow 2M gtt entry\n"); - ret =3D is_2MB_gtt_possible(vgpu, ge); + ret =3D try_map_2MB_gtt_entry(vgpu, ge, &dma_addr); if (ret =3D=3D 0) return split_2MB_gtt_entry(vgpu, spt, index, &se); else if (ret < 0) return ret; - page_size =3D I915_GTT_PAGE_SIZE_2M; - break; + goto set_shadow_entry; case GTT_TYPE_PPGTT_PTE_1G_ENTRY: gvt_vgpu_err("GVT doesn't support 1GB entry\n"); return -EINVAL; @@ -1316,10 +1304,11 @@ static int ppgtt_populate_shadow_entry(struct intel= _vgpu *vgpu, } =20 /* direct shadow */ - ret =3D intel_gvt_dma_map_guest_page(vgpu, gfn, page_size, &dma_addr); + ret =3D intel_gvt_dma_map_guest_page(vgpu, gfn, PAGE_SIZE, &dma_addr); if (ret) return -ENXIO; =20 +set_shadow_entry: pte_ops->set_pfn(&se, dma_addr >> PAGE_SHIFT); ppgtt_set_shadow_entry(spt, &se, index); return 0; --=20 2.40.0.rc1.284.g88254d51c5-goog