From mboxrd@z Thu Jan 1 00:00:00 1970 From: Anup Patel Subject: [PATCH 1/5] kvmtool: ARM: Use KVM_ARM_PREFERRED_TARGET vm ioctl to determine target cpu Date: Tue, 5 Aug 2014 14:19:55 +0530 Message-ID: <1407228599-25065-2-git-send-email-anup.patel@linaro.org> References: <1407228599-25065-1-git-send-email-anup.patel@linaro.org> Cc: kvm@vger.kernel.org, patches@apm.com, will.deacon@arm.com, marc.zyngier@arm.com, penberg@kernel.org, christoffer.dall@linaro.org, pranavkumar@linaro.org, Anup Patel To: kvmarm@lists.cs.columbia.edu Return-path: Received: from mail-pd0-f179.google.com ([209.85.192.179]:55911 "EHLO mail-pd0-f179.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932700AbaHEIug (ORCPT ); Tue, 5 Aug 2014 04:50:36 -0400 Received: by mail-pd0-f179.google.com with SMTP id ft15so976414pdb.10 for ; Tue, 05 Aug 2014 01:50:35 -0700 (PDT) In-Reply-To: <1407228599-25065-1-git-send-email-anup.patel@linaro.org> Sender: kvm-owner@vger.kernel.org List-ID: 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. We bail-out target type returned by KVM_ARM_PREFERRED_TARGET vm ioctl is not known to kvmtool. Signed-off-by: Pranavkumar Sawargaonkar Signed-off-by: Anup Patel --- tools/kvm/arm/kvm-cpu.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/tools/kvm/arm/kvm-cpu.c b/tools/kvm/arm/kvm-cpu.c index aeaa4cf..7478f8f 100644 --- a/tools/kvm/arm/kvm-cpu.c +++ b/tools/kvm/arm/kvm-cpu.c @@ -34,6 +34,7 @@ struct kvm_cpu *kvm_cpu__arch_init(struct kvm *kvm, unsigned long cpu_id) struct kvm_cpu *vcpu; int coalesced_offset, mmap_size, err = -1; unsigned int i; + struct kvm_vcpu_init preferred_init; struct kvm_vcpu_init vcpu_init = { .features = ARM_VCPU_FEATURE_FLAGS(kvm, cpu_id) }; @@ -46,6 +47,10 @@ struct kvm_cpu *kvm_cpu__arch_init(struct kvm *kvm, unsigned long cpu_id) if (vcpu->vcpu_fd < 0) die_perror("KVM_CREATE_VCPU ioctl"); + err = ioctl(kvm->vm_fd, KVM_ARM_PREFERRED_TARGET, &preferred_init); + if (err < 0) + die_perror("KVM_ARM_PREFERRED_TARGET ioctl"); + mmap_size = ioctl(kvm->sys_fd, KVM_GET_VCPU_MMAP_SIZE, 0); if (mmap_size < 0) die_perror("KVM_GET_VCPU_MMAP_SIZE ioctl"); @@ -55,17 +60,22 @@ 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. */ + /* Match preferred target CPU type. */ + target = NULL; 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) + if (kvm_arm_targets[i]->id == preferred_init.target) { + target = kvm_arm_targets[i]; break; + } + } + if (!target) { + die("preferred target not available\n"); } + vcpu_init.target = preferred_init.target; + err = ioctl(vcpu->vcpu_fd, KVM_ARM_VCPU_INIT, &vcpu_init); if (err || target->init(vcpu)) die("Unable to initialise ARM vcpu"); @@ -81,6 +91,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; } -- 1.7.9.5