From nobody Mon Sep 15 11:33:05 2025 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 40EDEC54EBC for ; Thu, 12 Jan 2023 16:46:38 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240945AbjALQqh (ORCPT ); Thu, 12 Jan 2023 11:46:37 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42566 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240183AbjALQib (ORCPT ); Thu, 12 Jan 2023 11:38:31 -0500 Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id AE8EE1B1DA; Thu, 12 Jan 2023 08:34:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1673541242; x=1705077242; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=8tKpWJ6dGu0PFUpmHJd6TKXbCbQWdvtgkc200MFqP1s=; b=gfJCV5HIKJXZJBNfF9nbEnoYqjlA+jWwaG+9j8+s39LHYYXf+i85XZX5 ATYYVZ1u15DFQ2ARh3OxiTz1TyS5HVZXaLpLkn8/pKj0Sli/5CtIQY2qp 7ZwVvlor072BUvrSYAvAVBGoP7vQkDRJ+eOX1jnJRKFEoFsHXKbG6eRjo RN9uCeb0taWD9fmmsZ6wlcJf9+oFPlDfkManQDx9xLR+NcTBDQvWJsBBj iLKEKofZ+MoKi0U0ZZCLy1h9yVhyR68qgix1RTc1+dSJZ5cU8eucN2KG2 MdEcO7diPbDLyrD+5FZ10xOK6xST1JJ3iYXY9qI3Gq60aWc6xtm+V4iaT w==; X-IronPort-AV: E=McAfee;i="6500,9779,10588"; a="323811852" X-IronPort-AV: E=Sophos;i="5.97,211,1669104000"; d="scan'208";a="323811852" Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by fmsmga103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jan 2023 08:33:27 -0800 X-IronPort-AV: E=McAfee;i="6500,9779,10588"; a="721151777" X-IronPort-AV: E=Sophos;i="5.97,211,1669104000"; d="scan'208";a="721151777" Received: from ls.sc.intel.com (HELO localhost) ([143.183.96.54]) by fmsmga008-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jan 2023 08:33:27 -0800 From: isaku.yamahata@intel.com To: kvm@vger.kernel.org, linux-kernel@vger.kernel.org Cc: isaku.yamahata@intel.com, isaku.yamahata@gmail.com, Paolo Bonzini , erdemaktas@google.com, Sean Christopherson , Sagi Shahar , David Matlack Subject: [PATCH v11 042/113] KVM: Add flags to struct kvm_gfn_range Date: Thu, 12 Jan 2023 08:31:50 -0800 Message-Id: <3e5e7c40608e9fc1b3aff53fca0ba9b3a37744b3.1673539699.git.isaku.yamahata@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Isaku Yamahata kvm_unmap_gfn_range() needs to know the reason of the callback for TDX. mmu notifier, set memattr ioctl or restrictedmem notifier. Based on the reason, TDX changes the behavior. For mmu notifier, it's the operation on shared memory slot to zap shared PTE. For set memattr, it's the operation of private<->shared conversion, zap the original PTE. For restrictedmem, it's punching a hole of the range, zap the corresponding PTE. Signed-off-by: Isaku Yamahata --- include/linux/kvm_host.h | 9 ++++++++- virt/kvm/kvm_main.c | 5 ++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index cd1f3634dd6a..0c3b9cf0a731 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -256,12 +256,19 @@ bool kvm_setup_async_pf(struct kvm_vcpu *vcpu, gpa_t = cr2_or_gpa, int kvm_async_pf_wakeup_all(struct kvm_vcpu *vcpu); #endif =20 +#define KVM_GFN_RANGE_FLAGS_RESTRICTED_MEM BIT(0) +#define KVM_GFN_RANGE_FLAGS_SET_MEM_ATTR BIT(1) + struct kvm_gfn_range { struct kvm_memory_slot *slot; gfn_t start; gfn_t end; - pte_t pte; + union { + pte_t pte; + u64 attrs; + }; bool may_block; + unsigned int flags; }; bool kvm_unmap_gfn_range(struct kvm *kvm, struct kvm_gfn_range *range); =20 diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 6c61b71b56d2..aef8802b188e 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -669,6 +669,7 @@ static __always_inline int __kvm_handle_hva_range(struc= t kvm *kvm, gfn_range.start =3D hva_to_gfn_memslot(hva_start, slot); gfn_range.end =3D hva_to_gfn_memslot(hva_end + PAGE_SIZE - 1, slot); gfn_range.slot =3D slot; + gfn_range.flags =3D 0; =20 if (!locked) { locked =3D true; @@ -971,6 +972,7 @@ static void kvm_restrictedmem_invalidate_begin(struct r= estrictedmem_notifier *no gfn_range.slot =3D slot; gfn_range.pte =3D __pte(0); gfn_range.may_block =3D true; + gfn_range.flags =3D KVM_GFN_RANGE_FLAGS_RESTRICTED_MEM; =20 idx =3D srcu_read_lock(&kvm->srcu); KVM_MMU_LOCK(kvm); @@ -2511,8 +2513,9 @@ static void kvm_unmap_mem_range(struct kvm *kvm, gfn_= t start, gfn_t end, int i; int r =3D 0; =20 - gfn_range.pte =3D __pte(0); + gfn_range.attrs =3D attrs; gfn_range.may_block =3D true; + gfn_range.flags =3D KVM_GFN_RANGE_FLAGS_SET_MEM_ATTR; =20 for (i =3D 0; i < KVM_ADDRESS_SPACE_NUM; i++) { slots =3D __kvm_memslots(kvm, i); --=20 2.25.1