kvm.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Sean Christopherson <seanjc@google.com>
To: Kai Huang <kai.huang@intel.com>
Cc: Chao Gao <chao.gao@intel.com>,
	"dave.hansen@linux.intel.com" <dave.hansen@linux.intel.com>,
	"bp@alien8.de" <bp@alien8.de>, "x86@kernel.org" <x86@kernel.org>,
	"mingo@redhat.com" <mingo@redhat.com>,
	"tglx@linutronix.de" <tglx@linutronix.de>,
	"andrew.cooper3@citrix.com" <andrew.cooper3@citrix.com>,
	"pbonzini@redhat.com" <pbonzini@redhat.com>,
	"kvm@vger.kernel.org" <kvm@vger.kernel.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH v2 05/18] x86/reboot: KVM: Disable SVM during reboot via virt/KVM reboot callback
Date: Tue, 14 Mar 2023 17:47:43 -0700	[thread overview]
Message-ID: <ZBEVc0/vD5tEj29e@google.com> (raw)
In-Reply-To: <9f8c89bf44a8eb68407369d26956c24082562cd2.camel@intel.com>

On Tue, Mar 14, 2023, Huang, Kai wrote:
> On Mon, 2023-03-13 at 10:18 -0700, Sean Christopherson wrote:
> > On Mon, Mar 13, 2023, Huang, Kai wrote:
> > > On Fri, 2023-03-10 at 13:42 -0800, Sean Christopherson wrote:
> > > > Use the virt callback to disable SVM (and set GIF=1) during an emergency
> > > > instead of blindly attempting to disable SVM.� Like the VMX case, if KVM
> > > > (or an out-of-tree hypervisor) isn't loaded/active, SVM can't be in use.
> > > > 
> > > > Signed-off-by: Sean Christopherson <seanjc@google.com>
> > > 
> > > [...]
> > > 
> > > > -#if IS_ENABLED(CONFIG_KVM_INTEL)
> > > > +#if IS_ENABLED(CONFIG_KVM_INTEL) || IS_ENABLED(CONFIG_KVM_AMD)
> > > > �/* RCU-protected callback to disable virtualization prior to reboot. */
> > > > �static cpu_emergency_virt_cb __rcu *cpu_emergency_virt_callback;
> > > > �
> > > > @@ -821,7 +821,7 @@ int crashing_cpu = -1;
> > > > � */
> > > > �void cpu_emergency_disable_virtualization(void)
> > > > �{
> > > > -#if IS_ENABLED(CONFIG_KVM_INTEL)
> > > > +#if IS_ENABLED(CONFIG_KVM_INTEL) || IS_ENABLED(CONFIG_KVM_AMD)
> > > > �	cpu_emergency_virt_cb *callback;
> > > > �
> > > > �	rcu_read_lock();
> > > > @@ -830,8 +830,6 @@ void cpu_emergency_disable_virtualization(void)
> > > > �		callback();
> > > > �	rcu_read_unlock();
> > > > �#endif
> > > > -	/* KVM_AMD doesn't yet utilize the common callback. */
> > > > -	cpu_emergency_svm_disable();
> > > > �}
> > > 
> > > Shouldn't the callback be always present since you want to consider 'out-of-
> > > tree' hypervisor case?
> > 
> > No?  The kernel doesn't provide any guarantees for out-of-tree code.  I don't have
> > a super strong preference, though I do like the effective documentation the checks
> > provide.  Buy more importantly, my understanding is that the x86 maintainers want
> > to limit the exposure for these types of interfaces, e.g. `git grep IS_ENABLED\(CONFIG_KVM`
> > for a variety of hooks that are enabled iff KVM is enabled in the kernel config.
> 
> How about doing the embracing the code to do the emergency virt callback as the
> last step?

I like that idea, it also makes a few other patches a bit cleaner.

> I like the "cleanup" work in this series regardless whether we should guard the
> emergency virt callback with CONFIG_KVM_INTEL || CONFIG_KVM_AMD.  If we do the
> actual "cleanup" work first, and put the CONFIG_KVM_INTEL || CONFIG_KVM_AMD as
> the last step, it is also easier to review I guess, because it's kinda a
> separate logic independent to the actual "cleanup" work.
> 
> Also, personally I don't particularly like the middle state in patch 04:
> 
>  void cpu_emergency_disable_virtualization(void)
>  {
>  #if IS_ENABLED(CONFIG_KVM_INTEL)
> -	cpu_crash_vmclear_loaded_vmcss();
> -#endif
> +	cpu_emergency_virt_cb *callback;
>  
> -	cpu_emergency_vmxoff();
> +	rcu_read_lock();
> +	callback = rcu_dereference(cpu_emergency_virt_callback);
> +	if (callback)
> +		callback();
> +	rcu_read_unlock();
> +#endif
> +	/* KVM_AMD doesn't yet utilize the common callback. */
>  	cpu_emergency_svm_disable();
>  }
> 
> Which eventually got fixed up in patch 05:
> 
>  void cpu_emergency_disable_virtualization(void)
>  {
> -#if IS_ENABLED(CONFIG_KVM_INTEL)
> +#if IS_ENABLED(CONFIG_KVM_INTEL) || IS_ENABLED(CONFIG_KVM_AMD)
>  	cpu_emergency_virt_cb *callback;
>  
>  	rcu_read_lock();
> @@ -830,8 +830,6 @@ void cpu_emergency_disable_virtualization(void)
>  		callback();
>  	rcu_read_unlock();
>  #endif
> -	/* KVM_AMD doesn't yet utilize the common callback. */
> -	cpu_emergency_svm_disable();
>  }
>  
> Could we just merge the two patches together? 

