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 mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 02015C433EF for ; Tue, 16 Nov 2021 01:02:48 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id E25E061BD3 for ; Tue, 16 Nov 2021 01:02:47 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1346145AbhKPBFk (ORCPT ); Mon, 15 Nov 2021 20:05:40 -0500 Received: from mga07.intel.com ([134.134.136.100]:30901 "EHLO mga07.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S245604AbhKPA5H (ORCPT ); Mon, 15 Nov 2021 19:57:07 -0500 X-IronPort-AV: E=McAfee;i="6200,9189,10169"; a="297013467" X-IronPort-AV: E=Sophos;i="5.87,237,1631602800"; d="scan'208";a="297013467" Received: from orsmga006.jf.intel.com ([10.7.209.51]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 15 Nov 2021 16:50:52 -0800 X-IronPort-AV: E=Sophos;i="5.87,237,1631602800"; d="scan'208";a="454247909" Received: from asu1-mobl.amr.corp.intel.com (HELO skuppusw-desk1.amr.corp.intel.com) ([10.254.20.192]) by orsmga006-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 15 Nov 2021 16:50:38 -0800 From: Kuppuswamy Sathyanarayanan To: Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org Cc: "H . Peter Anvin" , Tony Luck , Dan Williams , Andi Kleen , Kirill Shutemov , Kuppuswamy Sathyanarayanan , Kuppuswamy Sathyanarayanan , linux-kernel@vger.kernel.org Subject: [PATCH v1 1/1] x86: Skip WBINVD instruction for VM guest Date: Mon, 15 Nov 2021 16:50:27 -0800 Message-Id: <20211116005027.2929297-1-sathyanarayanan.kuppuswamy@linux.intel.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org ACPI mandates that CPU caches be flushed before entering any sleep state. This ensures that the CPU and its caches can be powered down without losing data. ACPI-based VMs have maintained this sleep-state-entry behavior. However, cache flushing for VM sleep state entry is useless. Unlike on bare metal, guest sleep states are not correlated with potential data loss of any kind; the host is responsible for data preservation. In fact, some KVM configurations simply skip the cache flushing instruction (see need_emulate_wbinvd()). Further, on TDX systems, the WBINVD instruction causes an unconditional #VE exception. If this cache flushing remained, it would need extra code in the form of a #VE handler. All use of ACPI_FLUSH_CPU_CACHE() appears to be in sleep-state-related code. This means that the ACPI use of WBINVD is at *best* superfluous. Disable ACPI CPU cache flushing on all X86_FEATURE_HYPERVISOR systems, which includes TDX. Cc: Rafael J. Wysocki Cc: linux-acpi@vger.kernel.org Reviewed-by: Dan Williams Acked-by: Rafael J. Wysocki Signed-off-by: Kuppuswamy Sathyanarayanan --- arch/x86/include/asm/acenv.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/arch/x86/include/asm/acenv.h b/arch/x86/include/asm/acenv.h index 9aff97f0de7f..d4162e94bee8 100644 --- a/arch/x86/include/asm/acenv.h +++ b/arch/x86/include/asm/acenv.h @@ -10,10 +10,15 @@ #define _ASM_X86_ACENV_H #include +#include /* Asm macros */ -#define ACPI_FLUSH_CPU_CACHE() wbinvd() +#define ACPI_FLUSH_CPU_CACHE() \ +do { \ + if (!boot_cpu_has(X86_FEATURE_HYPERVISOR)) \ + wbinvd(); \ +} while (0) int __acpi_acquire_global_lock(unsigned int *lock); int __acpi_release_global_lock(unsigned int *lock); -- 2.25.1