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

Re: [Xen-devel] [PATCH] vmx, apicv: fix save/restore issue with apicv



Jan Beulich wrote on 2014-10-14:
>>>> On 14.10.14 at 15:10, <yang.z.zhang@xxxxxxxxx> wrote:
>> Jan Beulich wrote on 2014-10-14:
>>>>>> On 14.10.14 at 07:43, <yang.z.zhang@xxxxxxxxx> wrote:
>>>> Jan Beulich wrote on 2014-10-13:
>>>>>>>> On 11.10.14 at 09:54, <yang.z.zhang@xxxxxxxxx> wrote:
>>>>>> @@ -1597,6 +1599,29 @@ static void vmx_process_isr(int isr,
>>>>>> struct vcpu
>>>>> *v)
>>>>>>          status |= isr << VMX_GUEST_INTR_STATUS_SVI_OFFSET;
>>>>>>          __vmwrite(GUEST_INTR_STATUS, status);
>>>>>>      }
>>>>>> +
>>>>>> +    eoi_exit_bitmap = (unsigned int
>>>>>> + *)v->arch.hvm_vmx.eoi_exit_bitmap;
>>>>> 
>>>>> No casts like this please. This is a bitmap and would hence
>>>>> preferably be treated that way consistently. The code here isn't
>>> performance critical.
>>>> 
>>>> Yes, it's performance critical from the live migration's point
>>>> and that's why I use the cast here and
>>> 
>>> Compared to everything else involved in migration, a few extra
>>> cycles here
>> 
>> Xen is far behind KVM on live migration. If we want to remain the
>> competitive, I'd suggest doing a cleanup on current migration logic
>> to make it more effective.
> 
> But that surely needs to be done elsewhere, where more than a couple
> of nanoseconds are to be gained.

If you think it is ok, I will use vector based operations:

+    for ( vector = 0x10; vector < NR_VECTORS; vector++ )
+        if (vlapic_test_vector(vector, &s->regs->data[APIC_IRR]) ||
+                vlapic_test_vector(vector, &s->regs->data[APIC_ISR]))
+            set_bit(vector,  v->arch.hvm_vmx.eoi_exit_bitmap);

Andrew, is it ok for you? 

> 
>>>>>> +    {
>>>>>> +        val = vlapic_get_reg(vlapic, APIC_IRR + i);
>>>>>> +        val |= vlapic_get_reg(vlapic, APIC_ISR + i);
>>>>> 
>>>>> The comment above doesn't really make clear why not just IRR.
>>>> 
>>>> Upon acceptance of an interrupt into the IRR, the corresponding
>>>> TMR will be changed. This means an interrupt either in IRR or in
>>>> ISR has no chance to update the TMR and eoi exit bitmap. So we
>>>> need to check IRR + ISR while rebuilding the eoi exit bitmap. It
>>>> is not enough to check only
>>> IRR.
>>> 
>>> But then why not look at TMR right away? It's being kept up to date
>>> as long as the guest is running, and gets migrated over afterwards.
>>> Considering what
>>> vmx_update_eoi_exit_bitmap()) does, you really want to or TMR into
>>> EOI_EXIT_BITMAP (which post-migration could just be an assignment
>>> rather than an or).
>> 
>> No, we cannot use TMR directly. As I said in the comments, the
>> periodic timer interrupt is tricky which is edge-trigger but need an
>> EOI vmexit to let the pending interrupts have the chance to be
>> injected for
> compensation.
> 
> The respective "normal" (non-migration) handling of this being in
> vmx_intr_assist(), involving pt_vector? If so, I think I understand now.

Yes.

> 
> Thanks, Jan


Best regards,
Yang



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.