Received: by 2002:ac2:464d:0:0:0:0:0 with SMTP id s13csp3272971lfo; Mon, 23 May 2022 00:25:27 -0700 (PDT) X-Google-Smtp-Source: ABdhPJynCzTVSvHUfONytDiiJB7yM6GFRBoVHMsa0RxWajG8OH/mq2L10OHncIDbwFq4crMC4bo6 X-Received: by 2002:a17:903:28d:b0:162:1eae:bb0e with SMTP id j13-20020a170903028d00b001621eaebb0emr5147586plr.38.1653290727358; Mon, 23 May 2022 00:25:27 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1653290727; cv=none; d=google.com; s=arc-20160816; b=RasOZE1gMvWXG2jZ3nJYN0/eU1IAaIMWntDhhDhboHzNWqAl1lfpxHW7uEdRV4+4yC wSfoLBQwkDPqnkE8dznM2SqfSgahoZ4HWHehx17zao337EBKkEiYmd8oPIV0Uem+INcu Wieoxc2+QAYXCeCwuDZYWs0mZE4aAgi7Vv1bPYxJmayuXlzGEhcMpa036j1HOmuLYBdk ng1QYjXAC2XdwdjiWZfSz9oOuzlhYqYju3mVA3XxqTtc6pqBmVnWcbjSKzlsQ9CGoNbg FA8bqHWl+5G/0V4aaONwpwSnymV+DXgo/v0ab95lQR/SZXGqFMKSqVhHx65MxCFwoht+ uZeQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:dkim-signature; bh=LEcoGUtASg7L12J/ZwcGjQp6K0Il0IXJCxqacljc2XE=; b=bAAUpMypPh/4E8kCDpHNSQj7nTyyB5+tHHqdnpSNw7v/uOe9d7EOFwOzUZqUTgJLXR Qnm3ErgiRd+OYAJtxb3VAzxBMkseoy9XJR4Gv5Mw8Oy2a021ID9jjQE5c/UJhBtt1Z7+ hQucb3Vo9biuGZu+DCbQdjhknbC8mVyfPiX/XsN5Mv1ApiCP4dRGeGJGiUzYqRgU1dEY 9Fe2FJZqnp60rKbc/VnXjvwrGCLBmXsJCTuhaN0OS0l2cMl9Xd+T2/uqG/gJUqhBlL6F FevB1sMgKJxnCF0jr7KdBuDtiB08yfZ/u/orTljsKAEWY4NmqCytQ55vzPEpaYQbsbV2 UXSA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20210112 header.b="F/XYIRLn"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net. [2620:137:e000::1:18]) by mx.google.com with ESMTPS id nb17-20020a17090b35d100b001dc21092149si3427390pjb.140.2022.05.23.00.25.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 May 2022 00:25:27 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) client-ip=2620:137:e000::1:18; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20210112 header.b="F/XYIRLn"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id EE4CADE328; Sun, 22 May 2022 23:39:30 -0700 (PDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1353541AbiEUNQK (ORCPT + 99 others); Sat, 21 May 2022 09:16:10 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37284 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237249AbiEUNQH (ORCPT ); Sat, 21 May 2022 09:16:07 -0400 Received: from mail-pg1-x52e.google.com (mail-pg1-x52e.google.com [IPv6:2607:f8b0:4864:20::52e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A9A0315702; Sat, 21 May 2022 06:16:05 -0700 (PDT) Received: by mail-pg1-x52e.google.com with SMTP id a38so7044195pgl.9; Sat, 21 May 2022 06:16:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=LEcoGUtASg7L12J/ZwcGjQp6K0Il0IXJCxqacljc2XE=; b=F/XYIRLnlSp6q9kjViACzlTmOXyNfxxBRaXBaJfrDrSJF0exs0vTnoguUQcHI44cf8 qNsHp/wpzIM3sCtgfsc1nDLE+zhQzwgSUjDtFUYYzs1E8ghymyuhjlZ3o4GcqLUgkYpi 2G2Ho7HnkD/XmvCY9ObRwSf7FANCntENwkSE6JkL44h+mJnvjYtPnHmWeZ3DoEcTEehZ ftC8jTJAy3jPvJ63WB+FOsff9puMcUXkuP5D22ZA5nE+ByJigWG6v7QoeSph8YnFEXDP aQtKIgBQO5fhl+JnZveSna6TOS0u/8EaWgGUgyyxG2aJmbWO0xW4byDCErvIN351pmos vQ/A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=LEcoGUtASg7L12J/ZwcGjQp6K0Il0IXJCxqacljc2XE=; b=g3f/Nr2T5dA+0gzV/vB1NZWV3DKOhB29BRH5+oDZ1l11Q2DeYA53o6e5CDFOjyhQzc CFqrtm0robuNIgAeHbGisi3oLnLtz3sJbf4X6YsS/NWcD+MhLWAqi5Gj2vmHIyir8pBY ebo6CBrzG4KxLmK1gUQuWuBr9p6opdpC60vdc9OqFI7vxRT2TG3pVSPii+M7N4WrDKdg bJNDd4QJKKOikdngsFzJ9YKEhntKaMtYlBUh7Vq+Ls6BDvupoT0LyvINHQSaGS4zqYt5 M8K62YuvADug8I8MwG/PWUVcijS5Kocn+GvNUQGXZf/elfLAV3bsE/FWC9SR0QrZiS/5 zNTA== X-Gm-Message-State: AOAM530YZ+hV/8vUins8w6+g2MrNObkM26M/7WXxHUcxz+Qjsn6+/yHl 4+J5FQlv/qMUTzAEvIR/AaQ71yPZl9k= X-Received: by 2002:a05:6a00:2187:b0:50c:ef4d:ef3b with SMTP id h7-20020a056a00218700b0050cef4def3bmr14538539pfi.83.1653138964817; Sat, 21 May 2022 06:16:04 -0700 (PDT) Received: from localhost ([47.251.4.198]) by smtp.gmail.com with ESMTPSA id o2-20020a170902d4c200b0016168e90f2csm1549877plg.208.2022.05.21.06.16.04 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Sat, 21 May 2022 06:16:04 -0700 (PDT) From: Lai Jiangshan To: linux-kernel@vger.kernel.org, kvm@vger.kernel.org, Paolo Bonzini , Sean Christopherson Cc: Vitaly Kuznetsov , Maxim Levitsky , David Matlack , Lai Jiangshan Subject: [PATCH V3 00/12] KVM: X86/MMU: Use one-off local shadow page for special roots Date: Sat, 21 May 2022 21:16:48 +0800 Message-Id: <20220521131700.3661-1-jiangshanlai@gmail.com> X-Mailer: git-send-email 2.19.1.6.gb485710b MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RDNS_NONE, SPF_HELO_NONE,T_SCC_BODY_TEXT_LINE autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Lai Jiangshan Current code uses mmu->pae_root, mmu->pml4_root, and mmu->pml5_root to setup special roots. The initialization code is complex and the roots are not associated with struct kvm_mmu_page which causes the code more complex. So add new local shadow pages to simplify it. The local shadow pages are associated with struct kvm_mmu_page and VCPU-local. The local shadow pages are created and freed when the roots are changed (or one-off) which can be optimized but not in the patchset since the re-creating is light way (in normal case only the struct kvm_mmu_page needs to be re-allocated and sp->spt doens't, because it is likely to be mmu->pae_root) The patchset also fixes a possible bug described in: https://lore.kernel.org/lkml/20220415103414.86555-1-jiangshanlai@gmail.com/ as patch1. And the fixing is simplifed in patch9 with the help of local shadow page. Note: using_local_root_page() can be implemented in two ways. static bool using_local_root_page(struct kvm_mmu *mmu) { return mmu->root_role.level == PT32E_ROOT_LEVEL || (!mmu->root_role.direct && mmu->cpu_role.base.level <= PT32E_ROOT_LEVEL); } static bool using_local_root_page(struct kvm_mmu *mmu) { if (mmu->root_role.direct) return mmu->root_role.level == PT32E_ROOT_LEVEL; else return mmu->cpu_role.base.level <= PT32E_ROOT_LEVEL; } I prefer the second way. But when I wrote the documents for them. I couldn't explain well enough for the second way. Maybe I explained the second way in a wrong aspect or my English is not qualified to explain it. So I put the first way in patch 2 and the second way in patch3. Patch3 adds much more documents and changes the first way to the second way. Patch3 can be discarded. Changed from v2: Add document for using_local_root_page() Update many documents Address review comments Add a patch that fix a possible bug (and split other patches for patch9) Changed from v1: Rebase to newest kvm/queue. Slightly update patch4. [V2]: https://lore.kernel.org/lkml/20220503150735.32723-1-jiangshanlai@gmail.com/ [V1]: https://lore.kernel.org/lkml/20220420132605.3813-1-jiangshanlai@gmail.com/ Lai Jiangshan (12): KVM: X86/MMU: Verify PDPTE for nested NPT in PAE paging mode when page fault KVM: X86/MMU: Add using_local_root_page() KVM: X86/MMU: Reduce a check in using_local_root_page() for common cases KVM: X86/MMU: Add local shadow pages KVM: X86/MMU: Link PAE root pagetable with its children KVM: X86/MMU: Activate local shadow pages and remove old logic KVM: X86/MMU: Remove the check of the return value of to_shadow_page() KVM: X86/MMU: Allocate mmu->pae_root for PAE paging on-demand KVM: X86/MMU: Move the verifying of NPT's PDPTE in FNAME(fetch) KVM: X86/MMU: Remove unused INVALID_PAE_ROOT and IS_VALID_PAE_ROOT KVM: X86/MMU: Don't use mmu->pae_root when shadowing PAE NPT in 64-bit host KVM: X86/MMU: Remove mmu_alloc_special_roots() arch/x86/include/asm/kvm_host.h | 5 +- arch/x86/kvm/mmu/mmu.c | 575 ++++++++++++++------------------ arch/x86/kvm/mmu/mmu_internal.h | 10 - arch/x86/kvm/mmu/paging_tmpl.h | 51 ++- arch/x86/kvm/mmu/spte.c | 7 + arch/x86/kvm/mmu/spte.h | 1 + arch/x86/kvm/mmu/tdp_mmu.h | 7 +- arch/x86/kvm/x86.c | 4 +- 8 files changed, 303 insertions(+), 357 deletions(-) -- 2.19.1.6.gb485710b