Re: [PATCH v2 01/11] ARM: KVM: Keep track of currently running vcpus

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

 



On Mon, Aug 20, 2012 at 5:26 AM, Marc Zyngier <marc.zyngier@xxxxxxx> wrote:
> On 18/08/12 03:58, Christoffer Dall wrote:
>> On Thu, Jul 5, 2012 at 11:28 AM, Marc Zyngier <marc.zyngier@xxxxxxx> wrote:
>>> When an interrupt occurs for the guest, it is sometimes necessary
>>> to find out which vcpu was running at that point.
>>
>> s/was/is/ ?
>>
>>>
>>> Keep track of which vcpu is being tun in kvm_arch_vcpu_ioctl_run(),
>>
>> s/tun/run/
>>
>>> and allow the data to be retrived using either:
>>> - kvm_arm_get_running_vcpu(): returns the vcpu running at this point
>>>   on the current CPU. Can only be used in a non-preemptable context.
>>
>> was last run you mean - if you can call this function it's not run,
>> strictly speaking
>>
>> or just say: the vcpu loaded at this point, eh maybe not.
>>
>>> - kvm_arm_get_running_vcpus(): returns the per-CPU variable holding
>>>   the the running vcpus, useable for per-CPU interrupts.
>>>
>>> Signed-off-by: Marc Zyngier <marc.zyngier@xxxxxxx>
>>> ---
>>>  arch/arm/include/asm/kvm_host.h |    3 +++
>>>  arch/arm/kvm/arm.c              |   29 +++++++++++++++++++++++++++++
>>>  2 files changed, 32 insertions(+)
>>>
>>> diff --git a/arch/arm/include/asm/kvm_host.h b/arch/arm/include/asm/kvm_host.h
>>> index 9d0cc83..91be029 100644
>>> --- a/arch/arm/include/asm/kvm_host.h
>>> +++ b/arch/arm/include/asm/kvm_host.h
>>> @@ -156,4 +156,7 @@ static inline int kvm_test_age_hva(struct kvm *kvm, unsigned long hva)
>>>         return 0;
>>>  }
>>>
>>> +struct kvm_vcpu *kvm_arm_get_running_vcpu(void);
>>> +struct kvm_vcpu __percpu **kvm_get_running_vcpus(void);
>>> +
>>>  #endif /* __ARM_KVM_HOST_H__ */
>>> diff --git a/arch/arm/kvm/arm.c b/arch/arm/kvm/arm.c
>>> index 44691e1..8bb53cb 100644
>>> --- a/arch/arm/kvm/arm.c
>>> +++ b/arch/arm/kvm/arm.c
>>> @@ -46,11 +46,38 @@
>>>
>>>  static DEFINE_PER_CPU(unsigned long, kvm_arm_hyp_stack_page);
>>>
>>> +/* Per-CPU variable containing the currently running vcpu. */
>>> +static DEFINE_PER_CPU(struct kvm_vcpu *, kvm_arm_running_vcpu);
>>> +
>>>  /* The VMID used in the VTTBR */
>>>  static atomic64_t kvm_vmid_gen = ATOMIC64_INIT(1);
>>>  static u8 kvm_next_vmid;
>>>  DEFINE_SPINLOCK(kvm_vmid_lock);
>>>
>>> +static void kvm_arm_set_running_vcpu(struct kvm_vcpu *vcpu)
>>> +{
>>> +       BUG_ON(preemptible());
>>> +       __get_cpu_var(kvm_arm_running_vcpu) = vcpu;
>>> +}
>>> +
>>> +/**
>>> + * kvm_arm_get_running_vcpu - get the vcpu running on the current CPU.
>>> + * Must be called from non-preemptible context
>>> + */
>>> +struct kvm_vcpu *kvm_arm_get_running_vcpu(void)
>>> +{
>>> +       BUG_ON(preemptible());
>>> +       return __get_cpu_var(kvm_arm_running_vcpu);
>>> +}
>>> +
>>> +/**
>>> + * kvm_arm_get_running_vcpus - get the per-CPU array on currently running vcpus.
>>> + */
>>> +struct kvm_vcpu __percpu **kvm_get_running_vcpus(void)
>>> +{
>>> +       return &kvm_arm_running_vcpu;
>>> +}
>>> +
>>>  int kvm_arch_hardware_enable(void *garbage)
>>>  {
>>>         return 0;
>>> @@ -576,9 +603,11 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run)
>>>                 trace_kvm_entry(vcpu->arch.regs.pc);
>>>                 kvm_guest_enter();
>>>                 vcpu->mode = IN_GUEST_MODE;
>>> +               kvm_arm_set_running_vcpu(vcpu);
>>>
>>>                 ret = __kvm_vcpu_run(vcpu);
>>>
>>> +               kvm_arm_set_running_vcpu(NULL);
>>
>> this made your function quite useless, but I guess you know that
>> because of the fixup you posted :)
>
> Useless? If you put that back in the context of how the code was
> structured two months ago (circa v9), it makes a lot more sense.
> Interrupts would have already been dealt with before returning from
> __kvm_vcpu_run().
>

that's true. My bad.

> These days, this code has been moved to kvm_arch_vcpu_load() and
> kvm_arch_vcpu_put().
>
>> with the fixup it all looks ok to me.
>>
>>>                 vcpu->mode = OUTSIDE_GUEST_MODE;
>>>                 vcpu->stat.exits++;
>>>                 kvm_guest_exit();
>>> --
>>> 1.7.10.3
>>>
>>>
>>
>
>
> --
> Jazz is not dead. It just smells funny...
>
_______________________________________________
kvmarm mailing list
kvmarm@xxxxxxxxxxxxxxxxxxxxx
https://lists.cs.columbia.edu/cucslists/listinfo/kvmarm


[Index of Archives]     [Linux KVM]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux