From: Andre Przywara <andre.przywara@arm.com>
To: Anup Patel <anup.patel@linaro.org>,
"kvmarm@lists.cs.columbia.edu" <kvmarm@lists.cs.columbia.edu>
Cc: "kvm@vger.kernel.org" <kvm@vger.kernel.org>,
"patches@apm.com" <patches@apm.com>,
Will Deacon <Will.Deacon@arm.com>,
Marc Zyngier <Marc.Zyngier@arm.com>,
"penberg@kernel.org" <penberg@kernel.org>,
"christoffer.dall@linaro.org" <christoffer.dall@linaro.org>,
"pranavkumar@linaro.org" <pranavkumar@linaro.org>
Subject: Re: [PATCH v4 1/4] kvmtool: ARM: Use KVM_ARM_PREFERRED_TARGET vm ioctl to determine target cpu
Date: Tue, 30 Sep 2014 09:56:14 +0100 [thread overview]
Message-ID: <542A702E.7080601@arm.com> (raw)
In-Reply-To: <1411084676-8275-2-git-send-email-anup.patel@linaro.org>
Hi Anup,
thanks for the re-spin and sorry for the delay.
Looks better now, some minor comments below.
On 19/09/14 00:57, 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@linaro.org>
> Signed-off-by: Anup Patel <anup.patel@linaro.org>
> ---
> tools/kvm/arm/aarch32/arm-cpu.c | 9 ++++++-
> tools/kvm/arm/aarch64/arm-cpu.c | 10 ++++++--
> tools/kvm/arm/kvm-cpu.c | 52 ++++++++++++++++++++++++++++++---------
> 3 files changed, 57 insertions(+), 14 deletions(-)
>
> diff --git a/tools/kvm/arm/aarch32/arm-cpu.c b/tools/kvm/arm/aarch32/arm-cpu.c
> index 71b98fe..0d2ff11 100644
> --- a/tools/kvm/arm/aarch32/arm-cpu.c
> +++ b/tools/kvm/arm/aarch32/arm-cpu.c
> @@ -22,6 +22,12 @@ static int arm_cpu__vcpu_init(struct kvm_cpu *vcpu)
> return 0;
> }
>
> +static struct kvm_arm_target target_generic_v7 = {
> + .id = UINT_MAX,
> + .compatible = "arm,arm-v7",
> + .init = arm_cpu__vcpu_init,
> +};
> +
> static struct kvm_arm_target target_cortex_a15 = {
> .id = KVM_ARM_TARGET_CORTEX_A15,
> .compatible = "arm,cortex-a15",
> @@ -36,7 +42,8 @@ static struct kvm_arm_target target_cortex_a7 = {
>
> static int arm_cpu__core_init(struct kvm *kvm)
> {
> - return (kvm_cpu__register_kvm_arm_target(&target_cortex_a15) ||
> + return (kvm_cpu__register_kvm_arm_target(&target_generic_v7) ||
> + kvm_cpu__register_kvm_arm_target(&target_cortex_a15) ||
> kvm_cpu__register_kvm_arm_target(&target_cortex_a7));
> }
I wonder if you could avoid the registration of this target and instead
reference it later directly (instead of using a magic 0 index)?
This way you wouldn't need to care about avoiding accidental .id matches
with the UINT_MAX above.
> core_init(arm_cpu__core_init);
> diff --git a/tools/kvm/arm/aarch64/arm-cpu.c b/tools/kvm/arm/aarch64/arm-cpu.c
> index ce5ea2f..9ee3da3 100644
> --- a/tools/kvm/arm/aarch64/arm-cpu.c
> +++ b/tools/kvm/arm/aarch64/arm-cpu.c
> @@ -16,13 +16,18 @@ static void generate_fdt_nodes(void *fdt, struct kvm *kvm, u32 gic_phandle)
> timer__generate_fdt_nodes(fdt, kvm, timer_interrupts);
> }
>
> -
> static int arm_cpu__vcpu_init(struct kvm_cpu *vcpu)
> {
> vcpu->generate_fdt_nodes = generate_fdt_nodes;
> return 0;
> }
>
> +static struct kvm_arm_target target_generic_v8 = {
> + .id = UINT_MAX,
> + .compatible = "arm,arm-v8",
> + .init = arm_cpu__vcpu_init,
> +};
> +
> static struct kvm_arm_target target_aem_v8 = {
> .id = KVM_ARM_TARGET_AEM_V8,
> .compatible = "arm,arm-v8",
> @@ -43,7 +48,8 @@ static struct kvm_arm_target target_cortex_a57 = {
>
> static int arm_cpu__core_init(struct kvm *kvm)
> {
> - return (kvm_cpu__register_kvm_arm_target(&target_aem_v8) ||
> + return (kvm_cpu__register_kvm_arm_target(&target_generic_v8) ||
> + kvm_cpu__register_kvm_arm_target(&target_aem_v8) ||
> kvm_cpu__register_kvm_arm_target(&target_foundation_v8) ||
> kvm_cpu__register_kvm_arm_target(&target_cortex_a57));
> }
(same thing like for v7 here)
> diff --git a/tools/kvm/arm/kvm-cpu.c b/tools/kvm/arm/kvm-cpu.c
> index aeaa4cf..6de5344 100644
> --- a/tools/kvm/arm/kvm-cpu.c
> +++ b/tools/kvm/arm/kvm-cpu.c
> @@ -13,7 +13,7 @@ int kvm_cpu__get_debug_fd(void)
> return debug_fd;
> }
>
> -static struct kvm_arm_target *kvm_arm_targets[KVM_ARM_NUM_TARGETS];
> +static struct kvm_arm_target *kvm_arm_targets[KVM_ARM_NUM_TARGETS+1];
w/s issue
> int kvm_cpu__register_kvm_arm_target(struct kvm_arm_target *target)
> {
> unsigned int i = 0;
> @@ -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;
> + /*
> + * If preferred target ioctl successful then use preferred target
the is
> + * 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];
As hinted above, I'd rather see a name for the magic 0 here or the
default target_generic referenced directly.
> + target_type = preferred_init.target;
> + }
> + vcpu_init.target = target_type;
I think you can get rid of the target_type variable at all:
if (!target) {
target = &target_generic_v8;
vcpu_init.target = preferred_init.target;
} else
vcpu_init.target = target->id;
> err = ioctl(vcpu->vcpu_fd, KVM_ARM_VCPU_INIT, &vcpu_init);
> - if (!err)
> - break;
> + } 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;
even more obvious here.
> + err = ioctl(vcpu->vcpu_fd, KVM_ARM_VCPU_INIT, &vcpu_init);
> + if (!err)
> + break;
> + }
> + if (err)
> + die("Unable to find matching target");
> }
>
> 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;
If I am not mistaken, this value is bogus when we use PREFERRED_TARGET.
Please use vcpu_init.target here instead.
Regards,
Andre.
> vcpu->cpu_compatible = target->compatible;
> vcpu->is_running = true;
> +
> return vcpu;
> }
>
>
next prev parent reply other threads:[~2014-09-30 8:56 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-09-18 23:57 [PATCH v4 0/4] kvmtool: ARM/ARM64: Misc updates Anup Patel
2014-09-18 23:57 ` [PATCH v4 1/4] kvmtool: ARM: Use KVM_ARM_PREFERRED_TARGET vm ioctl to determine target cpu Anup Patel
2014-09-30 8:56 ` Andre Przywara [this message]
2014-10-01 10:24 ` Anup Patel
2014-09-18 23:57 ` [PATCH v4 2/4] kvmtool: ARM64: Add target type potenza for aarch64 Anup Patel
2014-09-29 17:00 ` Andre Przywara
2014-10-01 10:23 ` Anup Patel
2014-09-18 23:57 ` [PATCH v4 3/4] kvmtool: Handle exit reason KVM_EXIT_SYSTEM_EVENT Anup Patel
2014-09-30 9:04 ` Andre Przywara
2014-09-18 23:57 ` [PATCH v4 4/4] kvmtool: ARM/ARM64: Provide PSCI-0.2 to guest when KVM supports it Anup Patel
2014-09-30 9:02 ` Andre Przywara
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=542A702E.7080601@arm.com \
--to=andre.przywara@arm.com \
--cc=Marc.Zyngier@arm.com \
--cc=Will.Deacon@arm.com \
--cc=anup.patel@linaro.org \
--cc=christoffer.dall@linaro.org \
--cc=kvm@vger.kernel.org \
--cc=kvmarm@lists.cs.columbia.edu \
--cc=patches@apm.com \
--cc=penberg@kernel.org \
--cc=pranavkumar@linaro.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.