Unverified Commit 36cb5fba authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!5075 x86/reboot: VMCLEAR active VMCSes before emergency reboot

parents 1b9eceef 899b9b99
Loading
Loading
Loading
Loading
+0 −2
Original line number Diff line number Diff line
@@ -209,8 +209,6 @@ extern void arch_kexec_pre_free_pages(void *vaddr, unsigned int pages);

#endif

typedef void crash_vmclear_fn(void);
extern crash_vmclear_fn __rcu *crash_vmclear_loaded_vmcss;
extern void kdump_nmi_shootdown_cpus(void);

#ifdef CONFIG_KEXEC_CORE
+2 −0
Original line number Diff line number Diff line
@@ -25,6 +25,8 @@ void __noreturn machine_real_restart(unsigned int type);
#define MRR_BIOS	0
#define MRR_APM		1

typedef void crash_vmclear_fn(void);
extern crash_vmclear_fn __rcu *crash_vmclear_loaded_vmcss;
void cpu_emergency_disable_virtualization(void);

typedef void (*nmi_shootdown_cb)(int, struct pt_regs*);
+0 −31
Original line number Diff line number Diff line
@@ -48,27 +48,6 @@ struct crash_memmap_data {
	unsigned int type;
};

/*
 * This is used to VMCLEAR all VMCSs loaded on the
 * processor. And when loading kvm_intel module, the
 * callback function pointer will be assigned.
 *
 * protected by rcu.
 */
crash_vmclear_fn __rcu *crash_vmclear_loaded_vmcss = NULL;
EXPORT_SYMBOL_GPL(crash_vmclear_loaded_vmcss);

static inline void cpu_crash_vmclear_loaded_vmcss(void)
{
	crash_vmclear_fn *do_vmclear_operation = NULL;

	rcu_read_lock();
	do_vmclear_operation = rcu_dereference(crash_vmclear_loaded_vmcss);
	if (do_vmclear_operation)
		do_vmclear_operation();
	rcu_read_unlock();
}

/*
 * When the crashkernel option is specified, only use the low
 * 1M for the real mode trampoline.
@@ -88,11 +67,6 @@ static void kdump_nmi_callback(int cpu, struct pt_regs *regs)
{
	crash_save_cpu(regs, cpu);

	/*
	 * VMCLEAR VMCSs loaded on all cpus if needed.
	 */
	cpu_crash_vmclear_loaded_vmcss();

	/*
	 * Disable Intel PT to stop its logging
	 */
@@ -146,11 +120,6 @@ void native_machine_crash_shutdown(struct pt_regs *regs)

	crash_smp_send_stop();

	/*
	 * VMCLEAR VMCSs loaded on this cpu if needed.
	 */
	cpu_crash_vmclear_loaded_vmcss();

	cpu_emergency_disable_virtualization();

	/*
+22 −0
Original line number Diff line number Diff line
@@ -787,6 +787,26 @@ void machine_crash_shutdown(struct pt_regs *regs)
}
#endif

/*
 * This is used to VMCLEAR all VMCSs loaded on the
 * processor. And when loading kvm_intel module, the
 * callback function pointer will be assigned.
 *
 * protected by rcu.
 */
crash_vmclear_fn __rcu *crash_vmclear_loaded_vmcss;
EXPORT_SYMBOL_GPL(crash_vmclear_loaded_vmcss);

static inline void cpu_crash_vmclear_loaded_vmcss(void)
{
	crash_vmclear_fn *do_vmclear_operation = NULL;

	rcu_read_lock();
	do_vmclear_operation = rcu_dereference(crash_vmclear_loaded_vmcss);
	if (do_vmclear_operation)
		do_vmclear_operation();
	rcu_read_unlock();
}

/* This is the CPU performing the emergency shutdown work. */
int crashing_cpu = -1;
@@ -798,6 +818,8 @@ int crashing_cpu = -1;
 */
void cpu_emergency_disable_virtualization(void)
{
	cpu_crash_vmclear_loaded_vmcss();

	cpu_emergency_vmxoff();
	cpu_emergency_svm_disable();
}
+2 −7
Original line number Diff line number Diff line
@@ -40,7 +40,7 @@
#include <asm/idtentry.h>
#include <asm/io.h>
#include <asm/irq_remapping.h>
#include <asm/kexec.h>
#include <asm/reboot.h>
#include <asm/perf_event.h>
#include <asm/mce.h>
#include <asm/mmu_context.h>
@@ -780,7 +780,6 @@ static int vmx_set_guest_uret_msr(struct vcpu_vmx *vmx,
	return ret;
}

#ifdef CONFIG_KEXEC_CORE
static void crash_vmclear_local_loaded_vmcss(void)
{
	int cpu = raw_smp_processor_id();
@@ -790,7 +789,6 @@ static void crash_vmclear_local_loaded_vmcss(void)
			    loaded_vmcss_on_cpu_link)
		vmcs_clear(v->vmcs);
}
#endif /* CONFIG_KEXEC_CORE */

static void __loaded_vmcs_clear(void *arg)
{
@@ -8514,10 +8512,8 @@ static void vmx_cleanup_l1d_flush(void)

static void vmx_exit(void)
{
#ifdef CONFIG_KEXEC_CORE
	RCU_INIT_POINTER(crash_vmclear_loaded_vmcss, NULL);
	synchronize_rcu();
#endif

	kvm_exit();

@@ -8612,10 +8608,9 @@ static int __init vmx_init(void)
		pi_init_cpu(cpu);
	}

#ifdef CONFIG_KEXEC_CORE
	rcu_assign_pointer(crash_vmclear_loaded_vmcss,
			   crash_vmclear_local_loaded_vmcss);
#endif

	vmx_check_vmcs12_offsets();

	/*