Re: [PATCH 22/31] nVMX: Deciding if L0 or L1 should handle an L2 exit

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, May 25, 2011, Tian, Kevin wrote about "RE: [PATCH 22/31] nVMX: Deciding if L0 or L1 should handle an L2 exit":
> > +static inline bool nested_cpu_has_virtual_nmis(struct kvm_vcpu *vcpu)
> > +{
> > +	return is_guest_mode(vcpu) &&
> > +		(get_vmcs12(vcpu)->pin_based_vm_exec_control &
> > +			PIN_BASED_VIRTUAL_NMIS);
> > +}
> 
> any reason to add guest mode check here? I didn't see such check in your
> earlier nested_cpu_has_xxx. It would be clearer to use existing nested_cpu_has_xxx
> along with is_guest_mode explicitly which makes such usage consistent.

The nested_cpu_has function is for procbased controls, not pinbased controls...
But you're right, it's strange that only this function has is_guest_mode()
in it. Moving it outside. The call site is now really ugly ;-)

> > +	case EXIT_REASON_INVLPG:
> > +		return vmcs12->cpu_based_vm_exec_control &
> > +				CPU_BASED_INVLPG_EXITING;
> 
> use nested_cpu_has.

Right ;-)

> > +	if (exit_reason == EXIT_REASON_VMLAUNCH ||
> > +	    exit_reason == EXIT_REASON_VMRESUME)
> > +		vmx->nested.nested_run_pending = 1;
> > +	else
> > +		vmx->nested.nested_run_pending = 0;
> 
> what about VMLAUNCH invoked from L2? In such case I think you expect
> L1 to run instead of L2.

Wow, a good catch!

According to the theory (see our paper :-)), our implementations should work
with any number of nesting levels, not just two. But in practice, we've always
had a bug in running L3, and we never had the time to figure out why.
This is a good lead - I'll have to investigate. But not now.


> On the other hand, isn't just guest mode check enough to differentiate
> pending nested run? When L1 invokes VMLAUNCH/VMRESUME, guest mode
> hasn't been set yet, and below check will fail. All other operations will then
> be checked by nested_vmx_exit_handled...
> 
> Do I miss anything here?

As we discussed in another thread, nested_run_pending is important later,
at the injection path.

> > -	if (unlikely(!cpu_has_virtual_nmis() && vmx->soft_vnmi_blocked)) {
> > +	if (unlikely(!cpu_has_virtual_nmis() && vmx->soft_vnmi_blocked &&
> > +			!nested_cpu_has_virtual_nmis(vcpu))) {
> 
> Would L0 want to control vNMI for L2 guest? Otherwise we just use is_guest_mode
> here for the condition check?

I don't remember the details here, but this if() used to be different, until
Avi Kivity asked me to change it to this state.

Nadav.

-- 
Nadav Har'El                        |    Wednesday, May 25 2011, 21 Iyyar 5771
nyh@xxxxxxxxxxxxxxxxxxx             |-----------------------------------------
Phone +972-523-790466, ICQ 13349191 |The person who knows how to laugh at
http://nadav.harel.org.il           |himself will never cease to be amused.
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux