Received: by 2002:a05:6358:3188:b0:123:57c1:9b43 with SMTP id q8csp1651572rwd; Thu, 15 Jun 2023 13:39:06 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ6vMvFNNbk69flITHbgn8scVYxrUI8jl3MrbGcWL3FO9nKpZNo/Gr8PceCpp9pJfiZcGHle X-Received: by 2002:aca:6742:0:b0:399:b0ee:de1 with SMTP id b2-20020aca6742000000b00399b0ee0de1mr218552oiy.49.1686861546125; Thu, 15 Jun 2023 13:39:06 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1686861546; cv=none; d=google.com; s=arc-20160816; b=wsaaThUphRXejdd08JmfkZwvnVPs6/4lnFwfGYTlGXnZYquvSSDuxDG0H6yJtDqgxS JA3B1YPW7/1O51oeBlyJ1x3Pal7mBUwbtL7a+IeJ+G294RiuuI2cbOGLInI8EkLgGz1l b36Yftyif4cur3sABTRxq1CD4O0lU/HBGyKiHzEK0q+OFxikL6k/Q3srieQx69/94OaF v8zkQWSe6/q/DALF2P/gOlLAlZqo0q3UGs+SnbEApnLoi8yTim5Mu/bcjKBsFc+gkXoS 5XQX52tsMU3fsvJ7NtZ9GZv26xcOeahWMTqVmfKkQBni1z9dg6zxzC8CCUzVqowNQWcV vF5g== 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 :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=qTls79v90/5gpfV6VlfH0x9FDlYIa9rH8qcJ9mzLJXU=; b=gealV/8wAyv0rboZCr0v4tl99JyzO/oUYvbwsHtrabYOQbPi/a1IAh+mMXqV5qalNN hg4b4CnqLNCH1UwZArshuQkHxvhPL4/YWfqpBjAOnVKFGkfeniVVwASQmoS+3898gx44 nGmnfdmLV7udXwci2ysEbg63LleDj/JzTzW8SgPCJ+ArC+1N+sfAtjpi9zL0+ILrF+kE u2FBViW1yN80/QbtMYk1joYscYCyoR4EVCAroTK/h5oY52nKiLmdD3IakDNQBSnIZvij wFOrd2PLs9oL8jjdBux4BNeDAvRYAVB6K3VXiGE5lpXjaAPZZ1mObNkftgPEIM+Pf4Ky Z56Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=GcT1IbQG; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id fz12-20020a17090b024c00b0025bae7f2b10si137049pjb.13.2023.06.15.13.38.54; Thu, 15 Jun 2023 13:39:06 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=GcT1IbQG; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237349AbjFOUNC (ORCPT + 99 others); Thu, 15 Jun 2023 16:13:02 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38642 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235249AbjFOUMl (ORCPT ); Thu, 15 Jun 2023 16:12:41 -0400 Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 30DDE1BDB; Thu, 15 Jun 2023 13:12:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1686859960; x=1718395960; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=uidS/Azok9aj46kMl0B6yHBkyaymtg8HjXcA/9hKJoQ=; b=GcT1IbQGxAJXplqUqzjNdA9aKhd4hoZW0M019HMc8aO4qWL86LQ6XD6/ VVSzuZ9OUgxtmxOEyxafwz0jZj8nFcaSKGl9IaJvOSzbeJC8TmTNIXdSL B0FuAWUUw/gDdJ0s5B3ktvu8Gblza8DRJRb7N4QIrp5bwy0P8U2TLD8BG 7UuOK3BVDQJLD772cYSCDzZq0l0iUDbsrEEGVfX4Ee0ZmcMzLQkfYofY/ cFiQQM34FJugx9ramPMhNMOVPqB5po8PddcPhlcgJ0zT+tQ+lSJE5U+Eu YZBoA3Cpp17spyLOeJXXXNQqoySS+vXoPs7fYMPlNlyRjov59NcOstJRU A==; X-IronPort-AV: E=McAfee;i="6600,9927,10742"; a="387611473" X-IronPort-AV: E=Sophos;i="6.00,245,1681196400"; d="scan'208";a="387611473" Received: from orsmga002.jf.intel.com ([10.7.209.21]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 15 Jun 2023 13:12:39 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10742"; a="712576662" X-IronPort-AV: E=Sophos;i="6.00,245,1681196400"; d="scan'208";a="712576662" Received: from ls.sc.intel.com (HELO localhost) ([172.25.112.31]) by orsmga002-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 15 Jun 2023 13:12:39 -0700 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 , Kai Huang , Zhi Wang , chen.bo@intel.com, linux-coco@lists.linux.dev, Chao Peng , Ackerley Tng , Vishal Annapurve , Michael Roth Subject: [RFC PATCH 5/6] KVM: Add flags to struct kvm_gfn_range Date: Thu, 15 Jun 2023 13:12:18 -0700 Message-Id: X-Mailer: git-send-email 2.25.1 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-4.4 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_MED, RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL,SPF_HELO_NONE,SPF_NONE, T_SCC_BODY_TEXT_LINE autolearn=ham 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: Isaku Yamahata TDX and SEV-SNP need to know the reason for a callback by kvm_unmap_gfn_range(). mmu notifier, set memory attributes ioctl or KVM gmem callback. The callback handler changes the behavior or does the additional housekeeping operation. For mmu notifier, it's zapping shared PTE. For set memory attributes, it's the conversion of memory attributes (private <=> shared). For KVM gmem, it's punching a hole in the range, and releasing the file. Signed-off-by: Isaku Yamahata --- include/linux/kvm_host.h | 11 ++++++++++- virt/kvm/guest_mem.c | 10 +++++++--- virt/kvm/kvm_main.c | 4 +++- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 1a47cedae8a1..c049c0aa44d6 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -256,12 +256,21 @@ int kvm_async_pf_wakeup_all(struct kvm_vcpu *vcpu); #endif #ifdef CONFIG_KVM_GENERIC_MMU_NOTIFIER + +#define KVM_GFN_RANGE_FLAGS_SET_MEM_ATTR BIT(0) +#define KVM_GFN_RANGE_FLAGS_GMEM_PUNCH_HOLE BIT(1) +#define KVM_GFN_RANGE_FLAGS_GMEM_RELEASE BIT(2) + 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); bool kvm_age_gfn(struct kvm *kvm, struct kvm_gfn_range *range); diff --git a/virt/kvm/guest_mem.c b/virt/kvm/guest_mem.c index cdf2d84683c8..30b8f66784d4 100644 --- a/virt/kvm/guest_mem.c +++ b/virt/kvm/guest_mem.c @@ -99,7 +99,8 @@ static struct folio *kvm_gmem_get_folio(struct file *file, pgoff_t index) } static void kvm_gmem_invalidate_begin(struct kvm *kvm, struct kvm_gmem *gmem, - pgoff_t start, pgoff_t end) + pgoff_t start, pgoff_t end, + unsigned int flags) { struct kvm_memory_slot *slot; unsigned long index; @@ -118,6 +119,7 @@ static void kvm_gmem_invalidate_begin(struct kvm *kvm, struct kvm_gmem *gmem, .slot = slot, .pte = __pte(0), .may_block = true, + .flags = flags, }; kvm_mmu_invalidate_range_add(kvm, gfn_range.start, gfn_range.end); @@ -156,7 +158,8 @@ static long kvm_gmem_punch_hole(struct file *file, loff_t offset, loff_t len) */ filemap_invalidate_lock(file->f_mapping); - kvm_gmem_invalidate_begin(kvm, gmem, start, end); + kvm_gmem_invalidate_begin(kvm, gmem, start, end, + KVM_GFN_RANGE_FLAGS_GMEM_PUNCH_HOLE); truncate_inode_pages_range(file->f_mapping, offset, offset + len - 1); @@ -263,7 +266,8 @@ static int kvm_gmem_release(struct inode *inode, struct file *file) * Free the backing memory, and more importantly, zap all SPTEs that * pointed at this file. */ - kvm_gmem_invalidate_begin(kvm, gmem, 0, -1ul); + kvm_gmem_invalidate_begin(kvm, gmem, 0, -1ul, + KVM_GFN_RANGE_FLAGS_GMEM_RELEASE); truncate_inode_pages_final(file->f_mapping); kvm_gmem_invalidate_end(kvm, gmem, 0, -1ul); diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 422d49634c56..9cdfa2fb675f 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -613,6 +613,7 @@ static __always_inline int __kvm_handle_hva_range(struct kvm *kvm, gfn_range.start = hva_to_gfn_memslot(hva_start, slot); gfn_range.end = hva_to_gfn_memslot(hva_end + PAGE_SIZE - 1, slot); gfn_range.slot = slot; + gfn_range.flags = 0; if (!locked) { locked = true; @@ -2391,8 +2392,9 @@ static void kvm_mem_attrs_changed(struct kvm *kvm, unsigned long attrs, bool flush = false; int i; - gfn_range.pte = __pte(0); + gfn_range.attrs = attrs; gfn_range.may_block = true; + gfn_range.flags = KVM_GFN_RANGE_FLAGS_SET_MEM_ATTR; for (i = 0; i < kvm_arch_nr_memslot_as_ids(kvm); i++) { slots = __kvm_memslots(kvm, i); -- 2.25.1