From nobody Mon Jun 15 12:47:09 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 95A51C433FE for ; Fri, 29 Apr 2022 01:04:31 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1353719AbiD2BHp (ORCPT ); Thu, 28 Apr 2022 21:07:45 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34368 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1353690AbiD2BHh (ORCPT ); Thu, 28 Apr 2022 21:07:37 -0400 Received: from mail-pl1-x64a.google.com (mail-pl1-x64a.google.com [IPv6:2607:f8b0:4864:20::64a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 654D2BC86E for ; Thu, 28 Apr 2022 18:04:21 -0700 (PDT) Received: by mail-pl1-x64a.google.com with SMTP id w24-20020a170902a71800b0015d00267d74so3488456plq.6 for ; Thu, 28 Apr 2022 18:04:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=reply-to:date:in-reply-to:message-id:mime-version:references :subject:from:to:cc; bh=/F7u5jcoDKD988Ymfw3LyvU9T0g0ALLsxhHqY4ZHDtk=; b=PbjvjOQF/BvQXETJcl+J7q8EaS4zuBddtEwwwpADTGWDhKMoSUKzNtyQns4VfpF016 w5uRA5JSQOtRPKhde8ZxgVY1UT3rkSzjqWtBv2+82cJEATdFrg1zl2bXy7pRf4AabgpK LykpdMmgqaic4KNDFJ2T0SbEYJzjOPJ17+6SK6DKwGopSb4IqCfoRVZFA72uaeTLfSzC YOVfHktLQxg3gJ1HQuVWrtELRPHJ14SGodXFiLJf14tS1QyHBKbjjigaEhd5rM/F5j+i 1bRFT86TBUQJW95uyRjwrcOokp4aWOgTM7csqSJjROtLNyc9tygZ0bD6lE/CPzJ3T7hZ 5/zQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:reply-to:date:in-reply-to:message-id :mime-version:references:subject:from:to:cc; bh=/F7u5jcoDKD988Ymfw3LyvU9T0g0ALLsxhHqY4ZHDtk=; b=BprBk1xbNsPSb8aGob13pFKYFRdU5FoEb1YbB3PP4ReF2WiU5x6/XUVNy3G1At+DUO hGmDpm1jY1t3jTtFJXtkaHOE8ilPYBtwO7pjY1PIMOWI/K0U9b8kIZ625M33V9Wqq860 1BTOgDLyPj/xpx1ezW8t+86/7JFAtfHCxSW6ttXP38EdMhBF9JC6hT0OcQM1NSk7sN/S Px2qKueCgFuDczTWOrqb1RktCHS99wjiKKC0xKJrPwkAygBLqkhWA8gk6/NfSHoSXZOr AlGSgXrZgu/XOqTI61F89ozCZrUKqZ6tuzX8aHNq1/YmSPaPXmaU9aY8vwenXlRIrGHr lf+g== X-Gm-Message-State: AOAM532UxeVdWI0pU57aiPqOh39AJI9Ag1NgGtMjCe6i8QiX6wimHa83 +bk9HQUu5qvsneTZj6xNWHqX/mUwDho= X-Google-Smtp-Source: ABdhPJxf2rEbyEyrxjUedAKmd5l36jeK0WkS8NlEIIFXxaQo+b7d6qLdeIoJsxzvBwS6qb8RA9UJol53CME= X-Received: from seanjc.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:3e5]) (user=seanjc job=sendgmr) by 2002:a17:90a:e510:b0:1d9:ee23:9fa1 with SMTP id t16-20020a17090ae51000b001d9ee239fa1mr184049pjy.0.1651194260328; Thu, 28 Apr 2022 18:04:20 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 29 Apr 2022 01:04:07 +0000 In-Reply-To: <20220429010416.2788472-1-seanjc@google.com> Message-Id: <20220429010416.2788472-2-seanjc@google.com> Mime-Version: 1.0 References: <20220429010416.2788472-1-seanjc@google.com> X-Mailer: git-send-email 2.36.0.464.gb9c8b46e94-goog Subject: [PATCH 01/10] KVM: Do not zero initialize 'pfn' in hva_to_pfn() From: Sean Christopherson To: Paolo Bonzini Cc: Sean Christopherson , Vitaly Kuznetsov , Wanpeng Li , Jim Mattson , Joerg Roedel , kvm@vger.kernel.org, linux-kernel@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Drop the unnecessary initialization of the local 'pfn' variable in hva_to_pfn(). First and foremost, '0' is not an invalid pfn, it's a perfectly valid pfn on most architectures. I.e. if hva_to_pfn() were to return an "uninitializd" pfn, it would actually be interpeted as a legal pfn by most callers. Second, hva_to_pfn() can't return an uninitialized pfn as hva_to_pfn() explicitly sets pfn to an error value (or returns an error value directly) if a helper returns failure, and all helpers set the pfn on success. Note, the zeroing of 'pfn' was introduced by commit 2fc843117d64 ("KVM: reorganize hva_to_pfn"), and was unnecessary and misguided paranoia even then. Signed-off-by: Sean Christopherson --- virt/kvm/kvm_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 0848430f36c6..04ed4334473c 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -2567,7 +2567,7 @@ kvm_pfn_t hva_to_pfn(unsigned long addr, bool atomic,= bool *async, bool write_fault, bool *writable) { struct vm_area_struct *vma; - kvm_pfn_t pfn =3D 0; + kvm_pfn_t pfn; int npages, r; =20 /* we can do it either atomically or asynchronously, not both */ --=20 2.36.0.464.gb9c8b46e94-goog From nobody Mon Jun 15 12:47:09 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 BE460C433FE for ; Fri, 29 Apr 2022 01:04:34 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1353702AbiD2BHs (ORCPT ); Thu, 28 Apr 2022 21:07:48 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34410 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1353697AbiD2BHj (ORCPT ); Thu, 28 Apr 2022 21:07:39 -0400 Received: from mail-pj1-x1049.google.com (mail-pj1-x1049.google.com [IPv6:2607:f8b0:4864:20::1049]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C4F49BC853 for ; Thu, 28 Apr 2022 18:04:22 -0700 (PDT) Received: by mail-pj1-x1049.google.com with SMTP id s18-20020a17090aa11200b001d92f7609e8so3317673pjp.3 for ; Thu, 28 Apr 2022 18:04:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=reply-to:date:in-reply-to:message-id:mime-version:references :subject:from:to:cc; bh=iAfBavwbsHQb7nUtWPmITw7texHIRzXx3genh74Wrm4=; b=d4B9ajRP0cdRUOdbpcrENwHCKJkDs3tQ5IHjndd9KvxYQ/7SOn0yIM78dzq5kyT1Nd M0pxUa87fybMap7EXy0g6Q2dzahdlYQCHNzaMbjOX11TvJju71dPepLRrPh53k+2YnMl EnjrGxBJnTCkDTRSvATHYreY/CvYVr9s9L56paGcBTUPU4X9uDWh+Hlb5+mlHpS4rUDe wee+clVpxgdHIJ2JqmMlMcxtR8V7kdiCEd+qCf5FFdazGj7pN34Ei0weBZaPUyQuANaO 7YRgwLB/iW0tih0KgEQOaDGGZL8NclWvsJc5EygBZTI0gnxG9sMFJFZ3dPrn9mJLosJX jS9g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:reply-to:date:in-reply-to:message-id :mime-version:references:subject:from:to:cc; bh=iAfBavwbsHQb7nUtWPmITw7texHIRzXx3genh74Wrm4=; b=UOb+gGwXxEWF9XIESeWWbaSBryBP3fhKXzd3xf0TvbwSbfboei80u0XepL+kqH9gjN 33KuWd/QILokaYzJgSq824+CHmXfBxN4ongapVXpu6stYEeCBe9+VYRAFM6eCkLLEXFF vbWog/VtzqHkxOXh4TwSWZYogGtgxgtK1QNvPIr1z4UIVEqnY/sKrRzoKmTVotoM1t68 pX2zBikGZ8i8+u7hXExX5TNqqE01iyVJTBq4kMK/MvCX2rVgCbXc87OeGegk+hamvKoS MOGzvHqJ6NfxAo+aJXGVnepdpxLNHFltAW2Y41dGq+W0vgC/gVnXPVrJaGioHnDhgKod BBXw== X-Gm-Message-State: AOAM531m05u5pwpit+Z0y+ZSL4mRbu0vP9Wbonm1uVaASBP656t7xo+J PXKRDXhNW059tcAh6Np/qnd0wwnj30U= X-Google-Smtp-Source: ABdhPJyExsvWbr+aCzXd9ADsT+u2WdLcxHUGXGu6s7gm+EXhhn3Fb9B0jU9fQPr7QbfeFO0iu8TIXA9Sf30= X-Received: from seanjc.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:3e5]) (user=seanjc job=sendgmr) by 2002:a17:902:ce11:b0:15b:4232:e5e7 with SMTP id k17-20020a170902ce1100b0015b4232e5e7mr36162290plg.39.1651194262244; Thu, 28 Apr 2022 18:04:22 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 29 Apr 2022 01:04:08 +0000 In-Reply-To: <20220429010416.2788472-1-seanjc@google.com> Message-Id: <20220429010416.2788472-3-seanjc@google.com> Mime-Version: 1.0 References: <20220429010416.2788472-1-seanjc@google.com> X-Mailer: git-send-email 2.36.0.464.gb9c8b46e94-goog Subject: [PATCH 02/10] KVM: Drop bogus "pfn != 0" guard from kvm_release_pfn() From: Sean Christopherson To: Paolo Bonzini Cc: Sean Christopherson , Vitaly Kuznetsov , Wanpeng Li , Jim Mattson , Joerg Roedel , kvm@vger.kernel.org, linux-kernel@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Remove a check from kvm_release_pfn() to bail if the provided @pfn is zero. Zero is a perfectly valid pfn on most architectures, and should not be used to indicate an error or an invalid pfn. The bogus check was added by commit 917248144db5 ("x86/kvm: Cache gfn to pfn translation"), which also did the bad thing of zeroing the pfn and gfn to mark a cache invalid. Thankfully, that bad behavior was axed by commit 357a18ad230f ("KVM: Kill kvm_map_gfn() / kvm_unmap_gfn() and gfn_to_pfn_cache"). Signed-off-by: Sean Christopherson --- virt/kvm/kvm_main.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 04ed4334473c..154c3dda7010 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -2723,9 +2723,6 @@ EXPORT_SYMBOL_GPL(gfn_to_page); =20 void kvm_release_pfn(kvm_pfn_t pfn, bool dirty) { - if (pfn =3D=3D 0) - return; - if (dirty) kvm_release_pfn_dirty(pfn); else --=20 2.36.0.464.gb9c8b46e94-goog From nobody Mon Jun 15 12:47:09 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 71764C433F5 for ; Fri, 29 Apr 2022 01:04:37 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1353735AbiD2BHv (ORCPT ); Thu, 28 Apr 2022 21:07:51 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34430 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1353685AbiD2BHk (ORCPT ); Thu, 28 Apr 2022 21:07:40 -0400 Received: from mail-pg1-x549.google.com (mail-pg1-x549.google.com [IPv6:2607:f8b0:4864:20::549]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 57C30BC847 for ; Thu, 28 Apr 2022 18:04:24 -0700 (PDT) Received: by mail-pg1-x549.google.com with SMTP id s185-20020a632cc2000000b003c18e076a2bso1193575pgs.13 for ; Thu, 28 Apr 2022 18:04:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=reply-to:date:in-reply-to:message-id:mime-version:references :subject:from:to:cc; bh=+c4kuAeaVpJbT9SeG2Y2z8NNvzs3pnH/Z0LBmJvTN5A=; b=g8Kk4kb1zRPfAmwfq190ewZE78OEB/To/C1WROecCUOzvO+V3UkZ1lKuMx7SdGTej3 A5PnrAq/SMMG4W54y3jV6ul9BcQxuAKrGsYxCmLg8LeFDGumYlz2lMSdDRes2OQ5L/+8 HWDw6PMMIPs1r0e93ntUbRaqWL+r/gjkFryZvUimq2p2qW0GrDzjbs0JON4ZYjiz/wWm u9SS5HdqDlWJJE/5TbHy6oAH6xR/e3CeXlUjDUg39QHOukwib533BNft8OdFDVXbPoOb aB/3MryJse88GOvZg3DQXk03/oD2Sss8lvAgxrorp0B9irNC+wYPi2eWLYEHaaPwnr7S vNww== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:reply-to:date:in-reply-to:message-id :mime-version:references:subject:from:to:cc; bh=+c4kuAeaVpJbT9SeG2Y2z8NNvzs3pnH/Z0LBmJvTN5A=; b=ZSQeoaiVL4oHZ5LabpfbaDaGVVSspcPvCUquy/e2d/wJEI0CNbF8ux3MrGs8Pkj0qM T27B/KgDRyUHPMczyx/CilSHeOYrdX1enE7vjKJVPwXspDN18uwzZ8o2jQ1jn76y+YpK clBrJZw//ppcqLxiNE8qiWcD/4H7kHiy88Ul96e/ttRAa49Tnejb61C9g4xfo2OF5frM lzCz6SJPnRQBOWmguVoS8NIMJXOopwBjHv9FZ81s90ZlDIogpDZdHJoEXyhunsUj+3vr u396t9eHbytNWQRMYFSMfRjlk4GcMHnkyFgxegIN94TbsCrK60bAqw5yLJU1iXR7t/jx CD8w== X-Gm-Message-State: AOAM531cB+jcuVD+vupM8E/gy/KhA5bxXAbJf6ra3MA2w4T1Z9za8OfN X83cUKTSST6MO3MU8fMCyWDxGratdgY= X-Google-Smtp-Source: ABdhPJyTGZSZaFMkbQsKd4UoidwtkFlyObqzGBxtSKoDdfJjb9PJPZZV4vy+Y+PEPbINE0XzKfUaVj73ldU= X-Received: from seanjc.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:3e5]) (user=seanjc job=sendgmr) by 2002:a17:902:dacd:b0:15e:75e6:da26 with SMTP id q13-20020a170902dacd00b0015e75e6da26mr1810973plx.61.1651194263858; Thu, 28 Apr 2022 18:04:23 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 29 Apr 2022 01:04:09 +0000 In-Reply-To: <20220429010416.2788472-1-seanjc@google.com> Message-Id: <20220429010416.2788472-4-seanjc@google.com> Mime-Version: 1.0 References: <20220429010416.2788472-1-seanjc@google.com> X-Mailer: git-send-email 2.36.0.464.gb9c8b46e94-goog Subject: [PATCH 03/10] KVM: Don't set Accessed/Dirty bits for ZERO_PAGE From: Sean Christopherson To: Paolo Bonzini Cc: Sean Christopherson , Vitaly Kuznetsov , Wanpeng Li , Jim Mattson , Joerg Roedel , kvm@vger.kernel.org, linux-kernel@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Don't set Accessed/Dirty bits for a struct page with PG_reserved set, i.e. don't set A/D bits for the ZERO_PAGE. The ZERO_PAGE (or pages depending on the architecture) should obviously never be written, and similarly there's no point in marking it accessed as the page will never be swapped out or reclaimed. The comment in page-flags.h is quite clear that PG_reserved pages should be managed only by their owner, and strictly following that mandate also simplifies KVM's logic. Fixes: 7df003c85218 ("KVM: fix overflow of zero page refcount with ksm runn= ing") Signed-off-by: Sean Christopherson --- virt/kvm/kvm_main.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 154c3dda7010..46d12998732e 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -2828,16 +2828,28 @@ void kvm_release_pfn_dirty(kvm_pfn_t pfn) } EXPORT_SYMBOL_GPL(kvm_release_pfn_dirty); =20 +static bool kvm_is_ad_tracked_pfn(kvm_pfn_t pfn) +{ + if (!pfn_valid(pfn)) + return false; + + /* + * Per page-flags.h, pages tagged PG_reserved "should in general not be + * touched (e.g. set dirty) except by its owner". + */ + return !PageReserved(pfn_to_page(pfn)); +} + void kvm_set_pfn_dirty(kvm_pfn_t pfn) { - if (!kvm_is_reserved_pfn(pfn) && !kvm_is_zone_device_pfn(pfn)) + if (kvm_is_ad_tracked_pfn(pfn)) SetPageDirty(pfn_to_page(pfn)); } EXPORT_SYMBOL_GPL(kvm_set_pfn_dirty); =20 void kvm_set_pfn_accessed(kvm_pfn_t pfn) { - if (!kvm_is_reserved_pfn(pfn) && !kvm_is_zone_device_pfn(pfn)) + if (kvm_is_ad_tracked_pfn(pfn)) mark_page_accessed(pfn_to_page(pfn)); } EXPORT_SYMBOL_GPL(kvm_set_pfn_accessed); --=20 2.36.0.464.gb9c8b46e94-goog From nobody Mon Jun 15 12:47:09 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 6746BC433F5 for ; Fri, 29 Apr 2022 01:04:41 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1353781AbiD2BHz (ORCPT ); Thu, 28 Apr 2022 21:07:55 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34566 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1353722AbiD2BHq (ORCPT ); Thu, 28 Apr 2022 21:07:46 -0400 Received: from mail-pf1-x44a.google.com (mail-pf1-x44a.google.com [IPv6:2607:f8b0:4864:20::44a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1F4A0BC875 for ; Thu, 28 Apr 2022 18:04:26 -0700 (PDT) Received: by mail-pf1-x44a.google.com with SMTP id y141-20020a626493000000b0050d8c0745a3so2650604pfb.21 for ; Thu, 28 Apr 2022 18:04:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=reply-to:date:in-reply-to:message-id:mime-version:references :subject:from:to:cc; bh=Y7gKLvAp1p3RveznRBbFbm0Lo+y5YcSRX+jDV0xbRUg=; b=tWtOMpTlPqSbHAZ8AAAvm3vq0wYzfMiDS/xjibTVhQZwl1kosm21QeZ+m0cvPeadDt fKKRPAowcoyMjIM+O/pVXZ1bArrkezATPs9brXibFoXkyq62Zm0wcwh3ZJFQeTZw4NvP 7s8b61eNJ7GAYqThh3iPajH3arbG2tuEPBYSOHFhoA2/cwoS2lUHQPoJjn0Ayhqyne7y Dl5Puug2mvk711k/5Py9zES5RHwyuP71kCAakgimAS5doPEOqAL1c8AEzutoejzI97Q7 4xgVxMUmOansFxt8LR5869MwXRevwSQdWJwpNQ6n512AndjShI5uE+KGXYevcdH2s2z4 ii+Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:reply-to:date:in-reply-to:message-id :mime-version:references:subject:from:to:cc; bh=Y7gKLvAp1p3RveznRBbFbm0Lo+y5YcSRX+jDV0xbRUg=; b=n8GqOotbA7ADVDZsiJE9hUmuu9o0PXo7F+PzNv/PXdhZGRc3GoFrK8x3hLEchUM5rj Dc/g9reAWb1++eR80A8p7zIPm1uFxjUZt7nSMbv6dkqJ0c464drpgzAftxmokSpF/CBp hyczHyij/IEtVW2cVTf4OiGy6ULEOtKkqyxDf1/1VjgWSCKigVzpz13/zK6Dvi8M4s9Y N8kCRt5/nicnf9YVP4fC948cJ06ivk4y/12P367kIJ0YiLsNqvV0lX6ksv9EU+eyefxT ZOilxPEBhDh1XfChMTNqNeB2DqQIEUS8C0DVj83MERCaZG8zVXJcDBdGxPVBPZhyGXjN f97w== X-Gm-Message-State: AOAM532hzKiwHihgUI0PmgOUrHXqovztJOa6t9aK8bepeT70a5iK7lpy pf8v4ZNNLhpFwTNRGvnLhwy2FrahwkI= X-Google-Smtp-Source: ABdhPJwu72FzzFGpQThtNokReT4b9ApF02OAzwe9Fv4hC2B6uwlF5JMCh5iypRnr5EbK1PvBsiUXjY6rPNw= X-Received: from seanjc.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:3e5]) (user=seanjc job=sendgmr) by 2002:a17:90b:1e4e:b0:1da:3936:dc2e with SMTP id pi14-20020a17090b1e4e00b001da3936dc2emr1146759pjb.20.1651194265530; Thu, 28 Apr 2022 18:04:25 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 29 Apr 2022 01:04:10 +0000 In-Reply-To: <20220429010416.2788472-1-seanjc@google.com> Message-Id: <20220429010416.2788472-5-seanjc@google.com> Mime-Version: 1.0 References: <20220429010416.2788472-1-seanjc@google.com> X-Mailer: git-send-email 2.36.0.464.gb9c8b46e94-goog Subject: [PATCH 04/10] KVM: Avoid pfn_to_page() and vice versa when releasing pages From: Sean Christopherson To: Paolo Bonzini Cc: Sean Christopherson , Vitaly Kuznetsov , Wanpeng Li , Jim Mattson , Joerg Roedel , kvm@vger.kernel.org, linux-kernel@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Invert the order of KVM's page/pfn release helpers so that the "inner" helper operates on a page instead of a pfn. As pointed out by Linus[*], converting between struct page and a pfn isn't necessarily cheap, and that's not even counting the overhead of is_error_noslot_pfn() and kvm_is_reserved_pfn(). Even if the checks were dirt cheap, there's no reason to convert from a page to a pfn and back to a page, just to mark the page dirty/accessed or to put a reference to the page. Opportunistically drop a stale declaration of kvm_set_page_accessed() from kvm_host.h (there was no implementation). No functional change intended. [*] https://lore.kernel.org/all/CAHk-=3DwifQimj2d6npq-wCi5onYPjzQg4vyO4tFcP= JJZr268cRw@mail.gmail.com Signed-off-by: Sean Christopherson --- include/linux/kvm_host.h | 1 - virt/kvm/kvm_main.c | 58 +++++++++++++++++++++++++--------------- 2 files changed, 37 insertions(+), 22 deletions(-) diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 252ee4a61b58..e32fbde79298 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -1116,7 +1116,6 @@ unsigned long gfn_to_hva_memslot_prot(struct kvm_memo= ry_slot *slot, gfn_t gfn, bool *writable); void kvm_release_page_clean(struct page *page); void kvm_release_page_dirty(struct page *page); -void kvm_set_page_accessed(struct page *page); =20 kvm_pfn_t gfn_to_pfn(struct kvm *kvm, gfn_t gfn); kvm_pfn_t gfn_to_pfn_prot(struct kvm *kvm, gfn_t gfn, bool write_fault, diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 46d12998732e..ab7549195c68 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -2798,18 +2798,40 @@ struct page *kvm_vcpu_gfn_to_page(struct kvm_vcpu *= vcpu, gfn_t gfn) } EXPORT_SYMBOL_GPL(kvm_vcpu_gfn_to_page); =20 +static bool kvm_is_ad_tracked_page(struct page *page) +{ + /* + * Per page-flags.h, pages tagged PG_reserved "should in general not be + * touched (e.g. set dirty) except by its owner". + */ + return !PageReserved(page); +} + +static void kvm_set_page_dirty(struct page *page) +{ + if (kvm_is_ad_tracked_page(page)) + SetPageDirty(page); +} + +static void kvm_set_page_accessed(struct page *page) +{ + if (kvm_is_ad_tracked_page(page)) + mark_page_accessed(page); +} + void kvm_release_page_clean(struct page *page) { WARN_ON(is_error_page(page)); =20 - kvm_release_pfn_clean(page_to_pfn(page)); + kvm_set_page_accessed(page); + put_page(page); } EXPORT_SYMBOL_GPL(kvm_release_page_clean); =20 void kvm_release_pfn_clean(kvm_pfn_t pfn) { if (!is_error_noslot_pfn(pfn) && !kvm_is_reserved_pfn(pfn)) - put_page(pfn_to_page(pfn)); + kvm_release_page_clean(pfn_to_page(pfn)); } EXPORT_SYMBOL_GPL(kvm_release_pfn_clean); =20 @@ -2817,40 +2839,34 @@ void kvm_release_page_dirty(struct page *page) { WARN_ON(is_error_page(page)); =20 - kvm_release_pfn_dirty(page_to_pfn(page)); + kvm_set_page_dirty(page); + kvm_release_page_clean(page); } EXPORT_SYMBOL_GPL(kvm_release_page_dirty); =20 void kvm_release_pfn_dirty(kvm_pfn_t pfn) { - kvm_set_pfn_dirty(pfn); - kvm_release_pfn_clean(pfn); + if (!is_error_noslot_pfn(pfn) && !kvm_is_reserved_pfn(pfn)) + kvm_release_page_dirty(pfn_to_page(pfn)); } EXPORT_SYMBOL_GPL(kvm_release_pfn_dirty); =20 -static bool kvm_is_ad_tracked_pfn(kvm_pfn_t pfn) -{ - if (!pfn_valid(pfn)) - return false; - - /* - * Per page-flags.h, pages tagged PG_reserved "should in general not be - * touched (e.g. set dirty) except by its owner". - */ - return !PageReserved(pfn_to_page(pfn)); -} - +/* + * Note, checking for an error/noslot pfn is the caller's responsibility w= hen + * directly marking a page dirty/accessed. Unlike the "release" helpers, = the + * "set" helpers are not to be unused when the pfn might point at garbage. + */ void kvm_set_pfn_dirty(kvm_pfn_t pfn) { - if (kvm_is_ad_tracked_pfn(pfn)) - SetPageDirty(pfn_to_page(pfn)); + if (pfn_valid(pfn)) + kvm_set_page_dirty(pfn_to_page(pfn)); } EXPORT_SYMBOL_GPL(kvm_set_pfn_dirty); =20 void kvm_set_pfn_accessed(kvm_pfn_t pfn) { - if (kvm_is_ad_tracked_pfn(pfn)) - mark_page_accessed(pfn_to_page(pfn)); + if (pfn_valid(pfn)) + kvm_set_page_accessed(pfn_to_page(pfn)); } EXPORT_SYMBOL_GPL(kvm_set_pfn_accessed); =20 --=20 2.36.0.464.gb9c8b46e94-goog From nobody Mon Jun 15 12:47:09 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 5CB8DC433F5 for ; Fri, 29 Apr 2022 01:04:47 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1353768AbiD2BIB (ORCPT ); Thu, 28 Apr 2022 21:08:01 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34592 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1353737AbiD2BHq (ORCPT ); Thu, 28 Apr 2022 21:07:46 -0400 Received: from mail-pl1-x649.google.com (mail-pl1-x649.google.com [IPv6:2607:f8b0:4864:20::649]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id CB107BC87D for ; Thu, 28 Apr 2022 18:04:27 -0700 (PDT) Received: by mail-pl1-x649.google.com with SMTP id u8-20020a170903124800b0015195a5826cso3494186plh.4 for ; Thu, 28 Apr 2022 18:04:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=reply-to:date:in-reply-to:message-id:mime-version:references :subject:from:to:cc; bh=/vObjEr2duI6lVj2DJMiXx7mTG91sHLuRvuGuCnnp5s=; b=BTi4c7Cu302LzqbL4GcUUkcvj9CTYFdTcbPiomOjs7vaKzDfjVRNwHJbs/7uADbHVQ OTpoo7YsC7bnXCgBlljC7OPk26zAEDiYnR0gs7nHjjhjW/6x7PpusRMq0ZWHcwNW34el wksPfyimmN/zO0/29ZJCeSKRCVwaVzS/1vbxxc9WWUcCIHh3cjmoE4x4e0dMjbzhGMZY 1x3VEy8+MLdU7e0KJBtaLqY6vhnbcuRJAcbUICS2rWbRV4qZatC9pV93MLFe9pXIU9QL FcV9WBd9WsFMBbHF7Qjkds+qmE32xrEcyfoj6jj4IuoyHlM1J+BoiAFYUL0DyX2tRkh8 8MoA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:reply-to:date:in-reply-to:message-id :mime-version:references:subject:from:to:cc; bh=/vObjEr2duI6lVj2DJMiXx7mTG91sHLuRvuGuCnnp5s=; b=LvmXq8Tz1e4ts/8kc72cSgEoa4OOQaoeU7RP9thveWrJ12UJ4BMPh+PgWvJ5SlZUh0 Qtt4rkZUDNqOrf3lcBwRqbBQo9Y8UUUhKA0WNAgy56J/IYbDdaE0eOUU94j7Y6gUqyNm eSLJYBryaqpjoG8N4H3oCb6BptacRGkE7SFFEIW3KEX1OETdHpnF4eX8Jkf7OFWd5PEw 8uZkMk+1rt9HFmaatRkv0fIraD3q1ZF20KnVkeWNFesT6a+DvDxTsob/zhZQczMJjeR1 OmFSck6+k15U+c+VfBow9NuKZo2yAdR4lXIuPsMxa6cQJGkKmQWW7w/kS3NQK6eTaSqp Stkg== X-Gm-Message-State: AOAM531WFa0KVMRWVA1ZJ4fvuznVTSnAxGfQ+DXBTwLlxhnR4ZcL1mN7 1Wlu662uj69GYxMHcd4ZkICHkCsmhUU= X-Google-Smtp-Source: ABdhPJyfhCif5QV45qKzkrHHL1rKzaRwb2023co9r5r38s2V6rgHOlKAXbndsrdWBD5/pjYZRk7mhxSGPtM= X-Received: from seanjc.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:3e5]) (user=seanjc job=sendgmr) by 2002:a63:1056:0:b0:3a8:2190:9e27 with SMTP id 22-20020a631056000000b003a821909e27mr30475002pgq.303.1651194267207; Thu, 28 Apr 2022 18:04:27 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 29 Apr 2022 01:04:11 +0000 In-Reply-To: <20220429010416.2788472-1-seanjc@google.com> Message-Id: <20220429010416.2788472-6-seanjc@google.com> Mime-Version: 1.0 References: <20220429010416.2788472-1-seanjc@google.com> X-Mailer: git-send-email 2.36.0.464.gb9c8b46e94-goog Subject: [PATCH 05/10] KVM: nVMX: Use kvm_vcpu_map() to get/pin vmcs12's APIC-access page From: Sean Christopherson To: Paolo Bonzini Cc: Sean Christopherson , Vitaly Kuznetsov , Wanpeng Li , Jim Mattson , Joerg Roedel , kvm@vger.kernel.org, linux-kernel@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Use kvm_vcpu_map() to get/pin the backing for vmcs12's APIC-access page, there's no reason it has to be restricted to 'struct page' backing. The APIC-access page actually doesn't need to be backed by anything, which is ironically why it got left behind by the series which introduced kvm_vcpu_map()[1]; the plan was to shove a dummy pfn into vmcs02[2], but that code never got merged. Switching the APIC-access page to kvm_vcpu_map() doesn't preclude using a magic pfn in the future, and will allow a future patch to drop kvm_vcpu_gpa_to_page(). [1] https://lore.kernel.org/all/1547026933-31226-1-git-send-email-karahmed@= amazon.de [2] https://lore.kernel.org/lkml/1543845551-4403-1-git-send-email-karahmed@= amazon.de Signed-off-by: Sean Christopherson --- arch/x86/kvm/vmx/nested.c | 39 ++++++++++++--------------------------- arch/x86/kvm/vmx/vmx.h | 2 +- 2 files changed, 13 insertions(+), 28 deletions(-) diff --git a/arch/x86/kvm/vmx/nested.c b/arch/x86/kvm/vmx/nested.c index a6688663da4d..cc1c7836f172 100644 --- a/arch/x86/kvm/vmx/nested.c +++ b/arch/x86/kvm/vmx/nested.c @@ -311,11 +311,12 @@ static void free_nested(struct kvm_vcpu *vcpu) vmx->nested.cached_vmcs12 =3D NULL; kfree(vmx->nested.cached_shadow_vmcs12); vmx->nested.cached_shadow_vmcs12 =3D NULL; - /* Unpin physical memory we referred to in the vmcs02 */ - if (vmx->nested.apic_access_page) { - kvm_release_page_clean(vmx->nested.apic_access_page); - vmx->nested.apic_access_page =3D NULL; - } + /* + * Unpin physical memory we referred to in the vmcs02. The APIC access + * page's backing page (yeah, confusing) shouldn't actually be accessed, + * and if it is written, the contents are irrelevant. + */ + kvm_vcpu_unmap(vcpu, &vmx->nested.apic_access_page_map, false); kvm_vcpu_unmap(vcpu, &vmx->nested.virtual_apic_map, true); kvm_vcpu_unmap(vcpu, &vmx->nested.pi_desc_map, true); vmx->nested.pi_desc =3D NULL; @@ -3159,8 +3160,6 @@ static bool nested_get_vmcs12_pages(struct kvm_vcpu *= vcpu) struct vmcs12 *vmcs12 =3D get_vmcs12(vcpu); struct vcpu_vmx *vmx =3D to_vmx(vcpu); struct kvm_host_map *map; - struct page *page; - u64 hpa; =20 if (!vcpu->arch.pdptrs_from_userspace && !nested_cpu_has_ept(vmcs12) && is_pae_paging(vcpu)) { @@ -3175,23 +3174,12 @@ static bool nested_get_vmcs12_pages(struct kvm_vcpu= *vcpu) =20 =20 if (nested_cpu_has2(vmcs12, SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES)) { - /* - * Translate L1 physical address to host physical - * address for vmcs02. Keep the page pinned, so this - * physical address remains valid. We keep a reference - * to it so we can release it later. - */ - if (vmx->nested.apic_access_page) { /* shouldn't happen */ - kvm_release_page_clean(vmx->nested.apic_access_page); - vmx->nested.apic_access_page =3D NULL; - } - page =3D kvm_vcpu_gpa_to_page(vcpu, vmcs12->apic_access_addr); - if (!is_error_page(page)) { - vmx->nested.apic_access_page =3D page; - hpa =3D page_to_phys(vmx->nested.apic_access_page); - vmcs_write64(APIC_ACCESS_ADDR, hpa); + map =3D &vmx->nested.apic_access_page_map; + + if (!kvm_vcpu_map(vcpu, gpa_to_gfn(vmcs12->apic_access_addr), map)) { + vmcs_write64(APIC_ACCESS_ADDR, pfn_to_hpa(map->pfn)); } else { - pr_debug_ratelimited("%s: no backing 'struct page' for APIC-access addr= ess in vmcs12\n", + pr_debug_ratelimited("%s: no backing for APIC-access address in vmcs12\= n", __func__); vcpu->run->exit_reason =3D KVM_EXIT_INTERNAL_ERROR; vcpu->run->internal.suberror =3D @@ -4627,10 +4615,7 @@ void nested_vmx_vmexit(struct kvm_vcpu *vcpu, u32 vm= _exit_reason, } =20 /* Unpin physical memory we referred to in vmcs02 */ - if (vmx->nested.apic_access_page) { - kvm_release_page_clean(vmx->nested.apic_access_page); - vmx->nested.apic_access_page =3D NULL; - } + kvm_vcpu_unmap(vcpu, &vmx->nested.apic_access_page_map, false); kvm_vcpu_unmap(vcpu, &vmx->nested.virtual_apic_map, true); kvm_vcpu_unmap(vcpu, &vmx->nested.pi_desc_map, true); vmx->nested.pi_desc =3D NULL; diff --git a/arch/x86/kvm/vmx/vmx.h b/arch/x86/kvm/vmx/vmx.h index 9c6bfcd84008..2498774f36b2 100644 --- a/arch/x86/kvm/vmx/vmx.h +++ b/arch/x86/kvm/vmx/vmx.h @@ -203,7 +203,7 @@ struct nested_vmx { * Guest pages referred to in the vmcs02 with host-physical * pointers, so we must keep them pinned while L2 runs. */ - struct page *apic_access_page; + struct kvm_host_map apic_access_page_map; struct kvm_host_map virtual_apic_map; struct kvm_host_map pi_desc_map; =20 --=20 2.36.0.464.gb9c8b46e94-goog From nobody Mon Jun 15 12:47:09 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 B2BF0C433EF for ; Fri, 29 Apr 2022 01:04:44 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1353806AbiD2BH6 (ORCPT ); Thu, 28 Apr 2022 21:07:58 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34604 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1353749AbiD2BHr (ORCPT ); Thu, 28 Apr 2022 21:07:47 -0400 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 640CDBCB4A for ; Thu, 28 Apr 2022 18:04:29 -0700 (PDT) Received: by mail-pf1-x449.google.com with SMTP id k14-20020aa790ce000000b0050d3b201122so3496886pfk.20 for ; Thu, 28 Apr 2022 18:04:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=reply-to:date:in-reply-to:message-id:mime-version:references :subject:from:to:cc; bh=7deH61mGoYB4ZlBnE8zLBoEoBMhm4K+Y8QnNJey8Q/0=; b=AtgS7V3zeyxambCbsaXhx5Ary8nBi0SQVaPpfWNC0aZSMltlDVmgrzsU7EDJsjINBO JKRzyl5HN2G+YY0a1mSCjKBmZ+jvSydnOMRCq1+eW442uSOmBIhRdAPxQYcNFiyakrvd H9MC6hddrrAdsSDr0NrYZClsiLlfBSE2gmWU8LNHWHS5olVGrlXFX1fxXIDGvr60NR4h W3piXamKgkrLECRqWEnSCwOrGXrw7h8Rzuqb/dMPLWlOa49Zje9EnVzPU6dZ2W51f+sv 3C92b8OlztEddzGDQpayof9t8ka+aCjTPYj2bBTCyFAjoPthERXs/yw8wyBpVs8Ah4Mr f6Hg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:reply-to:date:in-reply-to:message-id :mime-version:references:subject:from:to:cc; bh=7deH61mGoYB4ZlBnE8zLBoEoBMhm4K+Y8QnNJey8Q/0=; b=SfARFNd9OeykJiQUb2zaxq6hjYlnefjUIc5UO6Pu2CHxphLlRIyciU8LISMdn4lyt2 Nyqmjzu5TMAatl98Li1E97XFXi+BY823D32a0qVXtLH7TLJDrG8HZcixIbS+IBT+2R/H jvMjOSciFLvGRM0Bz4HW8BD8mmHZGuScjPtjfS1Eh+hjHoMXmU4iar1A3bk9cqMTU/9k Vwnrz9CN1iiBqWSrnl2Rr2bCg1FuEF5x815GMaCpBgHJ8lKo56gj95NtbXCwTgH3TLYb My8tHWD+HrOSZYyvyiCRuUUJonXGNxxrLefKW4ZGdbk/0MOnualABT0rL7ho10KSUYrP i7PA== X-Gm-Message-State: AOAM530W1Ak4j7SBREeBtaVsaRHgZPvdytVS2LTbmMfQfh+aD9RkKlt0 cJjm1sYB92zQQFpjnyDt/U+UOfuqUN8= X-Google-Smtp-Source: ABdhPJwejiZUWaeVjKufYF31pNmMdDLWgurLb3gL2on2QnIngYC2CRcefYS1ikaCXH37G8mtbdTSCY58O/M= X-Received: from seanjc.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:3e5]) (user=seanjc job=sendgmr) by 2002:a17:902:c948:b0:15d:3888:7299 with SMTP id i8-20020a170902c94800b0015d38887299mr15242197pla.121.1651194268900; Thu, 28 Apr 2022 18:04:28 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 29 Apr 2022 01:04:12 +0000 In-Reply-To: <20220429010416.2788472-1-seanjc@google.com> Message-Id: <20220429010416.2788472-7-seanjc@google.com> Mime-Version: 1.0 References: <20220429010416.2788472-1-seanjc@google.com> X-Mailer: git-send-email 2.36.0.464.gb9c8b46e94-goog Subject: [PATCH 06/10] KVM: Don't WARN if kvm_pfn_to_page() encounters a "reserved" pfn From: Sean Christopherson To: Paolo Bonzini Cc: Sean Christopherson , Vitaly Kuznetsov , Wanpeng Li , Jim Mattson , Joerg Roedel , kvm@vger.kernel.org, linux-kernel@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Drop a WARN_ON() if kvm_pfn_to_page() encounters a "reserved" pfn, which in this context means a struct page that has PG_reserved but is not a/the ZERO_PAGE and is not a ZONE_DEVICE page. The usage, via gfn_to_page(), in x86 is safe as gfn_to_page() is used only to retrieve a page from KVM-controlled memslot, but the usage in PPC and s390 operates on arbitrary gfns and thus memslots that can be backed by incompatible memory. Signed-off-by: Sean Christopherson --- virt/kvm/kvm_main.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index ab7549195c68..a987188a426f 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -2703,10 +2703,8 @@ static struct page *kvm_pfn_to_page(kvm_pfn_t pfn) if (is_error_noslot_pfn(pfn)) return KVM_ERR_PTR_BAD_PAGE; =20 - if (kvm_is_reserved_pfn(pfn)) { - WARN_ON(1); + if (kvm_is_reserved_pfn(pfn)) return KVM_ERR_PTR_BAD_PAGE; - } =20 return pfn_to_page(pfn); } --=20 2.36.0.464.gb9c8b46e94-goog From nobody Mon Jun 15 12:47:09 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 D5B17C433F5 for ; Fri, 29 Apr 2022 01:04:49 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1353807AbiD2BID (ORCPT ); Thu, 28 Apr 2022 21:08:03 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34592 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1353757AbiD2BHr (ORCPT ); Thu, 28 Apr 2022 21:07:47 -0400 Received: from mail-pj1-x1049.google.com (mail-pj1-x1049.google.com [IPv6:2607:f8b0:4864:20::1049]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E07C4BC865 for ; Thu, 28 Apr 2022 18:04:30 -0700 (PDT) Received: by mail-pj1-x1049.google.com with SMTP id o7-20020a17090a0a0700b001d93c491131so6052126pjo.6 for ; Thu, 28 Apr 2022 18:04:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=reply-to:date:in-reply-to:message-id:mime-version:references :subject:from:to:cc; bh=jRYQ+NLKeR4ZgpGCTvtPE0cYfeNV63Iwo0ARpwv/qPY=; b=JhGpL8syvU+MGBw8KnylH1ePm331NSeic9lS7Z5ZF5e7M+15hOH6EFGvCEgcioZEMz jeWl8tHkY81V2r9sZsrDcraO0AXwwpmpLDxEYf1zTpi6juZuuj829DVfOOYFQHVz4L78 C5V2bnBrlGidvmXfsklJlULpLwYuTQCC/ytMTJmV8/HPrkzCywCqhpXBsIUAvyNCqS35 vOzZySnkbujZuFi1YkM+eoQgFp8VEfEdDERdfzR5uVl2a78uZxK2RT0Don7aQA7l2lQy quMSePLzEiNwz7p80QqEvxyLpYH6TjUy0BPS5zExsOSBQ0WElKokq4f+b7roou2nyDfe 68Sw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:reply-to:date:in-reply-to:message-id :mime-version:references:subject:from:to:cc; bh=jRYQ+NLKeR4ZgpGCTvtPE0cYfeNV63Iwo0ARpwv/qPY=; b=yRLDHDi8gs2ecuoTRZlFwj2fi1RiHC4JmPIo51UDIzNkwYsqHaMoZPUu0bu8Kj0Llx aAMgCwMMdb4H0KquK3Y6nmFTSw5DQfoS1NMaIbL3FEkaZVZYKPJRDUbXqYl1oU/C2rdN xzvjp66w6AlWN3SlJHfjVT/Id4tOKLHSSVRMJrgZMQXdadYlMT7nG4ssPdxDHnvAMHBJ L/TpZPKhDwMhu81dSAjLl3hjIElyxegeEYk0APEN4gORn0QlUrpkSJLT7ZhcFCkbY+U6 jsh5Bjogtx9PMHs9sLSnCdeP4P6T/7tCf3gP2X5+0q38g4yyv1wN46XVD+yecUQyXGq+ fxeA== X-Gm-Message-State: AOAM5307A1nO9BIwABKGbLGsiCw99711BqF2UyAj6Rp7mDwWDveQE/8J HTbWSFl2XLPAgVDEK2KqY+/+yWu8tRM= X-Google-Smtp-Source: ABdhPJzrPQf/+XtQJlw+fhpbt6qxsFNut9jsl6arSE5+6bvYrQrbs0GqX9KGmNI0vl2lemqfU/3OXErlNpw= X-Received: from seanjc.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:3e5]) (user=seanjc job=sendgmr) by 2002:a05:6a00:ad2:b0:4f1:2734:a3d9 with SMTP id c18-20020a056a000ad200b004f12734a3d9mr37921713pfl.61.1651194270433; Thu, 28 Apr 2022 18:04:30 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 29 Apr 2022 01:04:13 +0000 In-Reply-To: <20220429010416.2788472-1-seanjc@google.com> Message-Id: <20220429010416.2788472-8-seanjc@google.com> Mime-Version: 1.0 References: <20220429010416.2788472-1-seanjc@google.com> X-Mailer: git-send-email 2.36.0.464.gb9c8b46e94-goog Subject: [PATCH 07/10] KVM: Remove kvm_vcpu_gfn_to_page() and kvm_vcpu_gpa_to_page() From: Sean Christopherson To: Paolo Bonzini Cc: Sean Christopherson , Vitaly Kuznetsov , Wanpeng Li , Jim Mattson , Joerg Roedel , kvm@vger.kernel.org, linux-kernel@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Drop helpers to convert a gfn/gpa to a 'struct page' in the context of a vCPU. KVM doesn't require that guests be backed by 'struct page' memory, thus any use of helpers that assume 'struct page' is bound to be flawed, as was the case for the recently removed last user in x86's nested VMX. No functional change intended. Signed-off-by: Sean Christopherson --- include/linux/kvm_host.h | 7 ------- virt/kvm/kvm_main.c | 35 +++++++++++++---------------------- 2 files changed, 13 insertions(+), 29 deletions(-) diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index e32fbde79298..7e59bc5ec8c7 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -1207,7 +1207,6 @@ struct kvm_memory_slot *kvm_vcpu_gfn_to_memslot(struc= t kvm_vcpu *vcpu, gfn_t gfn kvm_pfn_t kvm_vcpu_gfn_to_pfn_atomic(struct kvm_vcpu *vcpu, gfn_t gfn); kvm_pfn_t kvm_vcpu_gfn_to_pfn(struct kvm_vcpu *vcpu, gfn_t gfn); int kvm_vcpu_map(struct kvm_vcpu *vcpu, gpa_t gpa, struct kvm_host_map *ma= p); -struct page *kvm_vcpu_gfn_to_page(struct kvm_vcpu *vcpu, gfn_t gfn); void kvm_vcpu_unmap(struct kvm_vcpu *vcpu, struct kvm_host_map *map, bool = dirty); unsigned long kvm_vcpu_gfn_to_hva(struct kvm_vcpu *vcpu, gfn_t gfn); unsigned long kvm_vcpu_gfn_to_hva_prot(struct kvm_vcpu *vcpu, gfn_t gfn, b= ool *writable); @@ -1695,12 +1694,6 @@ static inline hpa_t pfn_to_hpa(kvm_pfn_t pfn) return (hpa_t)pfn << PAGE_SHIFT; } =20 -static inline struct page *kvm_vcpu_gpa_to_page(struct kvm_vcpu *vcpu, - gpa_t gpa) -{ - return kvm_vcpu_gfn_to_page(vcpu, gpa_to_gfn(gpa)); -} - static inline bool kvm_is_error_gpa(struct kvm *kvm, gpa_t gpa) { unsigned long hva =3D gfn_to_hva(kvm, gpa_to_gfn(gpa)); diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index a987188a426f..661390243b9e 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -2698,24 +2698,25 @@ int gfn_to_page_many_atomic(struct kvm_memory_slot = *slot, gfn_t gfn, } EXPORT_SYMBOL_GPL(gfn_to_page_many_atomic); =20 -static struct page *kvm_pfn_to_page(kvm_pfn_t pfn) -{ - if (is_error_noslot_pfn(pfn)) - return KVM_ERR_PTR_BAD_PAGE; - - if (kvm_is_reserved_pfn(pfn)) - return KVM_ERR_PTR_BAD_PAGE; - - return pfn_to_page(pfn); -} - +/* + * Do not use this helper unless you are absolutely certain the gfn _must_= be + * backed by 'struct page'. A valid example is if the backing memslot is + * controlled by KVM. Note, if the returned page is valid, it's refcount = has + * been elevated by gfn_to_pfn(). + */ struct page *gfn_to_page(struct kvm *kvm, gfn_t gfn) { kvm_pfn_t pfn; =20 pfn =3D gfn_to_pfn(kvm, gfn); =20 - return kvm_pfn_to_page(pfn); + if (is_error_noslot_pfn(pfn)) + return KVM_ERR_PTR_BAD_PAGE; + + if (kvm_is_reserved_pfn(pfn)) + return KVM_ERR_PTR_BAD_PAGE; + + return pfn_to_page(pfn); } EXPORT_SYMBOL_GPL(gfn_to_page); =20 @@ -2786,16 +2787,6 @@ void kvm_vcpu_unmap(struct kvm_vcpu *vcpu, struct kv= m_host_map *map, bool dirty) } EXPORT_SYMBOL_GPL(kvm_vcpu_unmap); =20 -struct page *kvm_vcpu_gfn_to_page(struct kvm_vcpu *vcpu, gfn_t gfn) -{ - kvm_pfn_t pfn; - - pfn =3D kvm_vcpu_gfn_to_pfn(vcpu, gfn); - - return kvm_pfn_to_page(pfn); -} -EXPORT_SYMBOL_GPL(kvm_vcpu_gfn_to_page); - static bool kvm_is_ad_tracked_page(struct page *page) { /* --=20 2.36.0.464.gb9c8b46e94-goog From nobody Mon Jun 15 12:47:09 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 F41CCC433F5 for ; Fri, 29 Apr 2022 01:04:59 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1353858AbiD2BIN (ORCPT ); Thu, 28 Apr 2022 21:08:13 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34598 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1353727AbiD2BHs (ORCPT ); Thu, 28 Apr 2022 21:07:48 -0400 Received: from mail-pl1-x64a.google.com (mail-pl1-x64a.google.com [IPv6:2607:f8b0:4864:20::64a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A1647BC875 for ; Thu, 28 Apr 2022 18:04:32 -0700 (PDT) Received: by mail-pl1-x64a.google.com with SMTP id k2-20020a170902ba8200b0015613b12004so3476150pls.22 for ; Thu, 28 Apr 2022 18:04:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=reply-to:date:in-reply-to:message-id:mime-version:references :subject:from:to:cc; bh=LY2u2lqaDdU2rtmG5LcPIqbe73WGn22NYde+95hPItE=; b=cWLe21WPmchYvaVevotbm3RK57IRXwWPlljEv2giie3TBWz2Dy8eZ8j5HhoeRKHAq3 tppq79T1ifh2IfAZ3zdBVjqbioSc54vePGtsAJYJLrQ3YGxKKkqXfOAeb8Z6AVevPDzZ Wk+OXjGSXGZ/Pnv4zueW4U1FusGST5oBLlP9xX1UUce1el75F2HiEa6lphM4K0Ja4EAh 9ew+AFPQIpc2IAvgleeicESpsX/Fx9DE9AUes9it8ggC6ewQk57KmSZ0Qf/opTzAoj9S oh5CRIZ85IoRKgKMy9ivtUhxEK5KddmdSo3GyGpWc8LhgfIrbrkoYSay1gtYG/1Jp+GK xB1g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:reply-to:date:in-reply-to:message-id :mime-version:references:subject:from:to:cc; bh=LY2u2lqaDdU2rtmG5LcPIqbe73WGn22NYde+95hPItE=; b=42MJuvTjbe3WOiZEiUZ/D9vTKsnZOMIfxZqUCurWal0Ys3Yblu2FqIjCACcHdPxS9G 2qQIhcWmKyczoanrB4eP20BlowhD+gIV1I0HfK9NOlmAFU82/YDEK0WWD3tkOJJfSjSq fsHf05v4ekB2wmzJNIxJcEjVPFoo9SCN2Fk/fn7jOeaQULbe/k5SFV6qYHz5DB1HITqx BL+YAOfDoYxGIJgaOd6h6ivkBaGws6p7+fBRh28BD4iePSJ+v10DzL0FoqsK3V0sfiFB khH7cntAzWnx4QYN4DFs09Ie3GPEgMLORRXicQ3nGjbR5Y5FOyz5BwOIU/ptff+ArD3B /nUw== X-Gm-Message-State: AOAM531HlgmB6HUsR9kS1/ttT7Mz0FVbZpqBxq1BhPAxZy7luw+vZqYI z4YLWIaiCmQfWClATRl/4Icet223YHA= X-Google-Smtp-Source: ABdhPJzp5bseGEB5+5vqVGWm2HOpRA28amMeej102P4Z1OOptaZUyUaPxYLudkctFqNfk0NQ1rlfb/KXAJk= X-Received: from seanjc.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:3e5]) (user=seanjc job=sendgmr) by 2002:a17:90a:a58d:b0:1db:ed34:e46d with SMTP id b13-20020a17090aa58d00b001dbed34e46dmr1146636pjq.124.1651194272182; Thu, 28 Apr 2022 18:04:32 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 29 Apr 2022 01:04:14 +0000 In-Reply-To: <20220429010416.2788472-1-seanjc@google.com> Message-Id: <20220429010416.2788472-9-seanjc@google.com> Mime-Version: 1.0 References: <20220429010416.2788472-1-seanjc@google.com> X-Mailer: git-send-email 2.36.0.464.gb9c8b46e94-goog Subject: [PATCH 08/10] KVM: Take a 'struct page', not a pfn in kvm_is_zone_device_page() From: Sean Christopherson To: Paolo Bonzini Cc: Sean Christopherson , Vitaly Kuznetsov , Wanpeng Li , Jim Mattson , Joerg Roedel , kvm@vger.kernel.org, linux-kernel@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Operate on a 'struct page' instead of a pfn when checking if a page is a ZONE_DEVICE page, and rename the helper accordingly. Generally speaking, KVM doesn't actually care about ZONE_DEVICE memory, i.e. shouldn't do anything special for ZONE_DEVICE memory. Rather, KVM wants to treat ZONE_DEVICE memory like regular memory, and the need to identify ZONE_DEVICE memory only arises as an exception to PG_reserved pages. In other words, KVM should only ever check for ZONE_DEVICE memory after KVM has already verified that there is a struct page associated with the pfn. No functional change intended. Signed-off-by: Sean Christopherson --- arch/x86/kvm/mmu/mmu.c | 3 ++- include/linux/kvm_host.h | 2 +- virt/kvm/kvm_main.c | 8 ++++---- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c index 904f0faff218..5cf1436adecd 100644 --- a/arch/x86/kvm/mmu/mmu.c +++ b/arch/x86/kvm/mmu/mmu.c @@ -2821,11 +2821,12 @@ static void direct_pte_prefetch(struct kvm_vcpu *vc= pu, u64 *sptep) static int host_pfn_mapping_level(struct kvm *kvm, gfn_t gfn, kvm_pfn_t pf= n, const struct kvm_memory_slot *slot) { + struct page *page =3D pfn_to_page(pfn); unsigned long hva; pte_t *pte; int level; =20 - if (!PageCompound(pfn_to_page(pfn)) && !kvm_is_zone_device_pfn(pfn)) + if (!PageCompound(page) && !kvm_is_zone_device_page(page)) return PG_LEVEL_4K; =20 /* diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 7e59bc5ec8c7..4ccc309a43f2 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -1548,7 +1548,7 @@ void kvm_arch_sync_events(struct kvm *kvm); int kvm_cpu_has_pending_timer(struct kvm_vcpu *vcpu); =20 bool kvm_is_reserved_pfn(kvm_pfn_t pfn); -bool kvm_is_zone_device_pfn(kvm_pfn_t pfn); +bool kvm_is_zone_device_page(struct page *page); =20 struct kvm_irq_ack_notifier { struct hlist_node link; diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 661390243b9e..cbc6d58081d4 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -164,7 +164,7 @@ __weak void kvm_arch_mmu_notifier_invalidate_range(stru= ct kvm *kvm, { } =20 -bool kvm_is_zone_device_pfn(kvm_pfn_t pfn) +bool kvm_is_zone_device_page(struct page *page) { /* * The metadata used by is_zone_device_page() to determine whether or @@ -172,10 +172,10 @@ bool kvm_is_zone_device_pfn(kvm_pfn_t pfn) * the device has been pinned, e.g. by get_user_pages(). WARN if the * page_count() is zero to help detect bad usage of this helper. */ - if (!pfn_valid(pfn) || WARN_ON_ONCE(!page_count(pfn_to_page(pfn)))) + if (WARN_ON_ONCE(!page_count(page))) return false; =20 - return is_zone_device_page(pfn_to_page(pfn)); + return is_zone_device_page(page); } =20 bool kvm_is_reserved_pfn(kvm_pfn_t pfn) @@ -188,7 +188,7 @@ bool kvm_is_reserved_pfn(kvm_pfn_t pfn) if (pfn_valid(pfn)) return PageReserved(pfn_to_page(pfn)) && !is_zero_pfn(pfn) && - !kvm_is_zone_device_pfn(pfn); + !kvm_is_zone_device_page(pfn_to_page(pfn)); =20 return true; } --=20 2.36.0.464.gb9c8b46e94-goog From nobody Mon Jun 15 12:47:09 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 75393C433F5 for ; Fri, 29 Apr 2022 01:04:52 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1353847AbiD2BIG (ORCPT ); Thu, 28 Apr 2022 21:08:06 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34728 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1353763AbiD2BHv (ORCPT ); Thu, 28 Apr 2022 21:07:51 -0400 Received: from mail-oa1-x4a.google.com (mail-oa1-x4a.google.com [IPv6:2001:4860:4864:20::4a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id AE1C1BCB40 for ; Thu, 28 Apr 2022 18:04:34 -0700 (PDT) Received: by mail-oa1-x4a.google.com with SMTP id 586e51a60fabf-e981f65611so2817573fac.16 for ; Thu, 28 Apr 2022 18:04:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=reply-to:date:in-reply-to:message-id:mime-version:references :subject:from:to:cc; bh=NHfyCHEJZYENeoLwqQFAfCF8L8X/o5WJjfhCbB2cHt4=; b=EfExUhXUiLrwyV7994PFB6YkzupgYDTk1fOzzD43sqWEIhnqz4VxlMsUs6rJYkL2c2 UHkj4j+jJP1M82ORtLm3BFtNlJ+D5dTmiAvtsB2GhRYxsuuKq893xPiGwZ0ei23FWBQC ZjEt9zcYLlb7NuG2lE4aWW7MOU+hMnf2O0Jzjfx+IO9aT39X6aFXV4s9TaayfaIepy32 p319sAP05bz7FbG9qej14u1NCj1cauMo/32ziEfPT2Tge0fn9wlyN8e85GdmJ2qI65TJ LWoGLOBjJe4LRnmIuXwxmbrw1JZOh6dG7deOIVf8eG7QSk7wiZq2R1iQbm9wgMDbuNzs SpQQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:reply-to:date:in-reply-to:message-id :mime-version:references:subject:from:to:cc; bh=NHfyCHEJZYENeoLwqQFAfCF8L8X/o5WJjfhCbB2cHt4=; b=K+GpamidIY+arzesydPElaOXqtxkB0VzN0Gup2j2PxuoPf7HVa8HfRybx7GCZRizHF 483IWYIYwTZIOwafyqVIXlhRpoK/ZZzN3IajysSNdTXTjW5b+lNe8c1YiIlM5Z5JQyi0 ITOqssoVX67nIOYRx2rPNlRJ1xNeW3GMmuBQUxWzw3NZ+2YE8PADg/etT0YNJv3OBOSA 1uTGNg8ouuXVOU9tTGCyx1VYAhUVQq3Ge1Mq1xMIliLweiYqt+0jlN7bepgSczzCTpQO K9H6mrNY0jZGVcdX4EidG7EM2oA/aWpUJYUL+5qSjs6mEgk1lJDFw2usUafv+9Ywi6Re lpeg== X-Gm-Message-State: AOAM532sQDKAdCD4afqljY7rsQVv4O6FtKolnB4a2K/JCSNMHnXxKpCj qsnMtm0r5+OH/b+ODR7k+hy/T8YMdEw= X-Google-Smtp-Source: ABdhPJy9ZN6claN5bUS4Gx7s4Oh/ztbqa0ljq+2apJ+cSltsX6m1OwIlCwyVg4+xVNlXleEnqdXkgU/VZ1M= X-Received: from seanjc.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:3e5]) (user=seanjc job=sendgmr) by 2002:a05:6808:e8c:b0:322:4b82:d33d with SMTP id k12-20020a0568080e8c00b003224b82d33dmr426226oil.21.1651194273924; Thu, 28 Apr 2022 18:04:33 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 29 Apr 2022 01:04:15 +0000 In-Reply-To: <20220429010416.2788472-1-seanjc@google.com> Message-Id: <20220429010416.2788472-10-seanjc@google.com> Mime-Version: 1.0 References: <20220429010416.2788472-1-seanjc@google.com> X-Mailer: git-send-email 2.36.0.464.gb9c8b46e94-goog Subject: [PATCH 09/10] KVM: Rename/refactor kvm_is_reserved_pfn() to kvm_pfn_to_refcounted_page() From: Sean Christopherson To: Paolo Bonzini Cc: Sean Christopherson , Vitaly Kuznetsov , Wanpeng Li , Jim Mattson , Joerg Roedel , kvm@vger.kernel.org, linux-kernel@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Rename and refactor kvm_is_reserved_pfn() to kvm_pfn_to_refcounted_page() to better reflect what KVM is actually checking, and to eliminate extra pfn_to_page() lookups. The kvm_release_pfn_*() an kvm_try_get_pfn() helpers in particular benefit from "refouncted" nomenclature, as it's not all that obvious why KVM needs to get/put refcounts for some PG_reserved pages (ZERO_PAGE and ZONE_DEVICE). Add a comment to call out that the list of exceptions to PG_reserved is all but guaranteed to be incomplete. The list has mostly been compiled by people throwing noodles at KVM and finding out they stick a little too well, e.g. the ZERO_PAGE's refcount overflowed and ZONE_DEVICE pages didn't get freed. No functional change intended. Signed-off-by: Sean Christopherson --- arch/x86/kvm/mmu/mmu.c | 15 +++++---- arch/x86/kvm/mmu/tdp_mmu.c | 2 +- include/linux/kvm_host.h | 2 +- virt/kvm/kvm_main.c | 66 ++++++++++++++++++++++++++++++-------- 4 files changed, 63 insertions(+), 22 deletions(-) diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c index 5cf1436adecd..7da6741d6ea7 100644 --- a/arch/x86/kvm/mmu/mmu.c +++ b/arch/x86/kvm/mmu/mmu.c @@ -587,6 +587,7 @@ static int mmu_spte_clear_track_bits(struct kvm *kvm, u= 64 *sptep) kvm_pfn_t pfn; u64 old_spte =3D *sptep; int level =3D sptep_to_sp(sptep)->role.level; + struct page *page; =20 if (!spte_has_volatile_bits(old_spte)) __update_clear_spte_fast(sptep, 0ull); @@ -601,11 +602,13 @@ static int mmu_spte_clear_track_bits(struct kvm *kvm,= u64 *sptep) pfn =3D spte_to_pfn(old_spte); =20 /* - * KVM does not hold the refcount of the page used by - * kvm mmu, before reclaiming the page, we should - * unmap it from mmu first. + * KVM doesn't hold a reference to any pages mapped into the guest, and + * instead uses the mmu_notifier to ensure that KVM unmaps any pages + * before they are reclaimed. Sanity check that, if the pfn is backed + * by a refcounted page, the refcount is elevated. */ - WARN_ON(!kvm_is_reserved_pfn(pfn) && !page_count(pfn_to_page(pfn))); + page =3D kvm_pfn_to_refcounted_page(pfn); + WARN_ON(page && !page_count(page)); =20 if (is_accessed_spte(old_spte)) kvm_set_pfn_accessed(pfn); @@ -2877,7 +2880,7 @@ void kvm_mmu_hugepage_adjust(struct kvm_vcpu *vcpu, s= truct kvm_page_fault *fault if (unlikely(fault->max_level =3D=3D PG_LEVEL_4K)) return; =20 - if (is_error_noslot_pfn(fault->pfn) || kvm_is_reserved_pfn(fault->pfn)) + if (is_error_noslot_pfn(fault->pfn) || !kvm_pfn_to_refcounted_page(fault-= >pfn)) return; =20 if (kvm_slot_dirty_track_enabled(slot)) @@ -5947,7 +5950,7 @@ static bool kvm_mmu_zap_collapsible_spte(struct kvm *= kvm, * the guest, and the guest page table is using 4K page size * mapping if the indirect sp has level =3D 1. */ - if (sp->role.direct && !kvm_is_reserved_pfn(pfn) && + if (sp->role.direct && kvm_pfn_to_refcounted_page(pfn) && sp->role.level < kvm_mmu_max_mapping_level(kvm, slot, sp->gfn, pfn, PG_LEVEL_NUM)) { pte_list_remove(kvm, rmap_head, sptep); diff --git a/arch/x86/kvm/mmu/tdp_mmu.c b/arch/x86/kvm/mmu/tdp_mmu.c index 566548a3efa7..de2cc963dbec 100644 --- a/arch/x86/kvm/mmu/tdp_mmu.c +++ b/arch/x86/kvm/mmu/tdp_mmu.c @@ -1737,7 +1737,7 @@ static void zap_collapsible_spte_range(struct kvm *kv= m, continue; =20 pfn =3D spte_to_pfn(iter.old_spte); - if (kvm_is_reserved_pfn(pfn) || + if (!kvm_pfn_to_refcounted_page(pfn) || iter.level >=3D kvm_mmu_max_mapping_level(kvm, slot, iter.gfn, pfn, PG_LEVEL_NUM)) continue; diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 4ccc309a43f2..9d5818b782f9 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -1547,7 +1547,7 @@ void kvm_arch_sync_events(struct kvm *kvm); =20 int kvm_cpu_has_pending_timer(struct kvm_vcpu *vcpu); =20 -bool kvm_is_reserved_pfn(kvm_pfn_t pfn); +struct page *kvm_pfn_to_refcounted_page(kvm_pfn_t pfn); bool kvm_is_zone_device_page(struct page *page); =20 struct kvm_irq_ack_notifier { diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index cbc6d58081d4..656c47037eea 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -178,19 +178,36 @@ bool kvm_is_zone_device_page(struct page *page) return is_zone_device_page(page); } =20 -bool kvm_is_reserved_pfn(kvm_pfn_t pfn) +/* + * Returns a 'struct page' if the pfn is "valid" and backed by a refcounted + * page, NULL otherwise. Note, the list of refcounted PG_reserved page ty= pes + * is likely incomplete, it has been compiled purely through people wantin= g to + * back guest with a certain type of memory and encountering issues. + */ +struct page *kvm_pfn_to_refcounted_page(kvm_pfn_t pfn) { + struct page *page; + + if (!pfn_valid(pfn)) + return NULL; + + page =3D pfn_to_page(pfn); + if (!PageReserved(page)) + return page; + + /* The ZERO_PAGE(s) is marked PG_reserved, but is refcounted. */ + if (is_zero_pfn(pfn)) + return page; + /* * ZONE_DEVICE pages currently set PG_reserved, but from a refcounting * perspective they are "normal" pages, albeit with slightly different * usage rules. */ - if (pfn_valid(pfn)) - return PageReserved(pfn_to_page(pfn)) && - !is_zero_pfn(pfn) && - !kvm_is_zone_device_page(pfn_to_page(pfn)); + if (kvm_is_zone_device_page(page)) + return page; =20 - return true; + return NULL; } =20 /* @@ -2479,9 +2496,12 @@ static bool vma_is_valid(struct vm_area_struct *vma,= bool write_fault) =20 static int kvm_try_get_pfn(kvm_pfn_t pfn) { - if (kvm_is_reserved_pfn(pfn)) + struct page *page =3D kvm_pfn_to_refcounted_page(pfn); + + if (!page) return 1; - return get_page_unless_zero(pfn_to_page(pfn)); + + return get_page_unless_zero(page); } =20 static int hva_to_pfn_remapped(struct vm_area_struct *vma, @@ -2706,6 +2726,7 @@ EXPORT_SYMBOL_GPL(gfn_to_page_many_atomic); */ struct page *gfn_to_page(struct kvm *kvm, gfn_t gfn) { + struct page *page; kvm_pfn_t pfn; =20 pfn =3D gfn_to_pfn(kvm, gfn); @@ -2713,10 +2734,11 @@ struct page *gfn_to_page(struct kvm *kvm, gfn_t gfn) if (is_error_noslot_pfn(pfn)) return KVM_ERR_PTR_BAD_PAGE; =20 - if (kvm_is_reserved_pfn(pfn)) + page =3D kvm_pfn_to_refcounted_page(pfn); + if (!page) return KVM_ERR_PTR_BAD_PAGE; =20 - return pfn_to_page(pfn); + return page; } EXPORT_SYMBOL_GPL(gfn_to_page); =20 @@ -2819,8 +2841,16 @@ EXPORT_SYMBOL_GPL(kvm_release_page_clean); =20 void kvm_release_pfn_clean(kvm_pfn_t pfn) { - if (!is_error_noslot_pfn(pfn) && !kvm_is_reserved_pfn(pfn)) - kvm_release_page_clean(pfn_to_page(pfn)); + struct page *page; + + if (is_error_noslot_pfn(pfn)) + return; + + page =3D kvm_pfn_to_refcounted_page(pfn); + if (!page) + return; + + kvm_release_page_clean(page); } EXPORT_SYMBOL_GPL(kvm_release_pfn_clean); =20 @@ -2835,8 +2865,16 @@ EXPORT_SYMBOL_GPL(kvm_release_page_dirty); =20 void kvm_release_pfn_dirty(kvm_pfn_t pfn) { - if (!is_error_noslot_pfn(pfn) && !kvm_is_reserved_pfn(pfn)) - kvm_release_page_dirty(pfn_to_page(pfn)); + struct page *page; + + if (is_error_noslot_pfn(pfn)) + return; + + page =3D kvm_pfn_to_refcounted_page(pfn); + if (!page) + return; + + kvm_release_page_dirty(page); } EXPORT_SYMBOL_GPL(kvm_release_pfn_dirty); =20 --=20 2.36.0.464.gb9c8b46e94-goog From nobody Mon Jun 15 12:47:09 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 320CCC433EF for ; Fri, 29 Apr 2022 01:05:02 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1353817AbiD2BIP (ORCPT ); Thu, 28 Apr 2022 21:08:15 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34602 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1353772AbiD2BHw (ORCPT ); Thu, 28 Apr 2022 21:07:52 -0400 Received: from mail-pg1-x54a.google.com (mail-pg1-x54a.google.com [IPv6:2607:f8b0:4864:20::54a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2448EBC879 for ; Thu, 28 Apr 2022 18:04:36 -0700 (PDT) Received: by mail-pg1-x54a.google.com with SMTP id x2-20020a63aa42000000b003aafe948eeeso3209471pgo.0 for ; Thu, 28 Apr 2022 18:04:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=reply-to:date:in-reply-to:message-id:mime-version:references :subject:from:to:cc; bh=NFp7K8Sjv/vAI1JLTFSd8X9Uxcf8+O/4N0wyohIecW4=; b=MeMNHrhvIY+IQbG/CYO0Q1CrteMY07/gcrCNOfHdmVywdCt8O2Plv1D3u7ZpG3x1nI MM3swrVCIMXp5XaKHm7JyyLeetRDMFAqc8g+KFGypMsa7MLFQJABwBPvsPV+dAQmKRw2 X2g/tIBZO/VbKQnAdxN55H7rPoz6jBZSmtjH5hzD1HGDJOcOpP/hwwBHIBAanPDoS9f5 +y6cd/4+1MJ6szaQSA8aI5AJq5kahtqBv4IEfVTrcr+glJ1c1JEU68zRmuXzzULqQNJr DvnPR1IO05cHIZcSBcpyvdGFRDjij7wP628IE2/JeRWUxD1cQLvzL/prRi+Eq41aa2Of A8sg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:reply-to:date:in-reply-to:message-id :mime-version:references:subject:from:to:cc; bh=NFp7K8Sjv/vAI1JLTFSd8X9Uxcf8+O/4N0wyohIecW4=; b=DaUuoDVYjY2YzTL3/lC464rvcmyAT4iUxqNwwmOfYmVPw6EnrnXSLrcwFNIuZNA/0C L/q7rDH/y31O8G6MMJsjSzyXyVqXV2GQOXz4ufNNdoG9Oed/8CaoYSXrp9xkjmR6ETXc VK2Hg2ixnNNd6v6BZSPoSaYc57eIhLrYdrirjgiKjgNFiS8xavanyrHrgsEileVxuRy0 FADCMs3SLYrK2gWmKaeM3SS//IY0kKng9WyPKY6LKZ4W5A4mVC0a11yJG69gdOQW2V+g 0bnjoJ6cjHJvlBbXgPgh95s7cV44c90hKV7vntOFa+f16Wk1knAYgf2i4xyzJC4y1O6g rSpw== X-Gm-Message-State: AOAM531GNw9aDgb/CdtcBc2HxoqMuS7UPlioKaCsQPQDsXja8MyvBVcK aXdQFBNRYpCyKzYSznZQCp4PbfiL+I4= X-Google-Smtp-Source: ABdhPJx8581mpEqS+OF/vbbg6/vEcOQagjZDHIrCx+28J0pzty67F/6uDSxH0CAfDbIvZpVClQZVg1o78m0= X-Received: from seanjc.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:3e5]) (user=seanjc job=sendgmr) by 2002:a17:903:2444:b0:15d:281d:87 with SMTP id l4-20020a170903244400b0015d281d0087mr19178900pls.9.1651194275630; Thu, 28 Apr 2022 18:04:35 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 29 Apr 2022 01:04:16 +0000 In-Reply-To: <20220429010416.2788472-1-seanjc@google.com> Message-Id: <20220429010416.2788472-11-seanjc@google.com> Mime-Version: 1.0 References: <20220429010416.2788472-1-seanjc@google.com> X-Mailer: git-send-email 2.36.0.464.gb9c8b46e94-goog Subject: [PATCH 10/10] KVM: x86/mmu: Shove refcounted page dependency into host_pfn_mapping_level() From: Sean Christopherson To: Paolo Bonzini Cc: Sean Christopherson , Vitaly Kuznetsov , Wanpeng Li , Jim Mattson , Joerg Roedel , kvm@vger.kernel.org, linux-kernel@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Move the check that restricts mapping huge pages into the guest to pfns that are backed by refcounted 'struct page' memory into the helper that actually "requires" a 'struct page', host_pfn_mapping_level(). In addition to deduplicating code, moving the check to the helper eliminates the subtle requirement that the caller check that the incoming pfn is backed by a refcounted struct page, and as an added bonus avoids an extra pfn_to_page() lookup. Note, the is_error_noslot_pfn() check in kvm_mmu_hugepage_adjust() needs to stay where it is, as it guards against dereferencing a NULL memslot in the kvm_slot_dirty_track_enabled() that follows. No functional change intended. Signed-off-by: Sean Christopherson --- arch/x86/kvm/mmu/mmu.c | 14 +++++++++++--- arch/x86/kvm/mmu/tdp_mmu.c | 3 +-- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c index 7da6741d6ea7..20c8f3cb6b4d 100644 --- a/arch/x86/kvm/mmu/mmu.c +++ b/arch/x86/kvm/mmu/mmu.c @@ -2824,11 +2824,19 @@ static void direct_pte_prefetch(struct kvm_vcpu *vc= pu, u64 *sptep) static int host_pfn_mapping_level(struct kvm *kvm, gfn_t gfn, kvm_pfn_t pf= n, const struct kvm_memory_slot *slot) { - struct page *page =3D pfn_to_page(pfn); unsigned long hva; + struct page *page; pte_t *pte; int level; =20 + /* + * Note, @slot must be non-NULL, i.e. the caller is responsible for + * ensuring @pfn isn't garbage and is backed by a memslot. + */ + page =3D kvm_pfn_to_refcounted_page(pfn); + if (!page) + return PG_LEVEL_4K; + if (!PageCompound(page) && !kvm_is_zone_device_page(page)) return PG_LEVEL_4K; =20 @@ -2880,7 +2888,7 @@ void kvm_mmu_hugepage_adjust(struct kvm_vcpu *vcpu, s= truct kvm_page_fault *fault if (unlikely(fault->max_level =3D=3D PG_LEVEL_4K)) return; =20 - if (is_error_noslot_pfn(fault->pfn) || !kvm_pfn_to_refcounted_page(fault-= >pfn)) + if (is_error_noslot_pfn(fault->pfn)) return; =20 if (kvm_slot_dirty_track_enabled(slot)) @@ -5950,7 +5958,7 @@ static bool kvm_mmu_zap_collapsible_spte(struct kvm *= kvm, * the guest, and the guest page table is using 4K page size * mapping if the indirect sp has level =3D 1. */ - if (sp->role.direct && kvm_pfn_to_refcounted_page(pfn) && + if (sp->role.direct && sp->role.level < kvm_mmu_max_mapping_level(kvm, slot, sp->gfn, pfn, PG_LEVEL_NUM)) { pte_list_remove(kvm, rmap_head, sptep); diff --git a/arch/x86/kvm/mmu/tdp_mmu.c b/arch/x86/kvm/mmu/tdp_mmu.c index de2cc963dbec..25efaf7da91f 100644 --- a/arch/x86/kvm/mmu/tdp_mmu.c +++ b/arch/x86/kvm/mmu/tdp_mmu.c @@ -1737,8 +1737,7 @@ static void zap_collapsible_spte_range(struct kvm *kv= m, continue; =20 pfn =3D spte_to_pfn(iter.old_spte); - if (!kvm_pfn_to_refcounted_page(pfn) || - iter.level >=3D kvm_mmu_max_mapping_level(kvm, slot, iter.gfn, + if (iter.level >=3D kvm_mmu_max_mapping_level(kvm, slot, iter.gfn, pfn, PG_LEVEL_NUM)) continue; =20 --=20 2.36.0.464.gb9c8b46e94-goog