Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp4340787pxj; Tue, 8 Jun 2021 11:56:36 -0700 (PDT) X-Google-Smtp-Source: ABdhPJw2AhZqKBQvMIsaPDrL3x5SUE3XI/lz6G96VxRQw/95kTc43zwYxc/GIyjott7nY/k1u494 X-Received: by 2002:a17:906:1704:: with SMTP id c4mr11988597eje.182.1623178596236; Tue, 08 Jun 2021 11:56:36 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1623178596; cv=none; d=google.com; s=arc-20160816; b=Ca3ut69ZCU8moX0+J6DPWI3Zbs2zgrZG/3nFfdMvJKBSw48pjyCd8kuSD3xaUZPzYt s7hvpeNSKQdzq3axs0a7QgZ2edIBqob6EdZE1W445PcNht5wFUx2gaMUKOF82BtUAjCH KTn6CqSijpMnvwyBr9ati5Bgj2+uPAjfvqJa+2eoExI+ho6skICybiBIyA/IQmKaf/JJ mM0i1HPStfyubCbWXJomgeO7E9ApDEcOkiaxCYYsYx92mVHWsTy5qiMeB8V2Njb/cMom 9cV0+M2fOCtMEh7JiZGmSfrnZ5IW/RqYzIRIGgwumQg5XWp0KlJrEcc0mTna0vOVE0LF oBHQ== 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=w8/2lhvffQosF9xCEo3WKVrPi7zftyFqxofYLdyVHlk=; b=Hdnbgrtivl81QgDV2gUix2ptUrpionbaIyrKdCxKrKby8ZYzIQGeJJJIC7rRw8bppv 9ph6inj5qIFI9DNrFCQ1ruaeffI7wicnULUCn2Em3dNjkBAxsT0argyXRVvvAD1WC4By vS3PfrdQ2lVZQMZZgRQ95Lb4LWVNObZjTWAG2yrG88i2KZ0dvo5doipuOabevAW8jj0e ECvRyHIcrwhTs9+feVrmPVHQkAZ8RLeraRvJzXbKo3vzdVL+w9A13UKnIMtPnNTEVycY bEhSj3FWsofAB3ryqBzl1co8sosjW1RltW4TN8gnboyQat04Vbjc36dChEMsfVNnpe1x uPbg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b="bMj2B/1S"; 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 b6si479039edu.115.2021.06.08.11.56.13; Tue, 08 Jun 2021 11:56:36 -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="bMj2B/1S"; 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 S236628AbhFHSyv (ORCPT + 99 others); Tue, 8 Jun 2021 14:54:51 -0400 Received: from mail.kernel.org ([198.145.29.99]:44028 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235599AbhFHSsv (ORCPT ); Tue, 8 Jun 2021 14:48:51 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 30CA061453; Tue, 8 Jun 2021 18:38:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1623177520; bh=KeHdmqN6rtHxlG7PExUUMV2+QwJDwxdLcT1DaoQ8BLk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=bMj2B/1SuLdXhFrfw/JhRT+a/GKK7OFbeR7NjdYS7ocgoUFpoi2C3ib+sTBWqN9oh Op/uLVh9VJdZkLdu5vvSK3in+EsBL7Ghb4jwUgYinBCMJdmrkR3WFEnp6182cxns5P NyizRMXkOO4ywW9Mo0RxwyBNe4n6Gz0Aopm2uNE8= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Greg Kroah-Hartman , Vitaly Kuznetsov , Paolo Bonzini , Krzysztof Kozlowski Subject: [PATCH 5.4 74/78] x86/kvm: Disable all PV features on crash Date: Tue, 8 Jun 2021 20:27:43 +0200 Message-Id: <20210608175937.760953542@linuxfoundation.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20210608175935.254388043@linuxfoundation.org> References: <20210608175935.254388043@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: Vitaly Kuznetsov commit 3d6b84132d2a57b5a74100f6923a8feb679ac2ce upstream. Crash shutdown handler only disables kvmclock and steal time, other PV features remain active so we risk corrupting memory or getting some side-effects in kdump kernel. Move crash handler to kvm.c and unify with CPU offline. Signed-off-by: Vitaly Kuznetsov Message-Id: <20210414123544.1060604-5-vkuznets@redhat.com> Signed-off-by: Paolo Bonzini Signed-off-by: Krzysztof Kozlowski Signed-off-by: Greg Kroah-Hartman --- arch/x86/include/asm/kvm_para.h | 6 ----- arch/x86/kernel/kvm.c | 44 +++++++++++++++++++++++++++++----------- arch/x86/kernel/kvmclock.c | 21 ------------------- 3 files changed, 32 insertions(+), 39 deletions(-) --- a/arch/x86/include/asm/kvm_para.h +++ b/arch/x86/include/asm/kvm_para.h @@ -91,7 +91,6 @@ unsigned int kvm_arch_para_hints(void); void kvm_async_pf_task_wait(u32 token, int interrupt_kernel); void kvm_async_pf_task_wake(u32 token); u32 kvm_read_and_reset_pf_reason(void); -extern void kvm_disable_steal_time(void); void do_async_page_fault(struct pt_regs *regs, unsigned long error_code, unsigned long address); #ifdef CONFIG_PARAVIRT_SPINLOCKS @@ -125,11 +124,6 @@ static inline u32 kvm_read_and_reset_pf_ { return 0; } - -static inline void kvm_disable_steal_time(void) -{ - return; -} #endif #endif /* _ASM_X86_KVM_PARA_H */ --- a/arch/x86/kernel/kvm.c +++ b/arch/x86/kernel/kvm.c @@ -34,6 +34,7 @@ #include #include #include +#include static int kvmapf = 1; @@ -352,6 +353,14 @@ static void kvm_pv_disable_apf(void) smp_processor_id()); } +static void kvm_disable_steal_time(void) +{ + if (!has_steal_clock) + return; + + wrmsr(MSR_KVM_STEAL_TIME, 0, 0); +} + static void kvm_pv_guest_cpu_reboot(void *unused) { /* @@ -394,14 +403,6 @@ static u64 kvm_steal_clock(int cpu) return steal; } -void kvm_disable_steal_time(void) -{ - if (!has_steal_clock) - return; - - wrmsr(MSR_KVM_STEAL_TIME, 0, 0); -} - static inline void __set_percpu_decrypted(void *ptr, unsigned long size) { early_set_memory_decrypted((unsigned long) ptr, size); @@ -429,13 +430,14 @@ static void __init sev_map_percpu_data(v } } -static void kvm_guest_cpu_offline(void) +static void kvm_guest_cpu_offline(bool shutdown) { kvm_disable_steal_time(); if (kvm_para_has_feature(KVM_FEATURE_PV_EOI)) wrmsrl(MSR_KVM_PV_EOI_EN, 0); kvm_pv_disable_apf(); - apf_task_wake_all(); + if (!shutdown) + apf_task_wake_all(); kvmclock_disable(); } @@ -573,7 +575,7 @@ static int kvm_cpu_down_prepare(unsigned unsigned long flags; local_irq_save(flags); - kvm_guest_cpu_offline(); + kvm_guest_cpu_offline(false); local_irq_restore(flags); return 0; } @@ -582,7 +584,7 @@ static int kvm_cpu_down_prepare(unsigned static int kvm_suspend(void) { - kvm_guest_cpu_offline(); + kvm_guest_cpu_offline(false); return 0; } @@ -597,6 +599,20 @@ static struct syscore_ops kvm_syscore_op .resume = kvm_resume, }; +/* + * After a PV feature is registered, the host will keep writing to the + * registered memory location. If the guest happens to shutdown, this memory + * won't be valid. In cases like kexec, in which you install a new kernel, this + * means a random memory location will be kept being written. + */ +#ifdef CONFIG_KEXEC_CORE +static void kvm_crash_shutdown(struct pt_regs *regs) +{ + kvm_guest_cpu_offline(true); + native_machine_crash_shutdown(regs); +} +#endif + static void __init kvm_apf_trap_init(void) { update_intr_gate(X86_TRAP_PF, async_page_fault); @@ -673,6 +689,10 @@ static void __init kvm_guest_init(void) kvm_guest_cpu_init(); #endif +#ifdef CONFIG_KEXEC_CORE + machine_ops.crash_shutdown = kvm_crash_shutdown; +#endif + register_syscore_ops(&kvm_syscore_ops); /* --- a/arch/x86/kernel/kvmclock.c +++ b/arch/x86/kernel/kvmclock.c @@ -20,7 +20,6 @@ #include #include #include -#include #include static int kvmclock __initdata = 1; @@ -197,23 +196,6 @@ static void kvm_setup_secondary_clock(vo } #endif -/* - * After the clock is registered, the host will keep writing to the - * registered memory location. If the guest happens to shutdown, this memory - * won't be valid. In cases like kexec, in which you install a new kernel, this - * means a random memory location will be kept being written. So before any - * kind of shutdown from our side, we unregister the clock by writing anything - * that does not have the 'enable' bit set in the msr - */ -#ifdef CONFIG_KEXEC_CORE -static void kvm_crash_shutdown(struct pt_regs *regs) -{ - native_write_msr(msr_kvm_system_time, 0, 0); - kvm_disable_steal_time(); - native_machine_crash_shutdown(regs); -} -#endif - void kvmclock_disable(void) { native_write_msr(msr_kvm_system_time, 0, 0); @@ -344,9 +326,6 @@ void __init kvmclock_init(void) #endif x86_platform.save_sched_clock_state = kvm_save_sched_clock_state; x86_platform.restore_sched_clock_state = kvm_restore_sched_clock_state; -#ifdef CONFIG_KEXEC_CORE - machine_ops.crash_shutdown = kvm_crash_shutdown; -#endif kvm_get_preset_lpj(); /*