Re: [PATCH v3 1/4] kvmtool: ARM: Use KVM_ARM_PREFERRED_TARGET vm ioctl to determine target cpu

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

 



On Wed, Sep 17, 2014 at 3:43 AM, Anup Patel <apatel@xxxxxxx> wrote:
> On Thu, Sep 11, 2014 at 9:24 PM, Andre Przywara <andre.przywara@xxxxxxx> wrote:
>> Hi Anup,
>>
>> On 08/09/14 09:17, Anup Patel wrote:
>>> Instead, of trying out each and every target type we should
>>> use KVM_ARM_PREFERRED_TARGET vm ioctl to determine target type
>>> for KVM ARM/ARM64.
>>>
>>> If KVM_ARM_PREFERRED_TARGET vm ioctl fails then we fallback to
>>> old method of trying all known target types.
>>>
>>> If KVM_ARM_PREFERRED_TARGET vm ioctl succeeds but the returned
>>> target type is not known to KVMTOOL then we forcefully init
>>> VCPU with target type returned by KVM_ARM_PREFERRED_TARGET vm ioctl.
>>>
>>> Signed-off-by: Pranavkumar Sawargaonkar <pranavkumar@xxxxxxxxxx>
>>> Signed-off-by: Anup Patel <anup.patel@xxxxxxxxxx>
>>> ---
>>>  tools/kvm/arm/kvm-cpu.c |   52 +++++++++++++++++++++++++++++++++++++----------
>>>  1 file changed, 41 insertions(+), 11 deletions(-)
>>>
>>> diff --git a/tools/kvm/arm/kvm-cpu.c b/tools/kvm/arm/kvm-cpu.c
>>> index aeaa4cf..ba7a762 100644
>>> --- a/tools/kvm/arm/kvm-cpu.c
>>> +++ b/tools/kvm/arm/kvm-cpu.c
>>> @@ -33,7 +33,8 @@ struct kvm_cpu *kvm_cpu__arch_init(struct kvm *kvm, unsigned long cpu_id)
>>>       struct kvm_arm_target *target;
>>>       struct kvm_cpu *vcpu;
>>>       int coalesced_offset, mmap_size, err = -1;
>>> -     unsigned int i;
>>> +     unsigned int i, target_type;
>>> +     struct kvm_vcpu_init preferred_init;
>>>       struct kvm_vcpu_init vcpu_init = {
>>>               .features = ARM_VCPU_FEATURE_FLAGS(kvm, cpu_id)
>>>       };
>>> @@ -55,19 +56,47 @@ struct kvm_cpu *kvm_cpu__arch_init(struct kvm *kvm, unsigned long cpu_id)
>>>       if (vcpu->kvm_run == MAP_FAILED)
>>>               die("unable to mmap vcpu fd");
>>>
>>> -     /* Find an appropriate target CPU type. */
>>> -     for (i = 0; i < ARRAY_SIZE(kvm_arm_targets); ++i) {
>>> -             if (!kvm_arm_targets[i])
>>> -                     continue;
>>> -             target = kvm_arm_targets[i];
>>> -             vcpu_init.target = target->id;
>>> -             err = ioctl(vcpu->vcpu_fd, KVM_ARM_VCPU_INIT, &vcpu_init);
>>> -             if (!err)
>>> -                     break;
>>> +     /*
>>> +      * If preferred target ioctl successful then use preferred target
>>> +      * else try each and every target type.
>>> +      */
>>> +     err = ioctl(kvm->vm_fd, KVM_ARM_PREFERRED_TARGET, &preferred_init);
>>> +     if (!err) {
>>> +             /* Match preferred target CPU type. */
>>> +             target = NULL;
>>> +             for (i = 0; i < ARRAY_SIZE(kvm_arm_targets); ++i) {
>>> +                     if (!kvm_arm_targets[i])
>>> +                             continue;
>>> +                     if (kvm_arm_targets[i]->id == preferred_init.target) {
>>> +                             target = kvm_arm_targets[i];
>>> +                             target_type = kvm_arm_targets[i]->id;
>>> +                             break;
>>> +                     }
>>> +             }
>>> +             if (!target) {
>>> +                     target = kvm_arm_targets[0];
>>
>> I think you missed the part of the patch which adds the now magic zero
>> member of kvm_arm_targets[]. A simple static initializer should work.
>
> Yes, good catch. I will fix this.
>
>>
>>> +                     target_type = preferred_init.target;
>>
>> Can't you move that out of the loop, in front of it actually? Then you
>> can get rid of the line above setting the target_type also, since you
>> always use the same value now, regardless whether you found that CPU in
>> the list or not.
>
> Sure, I'll rearrange this.
>
>>
>>> +             }
>>> +     } else {
>>> +             /* Find an appropriate target CPU type. */
>>> +             for (i = 0; i < ARRAY_SIZE(kvm_arm_targets); ++i) {
>>> +                     if (!kvm_arm_targets[i])
>>> +                             continue;
>>> +                     target = kvm_arm_targets[i];
>>> +                     target_type = target->id;
>>> +                     vcpu_init.target = target_type;
>>> +                     err = ioctl(vcpu->vcpu_fd, KVM_ARM_VCPU_INIT, &vcpu_init);
>>> +                     if (!err)
>>> +                             break;
>>> +             }
>>> +             if (err)
>>> +                     die("Unable to find matching target");
>>>       }
>>>
>>> +     vcpu_init.target = target_type;
>>> +     err = ioctl(vcpu->vcpu_fd, KVM_ARM_VCPU_INIT, &vcpu_init);
>>
>> You should do this only in the if-branch above, since you (try to) call
>> KVM_ARM_VCPU_INIT already in the else branch before. Otherwise in the
>> latter case you would do it twice.
>
> I was trying to follow the old code which was doing KVM_ARM_VCPU_INIT
> twice for the same VCPU but it makes sense to do it only once.
>
> Regards,
> Anup
>
>>
>> Regards,
>> Andre.
>>
>>>       if (err || target->init(vcpu))
>>> -             die("Unable to initialise ARM vcpu");
>>> +             die("Unable to initialise vcpu");
>>>
>>>       coalesced_offset = ioctl(kvm->sys_fd, KVM_CHECK_EXTENSION,
>>>                                KVM_CAP_COALESCED_MMIO);
>>> @@ -81,6 +110,7 @@ struct kvm_cpu *kvm_cpu__arch_init(struct kvm *kvm, unsigned long cpu_id)
>>>       vcpu->cpu_type          = target->id;
>>>       vcpu->cpu_compatible    = target->compatible;
>>>       vcpu->is_running        = true;
>>> +
>>>       return vcpu;
>>>  }
>>>
>>>
>> CONFIDENTIALITY NOTICE: This e-mail message, including any attachments,
>> is for the sole use of the intended recipient(s) and contains information
>> that is confidential and proprietary to Applied Micro Circuits Corporation or its subsidiaries.
>> It is to be used solely for the purpose of furthering the parties' business relationship.
>> All unauthorized review, use, disclosure or distribution is prohibited.
>> If you are not the intended recipient, please contact the sender by reply e-mail
>> and destroy all copies of the original message.
>>

Please ignore this notice. I used wrong email in my last reply.

Regards,
Anup

> _______________________________________________
> kvmarm mailing list
> kvmarm@xxxxxxxxxxxxxxxxxxxxx
> https://lists.cs.columbia.edu/mailman/listinfo/kvmarm
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux