Marcelo Tosatti wrote on 2013-02-25:
> On Mon, Feb 25, 2013 at 06:55:58AM +0000, Zhang, Yang Z wrote:
>>> 
>>> p1)
>>> 
>>>>> cpu0                                      cpu1            vcpu0
>>>>> test_and_set_bit(PIR-A)
>>>>> set KVM_REQ_EVENT
>>>>>                                                   process REQ_EVENT
>>>>>                                                   PIR-A->IRR
>>>>> 
>>>>>                                                   vcpu->mode=IN_GUEST
>>>>> 
>>>>> if (vcpu0->guest_mode)
>>>>>   if (!t_a_s_bit(PIR notif))
>>>>>           send IPI
>>>>>                                                   linux_pir_handler
>>>>> 
>>>>>                                   t_a_s_b(PIR-B)=1
>>>>>                                   no PIR IPI sent
>>> 
>>> p2)
>>> 
>>>> No, this exists with your implementation not mine.
>>>> As I said, in this patch, it will make request after vcpu ==guest mode, 
>>>> then
> send
>>> ipi. Even the ipi is lost, but the request still will be tracked.
>>> Because we have the follow check:
>>>> vcpu->mode = GUEST_MODE
>>>> (ipi may arrived here and lost)
>>>> local irq disable
>>>> check request (this will ensure the pir modification will be picked up by 
>>>> vcpu
>>> before vmentry)
>>> 
>>> Please read the sequence above again, between p1) and p2). Yes, if the
>>> IPI is lost, the request _for the CPU which sent PIR IPI_ is guaranteed
>>> to be processed, but not the request for another cpu (cpu1).
>> If no PIR IPI sent in cpu1, the delivered is false, and it will roll back to 
>> old logic:
>> __apic_accept_irq():
>> if (!delivered) {
>>              kvm_make_request(KVM_REQ_EVENT, vcpu);
>>              kvm_vcpu_kick(vcpu);
>> }
>> This can solve the problem you mentioned above. Right?
> 
> Should not be doing this kick in the first place. One result of it is
> that you'll always take a VM-exit if a second injection happens while a VCPU
> has not handled the first one.
You are right. 
 
> What is the drawback of the suggestion to unconditionally clear PIR
> notification bit on VM-entry?
The only thing is we need to traverse the whole pir when calling 
sync_pir_to_irr even the pir is empty.

>
> We can avoid it, but lets get it correct first  (BTW can stick a comment
> saying FIXME: optimize) on that PIR clearing.
Ok, I will adopt your suggestion. BTW, Where should the comment be add? on 
sync_pir_to_irr()?

> 
>>> cpu0
>>> 
>>> check pir(pass)
>>> check irr(pass)
>>> injected = !test_and_set_bit(pir)
>>> 
>>> versus
>>> 
>>> cpu1
>>> xchg(pir)
>>> 
>>> 
>>> No information can be lost because all accesses to shared data are
>>> atomic.
>> Sorry, I cannot get your point. Why 'xchg(pir)' can solve the problem I
>> mentioned above? Can you elaborate it? The spinlock I used is trying to
>> protect the whole procedure of sync pir to irr,
> not just access pir.
> 
> You're right, its the same problem as with the hardware update.


Best regards,
Yang


--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to