[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <ZA7eTpG5tpo5yIo3@gao-cwp>
Date: Mon, 13 Mar 2023 16:26:54 +0800
From: Chao Gao <chao.gao@...el.com>
To: Sean Christopherson <seanjc@...gle.com>
CC: Thomas Gleixner <tglx@...utronix.de>,
Ingo Molnar <mingo@...hat.com>, Borislav Petkov <bp@...en8.de>,
Dave Hansen <dave.hansen@...ux.intel.com>, <x86@...nel.org>,
Paolo Bonzini <pbonzini@...hat.com>,
<linux-kernel@...r.kernel.org>, <kvm@...r.kernel.org>,
Andrew Cooper <Andrew.Cooper3@...rix.com>,
Kai Huang <kai.huang@...el.com>
Subject: Re: [PATCH v2 03/18] x86/reboot: Harden virtualization hooks for
emergency reboot
On Fri, Mar 10, 2023 at 01:42:17PM -0800, Sean Christopherson wrote:
>+void cpu_emergency_register_virt_callback(cpu_emergency_virt_cb *callback)
>+{
>+ if (WARN_ON_ONCE(rcu_access_pointer(cpu_emergency_virt_callback)))
>+ return;
>+
>+ rcu_assign_pointer(cpu_emergency_virt_callback, callback);
Was it intentional to not call synchronize_rcu() (in the original
code), different from the un-registration path?
>+}
>+EXPORT_SYMBOL_GPL(cpu_emergency_register_virt_callback);
>+
>+void cpu_emergency_unregister_virt_callback(cpu_emergency_virt_cb *callback)
>+{
>+ if (WARN_ON_ONCE(rcu_access_pointer(cpu_emergency_virt_callback) != callback))
>+ return;
>+
>+ rcu_assign_pointer(cpu_emergency_virt_callback, NULL);
>+ synchronize_rcu();
>+}
>+EXPORT_SYMBOL_GPL(cpu_emergency_unregister_virt_callback);
>
> static inline void cpu_crash_vmclear_loaded_vmcss(void)
> {
>- crash_vmclear_fn *do_vmclear_operation = NULL;
>+ cpu_emergency_virt_cb *callback;
>
> rcu_read_lock();
>- do_vmclear_operation = rcu_dereference(crash_vmclear_loaded_vmcss);
>- if (do_vmclear_operation)
>- do_vmclear_operation();
>+ callback = rcu_dereference(cpu_emergency_virt_callback);
>+ if (callback)
>+ callback();
> rcu_read_unlock();
> }
> #endif
>diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c
>index 302086255be6..41095fc864f3 100644
>--- a/arch/x86/kvm/vmx/vmx.c
>+++ b/arch/x86/kvm/vmx/vmx.c
>@@ -8551,8 +8551,7 @@ static void __vmx_exit(void)
> {
> allow_smaller_maxphyaddr = false;
>
>- RCU_INIT_POINTER(crash_vmclear_loaded_vmcss, NULL);
>- synchronize_rcu();
>+ cpu_emergency_unregister_virt_callback(crash_vmclear_local_loaded_vmcss);
>
> vmx_cleanup_l1d_flush();
> }
>@@ -8602,8 +8601,7 @@ static int __init vmx_init(void)
> pi_init_cpu(cpu);
> }
>
>- rcu_assign_pointer(crash_vmclear_loaded_vmcss,
>- crash_vmclear_local_loaded_vmcss);
>+ cpu_emergency_register_virt_callback(crash_vmclear_local_loaded_vmcss);
>
> vmx_check_vmcs12_offsets();
>
>--
>2.40.0.rc1.284.g88254d51c5-goog
>
Powered by blists - more mailing lists