Re: [PATCH v6 7/9] target/arm/kvm: scratch vcpu: Preserve input kvm_vcpu_init features

2019-10-22 Thread Beata Michalska
HI Andrew

On Wed, 16 Oct 2019 at 09:57, Andrew Jones  wrote:
>
> kvm_arm_create_scratch_host_vcpu() takes a struct kvm_vcpu_init
> parameter. Rather than just using it as an output parameter to
> pass back the preferred target, use it also as an input parameter,
> allowing a caller to pass a selected target if they wish and to
> also pass cpu features. If the caller doesn't want to select a
> target they can pass -1 for the target which indicates they want
> to use the preferred target and have it passed back like before.
>
> Signed-off-by: Andrew Jones 
> Reviewed-by: Richard Henderson 
> Reviewed-by: Eric Auger 

Reviewed-by: Beata Michalska 

Thanks

BR
Beata
> ---
>  target/arm/kvm.c   | 20 +++-
>  target/arm/kvm32.c |  6 +-
>  target/arm/kvm64.c |  6 +-
>  3 files changed, 25 insertions(+), 7 deletions(-)
>
> diff --git a/target/arm/kvm.c b/target/arm/kvm.c
> index f07332bbda30..5b82cefef608 100644
> --- a/target/arm/kvm.c
> +++ b/target/arm/kvm.c
> @@ -66,7 +66,7 @@ bool kvm_arm_create_scratch_host_vcpu(const uint32_t 
> *cpus_to_try,
>int *fdarray,
>struct kvm_vcpu_init *init)
>  {
> -int ret, kvmfd = -1, vmfd = -1, cpufd = -1;
> +int ret = 0, kvmfd = -1, vmfd = -1, cpufd = -1;
>
>  kvmfd = qemu_open("/dev/kvm", O_RDWR);
>  if (kvmfd < 0) {
> @@ -86,7 +86,14 @@ bool kvm_arm_create_scratch_host_vcpu(const uint32_t 
> *cpus_to_try,
>  goto finish;
>  }
>
> -ret = ioctl(vmfd, KVM_ARM_PREFERRED_TARGET, init);
> +if (init->target == -1) {
> +struct kvm_vcpu_init preferred;
> +
> +ret = ioctl(vmfd, KVM_ARM_PREFERRED_TARGET, &preferred);
> +if (!ret) {
> +init->target = preferred.target;
> +}
> +}
>  if (ret >= 0) {
>  ret = ioctl(cpufd, KVM_ARM_VCPU_INIT, init);
>  if (ret < 0) {
> @@ -98,10 +105,12 @@ bool kvm_arm_create_scratch_host_vcpu(const uint32_t 
> *cpus_to_try,
>   * creating one kind of guest CPU which is its preferred
>   * CPU type.
>   */
> +struct kvm_vcpu_init try;
> +
>  while (*cpus_to_try != QEMU_KVM_ARM_TARGET_NONE) {
> -init->target = *cpus_to_try++;
> -memset(init->features, 0, sizeof(init->features));
> -ret = ioctl(cpufd, KVM_ARM_VCPU_INIT, init);
> +try.target = *cpus_to_try++;
> +memcpy(try.features, init->features, sizeof(init->features));
> +ret = ioctl(cpufd, KVM_ARM_VCPU_INIT, &try);
>  if (ret >= 0) {
>  break;
>  }
> @@ -109,6 +118,7 @@ bool kvm_arm_create_scratch_host_vcpu(const uint32_t 
> *cpus_to_try,
>  if (ret < 0) {
>  goto err;
>  }
> +init->target = try.target;
>  } else {
>  /* Treat a NULL cpus_to_try argument the same as an empty
>   * list, which means we will fail the call since this must
> diff --git a/target/arm/kvm32.c b/target/arm/kvm32.c
> index 2451a2d4bbef..32bf8d6757c4 100644
> --- a/target/arm/kvm32.c
> +++ b/target/arm/kvm32.c
> @@ -53,7 +53,11 @@ bool kvm_arm_get_host_cpu_features(ARMHostCPUFeatures 
> *ahcf)
>  QEMU_KVM_ARM_TARGET_CORTEX_A15,
>  QEMU_KVM_ARM_TARGET_NONE
>  };
> -struct kvm_vcpu_init init;
> +/*
> + * target = -1 informs kvm_arm_create_scratch_host_vcpu()
> + * to use the preferred target
> + */
> +struct kvm_vcpu_init init = { .target = -1, };
>
>  if (!kvm_arm_create_scratch_host_vcpu(cpus_to_try, fdarray, &init)) {
>  return false;
> diff --git a/target/arm/kvm64.c b/target/arm/kvm64.c
> index 850da1b5e6aa..c7ecefbed720 100644
> --- a/target/arm/kvm64.c
> +++ b/target/arm/kvm64.c
> @@ -502,7 +502,11 @@ bool kvm_arm_get_host_cpu_features(ARMHostCPUFeatures 
> *ahcf)
>  KVM_ARM_TARGET_CORTEX_A57,
>  QEMU_KVM_ARM_TARGET_NONE
>  };
> -struct kvm_vcpu_init init;
> +/*
> + * target = -1 informs kvm_arm_create_scratch_host_vcpu()
> + * to use the preferred target
> + */
> +struct kvm_vcpu_init init = { .target = -1, };
>
>  if (!kvm_arm_create_scratch_host_vcpu(cpus_to_try, fdarray, &init)) {
>  return false;
> --
> 2.21.0
>
>



Re: [PATCH v6 7/9] target/arm/kvm: scratch vcpu: Preserve input kvm_vcpu_init features

2019-10-17 Thread Masayoshi Mizuma
On Wed, Oct 16, 2019 at 10:54:06AM +0200, Andrew Jones wrote:
> kvm_arm_create_scratch_host_vcpu() takes a struct kvm_vcpu_init
> parameter. Rather than just using it as an output parameter to
> pass back the preferred target, use it also as an input parameter,
> allowing a caller to pass a selected target if they wish and to
> also pass cpu features. If the caller doesn't want to select a
> target they can pass -1 for the target which indicates they want
> to use the preferred target and have it passed back like before.
> 
> Signed-off-by: Andrew Jones 
> Reviewed-by: Richard Henderson 
> Reviewed-by: Eric Auger 

This patch works well on aarch64 with SVE machine, thanks!
Please feel free to add:

Tested-by: Masayoshi Mizuma 

- Masa

> ---
>  target/arm/kvm.c   | 20 +++-
>  target/arm/kvm32.c |  6 +-
>  target/arm/kvm64.c |  6 +-
>  3 files changed, 25 insertions(+), 7 deletions(-)
> 
> diff --git a/target/arm/kvm.c b/target/arm/kvm.c
> index f07332bbda30..5b82cefef608 100644
> --- a/target/arm/kvm.c
> +++ b/target/arm/kvm.c
> @@ -66,7 +66,7 @@ bool kvm_arm_create_scratch_host_vcpu(const uint32_t 
> *cpus_to_try,
>int *fdarray,
>struct kvm_vcpu_init *init)
>  {
> -int ret, kvmfd = -1, vmfd = -1, cpufd = -1;
> +int ret = 0, kvmfd = -1, vmfd = -1, cpufd = -1;
>  
>  kvmfd = qemu_open("/dev/kvm", O_RDWR);
>  if (kvmfd < 0) {
> @@ -86,7 +86,14 @@ bool kvm_arm_create_scratch_host_vcpu(const uint32_t 
> *cpus_to_try,
>  goto finish;
>  }
>  
> -ret = ioctl(vmfd, KVM_ARM_PREFERRED_TARGET, init);
> +if (init->target == -1) {
> +struct kvm_vcpu_init preferred;
> +
> +ret = ioctl(vmfd, KVM_ARM_PREFERRED_TARGET, &preferred);
> +if (!ret) {
> +init->target = preferred.target;
> +}
> +}
>  if (ret >= 0) {
>  ret = ioctl(cpufd, KVM_ARM_VCPU_INIT, init);
>  if (ret < 0) {
> @@ -98,10 +105,12 @@ bool kvm_arm_create_scratch_host_vcpu(const uint32_t 
> *cpus_to_try,
>   * creating one kind of guest CPU which is its preferred
>   * CPU type.
>   */
> +struct kvm_vcpu_init try;
> +
>  while (*cpus_to_try != QEMU_KVM_ARM_TARGET_NONE) {
> -init->target = *cpus_to_try++;
> -memset(init->features, 0, sizeof(init->features));
> -ret = ioctl(cpufd, KVM_ARM_VCPU_INIT, init);
> +try.target = *cpus_to_try++;
> +memcpy(try.features, init->features, sizeof(init->features));
> +ret = ioctl(cpufd, KVM_ARM_VCPU_INIT, &try);
>  if (ret >= 0) {
>  break;
>  }
> @@ -109,6 +118,7 @@ bool kvm_arm_create_scratch_host_vcpu(const uint32_t 
> *cpus_to_try,
>  if (ret < 0) {
>  goto err;
>  }
> +init->target = try.target;
>  } else {
>  /* Treat a NULL cpus_to_try argument the same as an empty
>   * list, which means we will fail the call since this must
> diff --git a/target/arm/kvm32.c b/target/arm/kvm32.c
> index 2451a2d4bbef..32bf8d6757c4 100644
> --- a/target/arm/kvm32.c
> +++ b/target/arm/kvm32.c
> @@ -53,7 +53,11 @@ bool kvm_arm_get_host_cpu_features(ARMHostCPUFeatures 
> *ahcf)
>  QEMU_KVM_ARM_TARGET_CORTEX_A15,
>  QEMU_KVM_ARM_TARGET_NONE
>  };
> -struct kvm_vcpu_init init;
> +/*
> + * target = -1 informs kvm_arm_create_scratch_host_vcpu()
> + * to use the preferred target
> + */
> +struct kvm_vcpu_init init = { .target = -1, };
>  
>  if (!kvm_arm_create_scratch_host_vcpu(cpus_to_try, fdarray, &init)) {
>  return false;
> diff --git a/target/arm/kvm64.c b/target/arm/kvm64.c
> index 850da1b5e6aa..c7ecefbed720 100644
> --- a/target/arm/kvm64.c
> +++ b/target/arm/kvm64.c
> @@ -502,7 +502,11 @@ bool kvm_arm_get_host_cpu_features(ARMHostCPUFeatures 
> *ahcf)
>  KVM_ARM_TARGET_CORTEX_A57,
>  QEMU_KVM_ARM_TARGET_NONE
>  };
> -struct kvm_vcpu_init init;
> +/*
> + * target = -1 informs kvm_arm_create_scratch_host_vcpu()
> + * to use the preferred target
> + */
> +struct kvm_vcpu_init init = { .target = -1, };
>  
>  if (!kvm_arm_create_scratch_host_vcpu(cpus_to_try, fdarray, &init)) {
>  return false;
> -- 
> 2.21.0
> 
> 



[PATCH v6 7/9] target/arm/kvm: scratch vcpu: Preserve input kvm_vcpu_init features

2019-10-16 Thread Andrew Jones
kvm_arm_create_scratch_host_vcpu() takes a struct kvm_vcpu_init
parameter. Rather than just using it as an output parameter to
pass back the preferred target, use it also as an input parameter,
allowing a caller to pass a selected target if they wish and to
also pass cpu features. If the caller doesn't want to select a
target they can pass -1 for the target which indicates they want
to use the preferred target and have it passed back like before.

Signed-off-by: Andrew Jones 
Reviewed-by: Richard Henderson 
Reviewed-by: Eric Auger 
---
 target/arm/kvm.c   | 20 +++-
 target/arm/kvm32.c |  6 +-
 target/arm/kvm64.c |  6 +-
 3 files changed, 25 insertions(+), 7 deletions(-)

diff --git a/target/arm/kvm.c b/target/arm/kvm.c
index f07332bbda30..5b82cefef608 100644
--- a/target/arm/kvm.c
+++ b/target/arm/kvm.c
@@ -66,7 +66,7 @@ bool kvm_arm_create_scratch_host_vcpu(const uint32_t 
*cpus_to_try,
   int *fdarray,
   struct kvm_vcpu_init *init)
 {
-int ret, kvmfd = -1, vmfd = -1, cpufd = -1;
+int ret = 0, kvmfd = -1, vmfd = -1, cpufd = -1;
 
 kvmfd = qemu_open("/dev/kvm", O_RDWR);
 if (kvmfd < 0) {
@@ -86,7 +86,14 @@ bool kvm_arm_create_scratch_host_vcpu(const uint32_t 
*cpus_to_try,
 goto finish;
 }
 
-ret = ioctl(vmfd, KVM_ARM_PREFERRED_TARGET, init);
+if (init->target == -1) {
+struct kvm_vcpu_init preferred;
+
+ret = ioctl(vmfd, KVM_ARM_PREFERRED_TARGET, &preferred);
+if (!ret) {
+init->target = preferred.target;
+}
+}
 if (ret >= 0) {
 ret = ioctl(cpufd, KVM_ARM_VCPU_INIT, init);
 if (ret < 0) {
@@ -98,10 +105,12 @@ bool kvm_arm_create_scratch_host_vcpu(const uint32_t 
*cpus_to_try,
  * creating one kind of guest CPU which is its preferred
  * CPU type.
  */
+struct kvm_vcpu_init try;
+
 while (*cpus_to_try != QEMU_KVM_ARM_TARGET_NONE) {
-init->target = *cpus_to_try++;
-memset(init->features, 0, sizeof(init->features));
-ret = ioctl(cpufd, KVM_ARM_VCPU_INIT, init);
+try.target = *cpus_to_try++;
+memcpy(try.features, init->features, sizeof(init->features));
+ret = ioctl(cpufd, KVM_ARM_VCPU_INIT, &try);
 if (ret >= 0) {
 break;
 }
@@ -109,6 +118,7 @@ bool kvm_arm_create_scratch_host_vcpu(const uint32_t 
*cpus_to_try,
 if (ret < 0) {
 goto err;
 }
+init->target = try.target;
 } else {
 /* Treat a NULL cpus_to_try argument the same as an empty
  * list, which means we will fail the call since this must
diff --git a/target/arm/kvm32.c b/target/arm/kvm32.c
index 2451a2d4bbef..32bf8d6757c4 100644
--- a/target/arm/kvm32.c
+++ b/target/arm/kvm32.c
@@ -53,7 +53,11 @@ bool kvm_arm_get_host_cpu_features(ARMHostCPUFeatures *ahcf)
 QEMU_KVM_ARM_TARGET_CORTEX_A15,
 QEMU_KVM_ARM_TARGET_NONE
 };
-struct kvm_vcpu_init init;
+/*
+ * target = -1 informs kvm_arm_create_scratch_host_vcpu()
+ * to use the preferred target
+ */
+struct kvm_vcpu_init init = { .target = -1, };
 
 if (!kvm_arm_create_scratch_host_vcpu(cpus_to_try, fdarray, &init)) {
 return false;
diff --git a/target/arm/kvm64.c b/target/arm/kvm64.c
index 850da1b5e6aa..c7ecefbed720 100644
--- a/target/arm/kvm64.c
+++ b/target/arm/kvm64.c
@@ -502,7 +502,11 @@ bool kvm_arm_get_host_cpu_features(ARMHostCPUFeatures 
*ahcf)
 KVM_ARM_TARGET_CORTEX_A57,
 QEMU_KVM_ARM_TARGET_NONE
 };
-struct kvm_vcpu_init init;
+/*
+ * target = -1 informs kvm_arm_create_scratch_host_vcpu()
+ * to use the preferred target
+ */
+struct kvm_vcpu_init init = { .target = -1, };
 
 if (!kvm_arm_create_scratch_host_vcpu(cpus_to_try, fdarray, &init)) {
 return false;
-- 
2.21.0