On 04/05/20 12:37, Suravee Suthikulpanit wrote:
On 5/4/20 4:25 PM, Paolo Bonzini wrote:
On 04/05/20 11:13, Maxim Levitsky wrote:
On Mon, 2020-05-04 at 15:46 +0700, Suravee Suthikulpanit wrote:
On 5/2/20 11:42 PM, Paolo Bonzini wrote:This should work IMHO, other that the fact kvm_vcpu_update_apicv will
On 02/05/20 15:58, Maxim Levitsky wrote:Instead, as an alternative to remove the WARN_ON(), would it be
The AVIC is disabled by svm_toggle_avic_for_irq_window, which calls
kvm_request_apicv_update, which broadcasts the
KVM_REQ_APICV_UPDATE vcpu request,
however it doesn't broadcast it to CPU on which now we are
running, which seems OK,
because the code that handles that broadcast runs on each VCPU
entry, thus when this CPU will enter guest mode it will notice and disable the AVIC. >>>>>>>
However later in svm_enable_vintr, there is test
'WARN_ON(kvm_vcpu_apicv_active(&svm->vcpu));'
which is still true on current CPU because of the above.
Good point! We can just remove the WARN_ON I think. Can you send
a patch?
better to just explicitly calling kvm_vcpu_update_apicv(vcpu) to update the apicv_active flag right after kvm_request_apicv_update()?
be called again, when this vcpu is entered since the KVM_REQ_APICV_UPDATE
will still be pending on it.
It shoudn't be a problem, and we can even add a check to do nothing
when it is called while avic is already in target enable state.
I thought about that but I think it's a bit confusing. If we want to
keep the WARN_ON, Maxim can add an equivalent one to svm_vcpu_run, which
is even better because the invariant is clearer.
WARN_ON((vmcb->control.int_ctl & (AVIC_ENABLE_MASK | V_IRQ_MASK))
ÂÂÂÂ== (AVIC_ENABLE_MASK | V_IRQ_MASK));
By the way, there is another possible cleanup: the clearing
of V_IRQ_MASK can be removed from interrupt_window_interception since it
has already called svm_clear_vintr.
Paolo