From nobody Mon Oct 6 06:39:54 2025 Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.14]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 53C111FECA1; Thu, 24 Jul 2025 13:04:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.175.65.14 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753362258; cv=none; b=Y2Z9S53QMVwJT2EXSkcR31YvEjOLNe1sgSxk5zHkmEZgY/S4lWUWkCA10AuRVqsqbtlsLuAoeaOzFL18jdxaHFGu6+Jb0/Cia61IPIFTngD44KDcHYcNdcsFcEZpM6MPeNeMdPy3Eg34C2VYZA0LKbQ/o2hB5MDqVigbtg3m9NQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753362258; c=relaxed/simple; bh=yk47hl2OlUHstLfAGdRqGeuhrNl4EluMJUOjIcUFO0Y=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=GDvJoigmt032ZH2/hauybHgc1TqQ41P4Hf5QPe3ybV3BaTnEZs+i3yqCg8d/CJUUC6Vx58hT8X4udNdrFQPhRLTBsjxGxSwOxAuY7mG2Njqv6kLscMP1usGNvhBdpXSssePpC9K6jtURfgFDKgjkmk8KtFGMU67xwmmoQUN33NM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=O6Eo12gx; arc=none smtp.client-ip=198.175.65.14 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="O6Eo12gx" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1753362258; x=1784898258; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=yk47hl2OlUHstLfAGdRqGeuhrNl4EluMJUOjIcUFO0Y=; b=O6Eo12gxTEB3a72L8Yd/duJaAdOVbxawjyVDZOPtWDmFOPWEuqUKNkWQ ngB7t+xRCCUq1cDF33pmsRMtW7un7V0zKRRCQMNy5+VGBh2MGX7cHmynx jx9jG7sIwAbAWqs1cWjmSxExsdl9mU37uip2Ek7JBfEu7hLG6sfutvUtz ff0ch21ZeGvGJNTcHZ+UUUzh6n/p91hH2bGsMF2d10Ftrs9k4e8toqufI RHihHdKO+eCKI1QqbsFhkP4BqmUvp00f9huus8XT1/KRCYU66Q0MB3S/J T6v/QF7YZmbiy2KQOJ8ciizxOVGGiAlJ70p1reWpRqRhNcrNeRB36mNSA g==; X-CSE-ConnectionGUID: kHwOlgIyQgGvK537CsACSg== X-CSE-MsgGUID: pzYpCu+tTvOg9sResK5Zaw== X-IronPort-AV: E=McAfee;i="6800,10657,11501"; a="59480672" X-IronPort-AV: E=Sophos;i="6.16,337,1744095600"; d="scan'208";a="59480672" Received: from fmviesa004.fm.intel.com ([10.60.135.144]) by orvoesa106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 24 Jul 2025 06:04:17 -0700 X-CSE-ConnectionGUID: vMjYhBN8T0uglJUK940Znw== X-CSE-MsgGUID: CHa25EvAQyaeCGwaXl2cOg== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.16,337,1744095600"; d="scan'208";a="165598982" Received: from sschumil-mobl2.ger.corp.intel.com (HELO localhost.localdomain) ([10.245.244.21]) by fmviesa004-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 24 Jul 2025 06:04:12 -0700 From: Adrian Hunter To: Dave Hansen , pbonzini@redhat.com, seanjc@google.com, vannapurve@google.com Cc: Tony Luck , Borislav Petkov , Thomas Gleixner , Ingo Molnar , x86@kernel.org, H Peter Anvin , linux-kernel@vger.kernel.org, kvm@vger.kernel.org, rick.p.edgecombe@intel.com, kas@kernel.org, kai.huang@intel.com, reinette.chatre@intel.com, xiaoyao.li@intel.com, tony.lindgren@linux.intel.com, binbin.wu@linux.intel.com, isaku.yamahata@intel.com, yan.y.zhao@intel.com, chao.gao@intel.com Subject: [PATCH V6 1/3] x86/tdx: Eliminate duplicate code in tdx_clear_page() Date: Thu, 24 Jul 2025 16:03:52 +0300 Message-ID: <20250724130354.79392-2-adrian.hunter@intel.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250724130354.79392-1-adrian.hunter@intel.com> References: <20250724130354.79392-1-adrian.hunter@intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Organization: Intel Finland Oy, Registered Address: c/o Alberga Business Park, 6 krs, Bertel Jungin Aukio 5, 02600 Espoo, Business Identity Code: 0357606 - 4, Domiciled in Helsinki Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" tdx_clear_page() and reset_tdx_pages() duplicate the TDX page clearing logic. Rename reset_tdx_pages() to tdx_quirk_reset_paddr() and create tdx_quirk_reset_page() to call tdx_quirk_reset_paddr() and be used in place of tdx_clear_page(). The new name reflects that, in fact, the clearing is necessary only for hardware with a certain quirk. That is dealt with in a subsequent patch but doing the rename here avoids additional churn. Note reset_tdx_pages() is slightly different from tdx_clear_page() because, more appropriately, it uses mb() in place of __mb(). Except when extra debugging is enabled (kcsan at present), mb() just calls __mb(). Reviewed-by: Kirill A. Shutemov Reviewed-by: Binbin Wu Reviewed-by: Xiaoyao Li Acked-by: Kai Huang Acked-by: Sean Christopherson Signed-off-by: Adrian Hunter --- Changes in V6: Add Sean's Ack Changes in V5: None Changes in V4: Add and use tdx_quirk_reset_page() for KVM (Sean) Changes in V3: Explain "quirk" rename in commit message (Rick) Explain mb() change in commit message (Rick) Add Rev'd-by, Ack'd-by tags Changes in V2: Rename reset_tdx_pages() to tdx_quirk_reset_paddr() Call tdx_quirk_reset_paddr() directly arch/x86/include/asm/tdx.h | 2 ++ arch/x86/kvm/vmx/tdx.c | 25 +++---------------------- arch/x86/virt/vmx/tdx/tdx.c | 10 ++++++++-- 3 files changed, 13 insertions(+), 24 deletions(-) diff --git a/arch/x86/include/asm/tdx.h b/arch/x86/include/asm/tdx.h index 7ddef3a69866..57b46f05ff97 100644 --- a/arch/x86/include/asm/tdx.h +++ b/arch/x86/include/asm/tdx.h @@ -131,6 +131,8 @@ int tdx_guest_keyid_alloc(void); u32 tdx_get_nr_guest_keyids(void); void tdx_guest_keyid_free(unsigned int keyid); =20 +void tdx_quirk_reset_page(struct page *page); + struct tdx_td { /* TD root structure: */ struct page *tdr_page; diff --git a/arch/x86/kvm/vmx/tdx.c b/arch/x86/kvm/vmx/tdx.c index 573d6f7d1694..ebb36229c7c8 100644 --- a/arch/x86/kvm/vmx/tdx.c +++ b/arch/x86/kvm/vmx/tdx.c @@ -283,25 +283,6 @@ static inline void tdx_disassociate_vp(struct kvm_vcpu= *vcpu) vcpu->cpu =3D -1; } =20 -static void tdx_clear_page(struct page *page) -{ - const void *zero_page =3D (const void *) page_to_virt(ZERO_PAGE(0)); - void *dest =3D page_to_virt(page); - unsigned long i; - - /* - * The page could have been poisoned. MOVDIR64B also clears - * the poison bit so the kernel can safely use the page again. - */ - for (i =3D 0; i < PAGE_SIZE; i +=3D 64) - movdir64b(dest + i, zero_page); - /* - * MOVDIR64B store uses WC buffer. Prevent following memory reads - * from seeing potentially poisoned cache. - */ - __mb(); -} - static void tdx_no_vcpus_enter_start(struct kvm *kvm) { struct kvm_tdx *kvm_tdx =3D to_kvm_tdx(kvm); @@ -347,7 +328,7 @@ static int tdx_reclaim_page(struct page *page) =20 r =3D __tdx_reclaim_page(page); if (!r) - tdx_clear_page(page); + tdx_quirk_reset_page(page); return r; } =20 @@ -596,7 +577,7 @@ static void tdx_reclaim_td_control_pages(struct kvm *kv= m) pr_tdx_error(TDH_PHYMEM_PAGE_WBINVD, err); return; } - tdx_clear_page(kvm_tdx->td.tdr_page); + tdx_quirk_reset_page(kvm_tdx->td.tdr_page); =20 __free_page(kvm_tdx->td.tdr_page); kvm_tdx->td.tdr_page =3D NULL; @@ -1717,7 +1698,7 @@ static int tdx_sept_drop_private_spte(struct kvm *kvm= , gfn_t gfn, pr_tdx_error(TDH_PHYMEM_PAGE_WBINVD, err); return -EIO; } - tdx_clear_page(page); + tdx_quirk_reset_page(page); tdx_unpin(kvm, page); return 0; } diff --git a/arch/x86/virt/vmx/tdx/tdx.c b/arch/x86/virt/vmx/tdx/tdx.c index c7a9a087ccaf..fc8d8e444f15 100644 --- a/arch/x86/virt/vmx/tdx/tdx.c +++ b/arch/x86/virt/vmx/tdx/tdx.c @@ -637,7 +637,7 @@ static int tdmrs_set_up_pamt_all(struct tdmr_info_list = *tdmr_list, * clear these pages. Note this function doesn't flush cache of * these TDX private pages. The caller should make sure of that. */ -static void reset_tdx_pages(unsigned long base, unsigned long size) +static void tdx_quirk_reset_paddr(unsigned long base, unsigned long size) { const void *zero_page =3D (const void *)page_address(ZERO_PAGE(0)); unsigned long phys, end; @@ -654,9 +654,15 @@ static void reset_tdx_pages(unsigned long base, unsign= ed long size) mb(); } =20 +void tdx_quirk_reset_page(struct page *page) +{ + tdx_quirk_reset_paddr(page_to_phys(page), PAGE_SIZE); +} +EXPORT_SYMBOL_GPL(tdx_quirk_reset_page); + static void tdmr_reset_pamt(struct tdmr_info *tdmr) { - tdmr_do_pamt_func(tdmr, reset_tdx_pages); + tdmr_do_pamt_func(tdmr, tdx_quirk_reset_paddr); } =20 static void tdmrs_reset_pamt_all(struct tdmr_info_list *tdmr_list) --=20 2.48.1