I'd prefer not to squash the two.  I agree it's ugly, but I dislike converting
VMX and SVM at the same time.  I'm not totally opposed to moving everything in
one fell swoop, but my preference is to keep them separate.

  reply	other threads:[~2023-03-15  0:47 UTC|newest]

Thread overview: 35+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-03-10 21:42 [PATCH v2 00/18] x86/reboot: KVM: Clean up "emergency" virt code Sean Christopherson
2023-03-10 21:42 ` [PATCH v2 01/18] x86/reboot: VMCLEAR active VMCSes before emergency reboot Sean Christopherson
2023-03-10 21:42 ` [PATCH v2 02/18] x86/reboot: Expose VMCS crash hooks if and only if KVM_INTEL is enabled Sean Christopherson
2023-03-13  0:31   ` Huang, Kai
2023-03-13 18:31     ` Sean Christopherson
2023-03-14  1:19       ` Huang, Kai
2023-03-10 21:42 ` [PATCH v2 03/18] x86/reboot: Harden virtualization hooks for emergency reboot Sean Christopherson
2023-03-13  8:26   ` Chao Gao
2023-03-13 17:08     ` Sean Christopherson
2023-03-10 21:42 ` [PATCH v2 04/18] x86/reboot: KVM: Handle VMXOFF in KVM's reboot callback Sean Christopherson
2023-03-10 21:42 ` [PATCH v2 05/18] x86/reboot: KVM: Disable SVM during reboot via virt/KVM " Sean Christopherson
2023-03-13  0:52   ` Huang, Kai
2023-03-13 17:18     ` Sean Christopherson
2023-03-14  0:42       ` Huang, Kai
2023-03-15  0:47         ` Sean Christopherson [this message]
2023-03-15  1:30           ` Huang, Kai
2023-03-10 21:42 ` [PATCH v2 06/18] x86/reboot: Hoist "disable virt" helpers above "emergency reboot" path Sean Christopherson
2023-03-10 21:42 ` [PATCH v2 07/18] x86/reboot: Disable virtualization during reboot iff callback is registered Sean Christopherson
2023-03-13  0:54   ` Huang, Kai
2023-03-13 18:40     ` Sean Christopherson
2023-03-14  0:50       ` Huang, Kai
2023-03-10 21:42 ` [PATCH v2 08/18] x86/reboot: Assert that IRQs are disabled when turning off virtualization Sean Christopherson
2023-03-10 21:42 ` [PATCH v2 09/18] x86/virt: KVM: Open code cpu_has_vmx() in KVM VMX Sean Christopherson
2023-03-10 21:42 ` [PATCH v2 10/18] x86/virt: KVM: Move VMXOFF helpers into " Sean Christopherson
2023-03-10 21:42 ` [PATCH v2 11/18] KVM: SVM: Make KVM_AMD depend on CPU_SUP_AMD or CPU_SUP_HYGON Sean Christopherson
2023-03-10 21:42 ` [PATCH v2 12/18] x86/virt: Drop unnecessary check on extended CPUID level in cpu_has_svm() Sean Christopherson
2023-03-10 21:42 ` [PATCH v2 13/18] x86/virt: KVM: Open code cpu_has_svm() into kvm_is_svm_supported() Sean Christopherson
2023-03-10 21:42 ` [PATCH v2 14/18] KVM: SVM: Check that the current CPU supports SVM in kvm_is_svm_supported() Sean Christopherson
2023-03-13  2:47   ` Huang, Kai
2023-03-13 17:29     ` Sean Christopherson
2023-03-14  0:17       ` Huang, Kai
2023-03-10 21:42 ` [PATCH v2 15/18] KVM: VMX: Ensure CPU is stable when probing basic VMX support Sean Christopherson
2023-03-10 21:42 ` [PATCH v2 16/18] x86/virt: KVM: Move "disable SVM" helper into KVM SVM Sean Christopherson
2023-03-10 21:42 ` [PATCH v2 17/18] KVM: x86: Force kvm_rebooting=true during emergency reboot/crash Sean Christopherson
2023-03-10 21:42 ` [PATCH v2 18/18] KVM: SVM: Use "standard" stgi() helper when disabling SVM Sean Christopherson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=ZBEVc0/vD5tEj29e@google.com \
    --to=seanjc@google.com \
    --cc=andrew.cooper3@citrix.com \
    --cc=bp@alien8.de \
    --cc=chao.gao@intel.com \
    --cc=dave.hansen@linux.intel.com \
    --cc=kai.huang@intel.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=tglx@linutronix.de \
    --cc=x86@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).