Received: by 2002:a05:6a10:6d25:0:0:0:0 with SMTP id gq37csp1907052pxb; Mon, 13 Sep 2021 07:57:13 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxcVwJRTRzDLZUAHTqaOxWA4/sa+df2PUT7y5bU7RkWZ7lW68d4niM+EBSptaHuramkwhfK X-Received: by 2002:a17:906:a3d9:: with SMTP id ca25mr13035346ejb.306.1631545032806; Mon, 13 Sep 2021 07:57:12 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1631545032; cv=none; d=google.com; s=arc-20160816; b=zpaH/pPckNims+hgYJt7qGDKlY0F+cBPyrTBaVfE+hDNvw6Ic1Unyg8k8NYhDCM2LN p2vpxr0uD3bc1iyjw2OqkKIvOG4bDNnckzrN19zP9x6W1qSd6+1MuXUTpXok9aLnzeke MbDP3DAg/06+l0wKybTMyVTk3HN3UH4SiEiVpi4wFXE87WkFqXua5JCOJ8SglgcRYQTQ ErINLZUK+h5gs8PAfMcAcMJ/QQc3aJioF7BrpzXN2S7gXeaZGFKSKS+jNugLTLlwgMQs AdZb2WcXkfeKFT/IQqAzhx9IRLO9HSmX2Ed/9nS68s7aQKaDHQJyGxJL3d12AOEb+vdi wbFw== 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=J79WcN+vTaR42DBcRQgI6fzArD3AUkPygLtViAdEmI0=; b=ZTuyny1FgMeY2bNCrcg2Hm3fgPRkCV5ZOfYD/JInUQtdM14Hx0/IKYdnM6w5tSWk5n uOX+z7u+muCP/OjWh4d4yDMjmVyKZwDAmDF5xaJ8RzhYjwHgBBf3QL5tEV29j890isS0 npvt21UVBGaF9J9kIAElBTdzgXHDBbeK0n4/NdfB/o6SWiNe0ARWKjlJ5IzLESVS1Q+S TDFGO6vyL/im+14z1uXqmAH4g4WGbLTqacOkjuiUTrBWm8/B/JZJQpuI+vpyC/K4DC6W +CmIZA6mPZmC+atwxQmGYpUfvbVdvzJ+Z7JIzTdN3Hh9nCh8gF87mDwhgaB5AJ3bsCZ3 qj2Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b="LyUn/IrZ"; 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 q9si7125769ejn.647.2021.09.13.07.56.45; Mon, 13 Sep 2021 07:57:12 -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="LyUn/IrZ"; 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 S1346681AbhIMOxs (ORCPT + 99 others); Mon, 13 Sep 2021 10:53:48 -0400 Received: from mail.kernel.org ([198.145.29.99]:39094 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1346945AbhIMOrS (ORCPT ); Mon, 13 Sep 2021 10:47:18 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id B002B63233; Mon, 13 Sep 2021 13:59:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1631541547; bh=UFT6MBapqXV9h9DMkaVCdmLDjLLWejZRghtRFrPmvsE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=LyUn/IrZg61vAoC9bfcjd/td25j5K5t59+Ovw4euwYrw1CL3RjwLmyDQIJLYVc13+ r8mpISvUFNzg9hl2IJQysyzCeWS4A29olJirc7rhqV5EvSEvK8QewyOe+vfw6MuVC2 27r8cOhFb4z4XkFlxjeAU8rsn0KWYRXh3Z1LksWQ= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Paolo Bonzini Subject: [PATCH 5.14 313/334] KVM: x86: clamp host mapping level to max_level in kvm_mmu_max_mapping_level Date: Mon, 13 Sep 2021 15:16:07 +0200 Message-Id: <20210913131124.007245104@linuxfoundation.org> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20210913131113.390368911@linuxfoundation.org> References: <20210913131113.390368911@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: Paolo Bonzini commit ec607a564f70519b340f7eb4cfc0f4a6b55285ac upstream. This change started as a way to make kvm_mmu_hugepage_adjust a bit simpler, but it does fix two bugs as well. One bug is in zapping collapsible PTEs. If a large page size is disallowed but not all of them, kvm_mmu_max_mapping_level will return the host mapping level and the small PTEs will be zapped up to that level. However, if e.g. 1GB are prohibited, we can still zap 4KB mapping and preserve the 2MB ones. This can happen for example when NX huge pages are in use. The second would happen when userspace backs guest memory with a 1gb hugepage but only assign a subset of the page to the guest. 1gb pages would be disallowed by the memslot, but not 2mb. kvm_mmu_max_mapping_level() would fall through to the host_pfn_mapping_level() logic, see the 1gb hugepage, and map the whole thing into the guest. Fixes: 2f57b7051fe8 ("KVM: x86/mmu: Persist gfn_lpage_is_disallowed() to max_level") Cc: stable@vger.kernel.org Signed-off-by: Paolo Bonzini Signed-off-by: Greg Kroah-Hartman --- arch/x86/kvm/mmu/mmu.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) --- a/arch/x86/kvm/mmu/mmu.c +++ b/arch/x86/kvm/mmu/mmu.c @@ -2846,6 +2846,7 @@ int kvm_mmu_max_mapping_level(struct kvm kvm_pfn_t pfn, int max_level) { struct kvm_lpage_info *linfo; + int host_level; max_level = min(max_level, max_huge_page_level); for ( ; max_level > PG_LEVEL_4K; max_level--) { @@ -2857,7 +2858,8 @@ int kvm_mmu_max_mapping_level(struct kvm if (max_level == PG_LEVEL_4K) return PG_LEVEL_4K; - return host_pfn_mapping_level(kvm, gfn, pfn, slot); + host_level = host_pfn_mapping_level(kvm, gfn, pfn, slot); + return min(host_level, max_level); } int kvm_mmu_hugepage_adjust(struct kvm_vcpu *vcpu, gfn_t gfn, @@ -2881,17 +2883,12 @@ int kvm_mmu_hugepage_adjust(struct kvm_v if (!slot) return PG_LEVEL_4K; - level = kvm_mmu_max_mapping_level(vcpu->kvm, slot, gfn, pfn, max_level); - if (level == PG_LEVEL_4K) - return level; - - *req_level = level = min(level, max_level); - /* * Enforce the iTLB multihit workaround after capturing the requested * level, which will be used to do precise, accurate accounting. */ - if (huge_page_disallowed) + *req_level = level = kvm_mmu_max_mapping_level(vcpu->kvm, slot, gfn, pfn, max_level); + if (level == PG_LEVEL_4K || huge_page_disallowed) return PG_LEVEL_4K; /*