[PATCH v5 2/4] ARM: KVM: arch_timers: Add guest timer core support
Christoffer Dall
c.dall at virtualopensystems.com
Tue Jan 15 09:32:29 EST 2013
On Tue, Jan 15, 2013 at 6:07 AM, Marc Zyngier <marc.zyngier at arm.com> wrote:
> On 14/01/13 19:19, Christoffer Dall wrote:
>> On Mon, Jan 14, 2013 at 10:18 AM, Will Deacon <will.deacon at arm.com> wrote:
>>> On Tue, Jan 08, 2013 at 06:43:20PM +0000, Christoffer Dall wrote:
>>>> From: Marc Zyngier <marc.zyngier at arm.com>
>>>>
>>>> Add some the architected timer related infrastructure, and support timer
>>>> interrupt injection, which can happen as a resultof three possible
>>>> events:
>>>>
>>>> - The virtual timer interrupt has fired while we were still
>>>> executing the guest
>>>> - The timer interrupt hasn't fired, but it expired while we
>>>> were doing the world switch
>>>> - A hrtimer we programmed earlier has fired
>>>
>>> [...]
>>>
>>>> +void kvm_timer_sync_to_cpu(struct kvm_vcpu *vcpu)
>>>> +{
>>>> + struct arch_timer_cpu *timer = &vcpu->arch.timer_cpu;
>>>> +
>>>> + /*
>>>> + * We're about to run this vcpu again, so there is no need to
>>>> + * keep the background timer running, as we're about to
>>>> + * populate the CPU timer again.
>>>> + */
>>>> + timer_disarm(timer);
>>>> +}
>>>> +
>>>> +void kvm_timer_sync_from_cpu(struct kvm_vcpu *vcpu)
>>>> +{
>>>> + struct arch_timer_cpu *timer = &vcpu->arch.timer_cpu;
>>>> + cycle_t cval, now;
>>>> + u64 ns;
>>>> +
>>>> + /* Check if the timer is enabled and unmasked first */
>>>> + if ((timer->cntv_ctl & 3) != 1)
>>>> + return;
>>>> +
>>>> + cval = timer->cntv_cval;
>>>> + now = kvm_phys_timer_read() - vcpu->kvm->arch.timer.cntvoff;
>>>> +
>>>> + BUG_ON(timer_is_armed(timer));
>>>> +
>>>> + if (cval <= now) {
>>>> + /*
>>>> + * Timer has already expired while we were not
>>>> + * looking. Inject the interrupt and carry on.
>>>> + */
>>>> + kvm_timer_inject_irq(vcpu);
>>>> + return;
>>>> + }
>>>> +
>>>> + ns = cyclecounter_cyc2ns(timecounter->cc, cval - now);
>>>> + timer_arm(timer, ns);
>>>> +}
>>>
>>> Please use flush/sync terminology to match the rest of arch/arm/.
>>>
>> ok, the following fixes this for both timers and the vgic:
>>
>> commit 1b68f39459dbc797f6766c103edf2c1053984161
>> Author: Christoffer Dall <c.dall at virtualopensystems.com>
>> Date: Mon Jan 14 14:16:31 2013 -0500
>>
>> KVM: ARM: vgic: use sync/flush terminology
>>
>> Use sync/flush for saving state to/from CPUs to be consistent with
>> other uses in arch/arm.
>
> Sync and flush on their own are pretty inexpressive. Consider changing
> it to {flush,sync}_hwstate, so we're consistent with what VFP does.
>
sure
More information about the linux-arm-kernel
mailing list