Received: by 2002:a05:6a10:9848:0:0:0:0 with SMTP id x8csp3381462pxf; Mon, 5 Apr 2021 10:30:24 -0700 (PDT) X-Google-Smtp-Source: ABdhPJx1Kc6jhha1/obX4/27mshYh6R2lndkujrpjUobS4J5GKSuiabPBzXkSdcCUZMua0TmB97i X-Received: by 2002:a17:906:ecaa:: with SMTP id qh10mr29805055ejb.425.1617643824287; Mon, 05 Apr 2021 10:30:24 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1617643824; cv=none; d=google.com; s=arc-20160816; b=cuIcTN3Ry2MVv9aFCw8gPzjHvnPW4c3znLRSGbfTJ4rcEy/FxWSB7aciT1fvH6lvFT FJOwaJM2NMFliiNwGFTJT7sh/jW4puGyrylv46CvwPmqarrI/SFKAMJNEXl71RFmSv4J iKLTxf0G1cxFwHIXdis+FU3CE9KOR4IBz98Vub/zAUtLIvKcmQJAlok9ZMGJ8Ub/ks4h meqOOzarr9CyLYnaTMAAHm7jZEWnULgsX9bPkj7PjWAlpZFP920mCiTsaD97FA+wf9za yAzMZHVE2npxos4JaV1J0NDxz2Ta1kdN34UCUBJRckRhhnlPobud0P2SL4sv7USNaO0S eBBw== 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 :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=d4tUc++o0eIYBrpMNOrw23msKtexJ3oSxj6YEYBJJMI=; b=hDjQI+VF76AFihkVYY5j5sE1XFm9lb4v/QxU7nMDHlvGPihlhTNWpgdBPyzUGYy/Pc LKhNzCnUZX6RYSI4DaTmqcooLCTmum7pAs8EX/feLphDU1oX6LRM2+fUFS1J8cQDdMWD H6Ha5JbddlXAzOODwO2AUb6T5yoaeJrnZdgNmtEIXOV/qE36TPvCvRAMBp/u8sJpv+rq RWk3EMye2OxG0w3ipPW58fUlaTrxDeXWh4QfjRoA7lRZsGXcnDvifETuYauBbhyfborC MpxYR83uu1h2aoauglI07ILhZd5W5bsjJdtZUn5bajr2MzK7vi1kWjlTzj5IdIPfmGcX m+KA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=w4vO5Mae; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id i26si4142465edx.43.2021.04.05.10.30.01; Mon, 05 Apr 2021 10:30:24 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=w4vO5Mae; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240991AbhDEJXd (ORCPT + 99 others); Mon, 5 Apr 2021 05:23:33 -0400 Received: from mail.kernel.org ([198.145.29.99]:40178 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240643AbhDEJR5 (ORCPT ); Mon, 5 Apr 2021 05:17:57 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 95FDC61002; Mon, 5 Apr 2021 09:17:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1617614272; bh=ed7zGFRyj9lYWwEiWmJdD4qTh+LC8HNBqzgp7RsaQ3I=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=w4vO5MaeOFCILhSYCxUFYMsAS22uVNLuLtHzCfDgfJmRq3Ty7Csu7+rg0NSGbar7Z z+1466a/nQW9g4OXTumh9+6PEqGfNWX0o+EvFktVkZJXh43bfeqYot/grAEjUa9mPO SFvR0fCjfdF+MlYAdW9eISr9VsP5sNlDF+Y6ibQA= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Peter Feiner , Paolo Bonzini , Ben Gardon , Sasha Levin Subject: [PATCH 5.11 111/152] KVM: x86/mmu: Factor out handling of removed page tables Date: Mon, 5 Apr 2021 10:54:20 +0200 Message-Id: <20210405085037.838787784@linuxfoundation.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210405085034.233917714@linuxfoundation.org> References: <20210405085034.233917714@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Ben Gardon [ Upstream commit a066e61f13cf4b17d043ad8bea0cdde2b1e5ee49 ] Factor out the code to handle a disconnected subtree of the TDP paging structure from the code to handle the change to an individual SPTE. Future commits will build on this to allow asynchronous page freeing. No functional change intended. Reviewed-by: Peter Feiner Acked-by: Paolo Bonzini Signed-off-by: Ben Gardon Message-Id: <20210202185734.1680553-6-bgardon@google.com> Signed-off-by: Paolo Bonzini Signed-off-by: Sasha Levin --- arch/x86/kvm/mmu/tdp_mmu.c | 71 ++++++++++++++++++++++---------------- 1 file changed, 42 insertions(+), 29 deletions(-) diff --git a/arch/x86/kvm/mmu/tdp_mmu.c b/arch/x86/kvm/mmu/tdp_mmu.c index 3a8bbc812a28..3efaa8b44e45 100644 --- a/arch/x86/kvm/mmu/tdp_mmu.c +++ b/arch/x86/kvm/mmu/tdp_mmu.c @@ -234,6 +234,45 @@ static void handle_changed_spte_dirty_log(struct kvm *kvm, int as_id, gfn_t gfn, } } +/** + * handle_removed_tdp_mmu_page - handle a pt removed from the TDP structure + * + * @kvm: kvm instance + * @pt: the page removed from the paging structure + * + * Given a page table that has been removed from the TDP paging structure, + * iterates through the page table to clear SPTEs and free child page tables. + */ +static void handle_removed_tdp_mmu_page(struct kvm *kvm, u64 *pt) +{ + struct kvm_mmu_page *sp = sptep_to_sp(pt); + int level = sp->role.level; + gfn_t gfn = sp->gfn; + u64 old_child_spte; + int i; + + trace_kvm_mmu_prepare_zap_page(sp); + + list_del(&sp->link); + + if (sp->lpage_disallowed) + unaccount_huge_nx_page(kvm, sp); + + for (i = 0; i < PT64_ENT_PER_PAGE; i++) { + old_child_spte = READ_ONCE(*(pt + i)); + WRITE_ONCE(*(pt + i), 0); + handle_changed_spte(kvm, kvm_mmu_page_as_id(sp), + gfn + (i * KVM_PAGES_PER_HPAGE(level - 1)), + old_child_spte, 0, level - 1); + } + + kvm_flush_remote_tlbs_with_address(kvm, gfn, + KVM_PAGES_PER_HPAGE(level)); + + free_page((unsigned long)pt); + kmem_cache_free(mmu_page_header_cache, sp); +} + /** * handle_changed_spte - handle bookkeeping associated with an SPTE change * @kvm: kvm instance @@ -254,10 +293,6 @@ static void __handle_changed_spte(struct kvm *kvm, int as_id, gfn_t gfn, bool was_leaf = was_present && is_last_spte(old_spte, level); bool is_leaf = is_present && is_last_spte(new_spte, level); bool pfn_changed = spte_to_pfn(old_spte) != spte_to_pfn(new_spte); - u64 *pt; - struct kvm_mmu_page *sp; - u64 old_child_spte; - int i; WARN_ON(level > PT64_ROOT_MAX_LEVEL); WARN_ON(level < PG_LEVEL_4K); @@ -321,31 +356,9 @@ static void __handle_changed_spte(struct kvm *kvm, int as_id, gfn_t gfn, * Recursively handle child PTs if the change removed a subtree from * the paging structure. */ - if (was_present && !was_leaf && (pfn_changed || !is_present)) { - pt = spte_to_child_pt(old_spte, level); - sp = sptep_to_sp(pt); - - trace_kvm_mmu_prepare_zap_page(sp); - - list_del(&sp->link); - - if (sp->lpage_disallowed) - unaccount_huge_nx_page(kvm, sp); - - for (i = 0; i < PT64_ENT_PER_PAGE; i++) { - old_child_spte = READ_ONCE(*(pt + i)); - WRITE_ONCE(*(pt + i), 0); - handle_changed_spte(kvm, as_id, - gfn + (i * KVM_PAGES_PER_HPAGE(level - 1)), - old_child_spte, 0, level - 1); - } - - kvm_flush_remote_tlbs_with_address(kvm, gfn, - KVM_PAGES_PER_HPAGE(level)); - - free_page((unsigned long)pt); - kmem_cache_free(mmu_page_header_cache, sp); - } + if (was_present && !was_leaf && (pfn_changed || !is_present)) + handle_removed_tdp_mmu_page(kvm, + spte_to_child_pt(old_spte, level)); } static void handle_changed_spte(struct kvm *kvm, int as_id, gfn_t gfn, -- 2.30.1