Re: [PATCH] KVM: x86: Convert INIT and SIPI signals into synchronously handled events

Gleb Natapov
2013-03-12T13:37:43Z

On Tue, Mar 12, 2013 at 02:27:11PM +0100, Jan Kiszka wrote:
> On 2013-03-12 14:25, Gleb Natapov wrote:
> > On Tue, Mar 12, 2013 at 02:16:29PM +0100, Jan Kiszka wrote:
> >> On 2013-03-12 14:13, Paolo Bonzini wrote:
> >>> Il 12/03/2013 14:01, Jan Kiszka ha scritto:
> >>>>>>>> For example, should kvm_arch_interrupt_allowed return zero if the VCPU
> >>>>>>>> is in the INIT_RECEIVED state?
> >>>>>>
> >>>>>> Yeah, that probably makes sense beyond async_pf.
> >>>> Wait: If you perform a proper reset on INIT already, we would clear IF
> >>>> thus prevent also async_pf injections. On the other hand,
> >>>> kvm_arch_can_inject_async_page_present returns true if apf.msr_val &
> >>>> KVM_ASYNC_PF_ENABLED is not set - shouldn't that be cleared on reset as
> >>>> well? Hmm...
> >>>
> >>> So if you split the reset (which is done on INIT) from setting up CS on
> >>> SIPI, you kill two birds with a stone, or at least one and a half: you
> >>> clear IF as you wrote above, and INIT on BSP almost works (the only
> >>> missing bit should be setting the mp_state to KVM_MP_STATE_RUNNABLE).
> >>
> >> ...unless the async_pf MSR is cleared on reset as well.
> >>
> > It is:
> > vcpu->arch.apf.msr_val = 0;
>
> Can you explain the "if !(apf.msr_val & KVM_ASYNC_PF_ENABLED) return
> true;" in kvm_arch_can_inject_async_page_present?
>
APF works even with non-PV guests. If non PV guest access swapped out
page the page is swapped in asynchronously and vcpu enters apf.halted
state. In this sate it can still receive interrupt. Completion of apf
cause vcpu exit apf.halted state.

On vcpu reset we call kvm_clear_async_pf_completion_queue() so
vcpu->async_pf.done will be empty and kvm_check_async_pf_completion()
will be nop if vcpu is properly reset on INIT.

--
Gleb.