It will be very useful for user space if it has a method of querying VCPU target type matching to underlying Host. We can use such querying mechanism and implement machine models in user space where VCPU target type is always same-as/similar-to underlying Host (i.e. Target CPU=Host).
This patch series implements KVM_ARM_PREFERRED_TARGET ioclt for querying VCPU target type matching underlying host. Using this new ioctl we can implement VCPU target CPU=Host in user space (i.e. QEMU/KVMTOOL).
Also, it is not mandatory to call KVM_ARM_PREFERRED_TARGET ioctl and the old method of trying all possible target types using KVM_ARM_VCPU_INIT ioctl to initialize VCPU works fine.
Anup Patel (4): ARM: KVM: Implement kvm_vcpu_preferred_target() function ARM64: KVM: Implement kvm_vcpu_preferred_target() function ARM/ARM64: KVM: Implement KVM_ARM_PREFERRED_TARGET ioctl KVM: Add documentation for KVM_ARM_PREFERRED_TARGET ioctl
Documentation/virtual/kvm/api.txt | 26 ++++++++++++++++++++++---- arch/arm/include/asm/kvm_host.h | 1 + arch/arm/kvm/arm.c | 12 ++++++++++++ arch/arm/kvm/guest.c | 19 +++++++++++++++++++ arch/arm64/include/asm/kvm_host.h | 1 + arch/arm64/kvm/guest.c | 20 ++++++++++++++++++++ include/uapi/linux/kvm.h | 1 + 7 files changed, 76 insertions(+), 4 deletions(-)
This patch implements kvm_vcpu_preferred_target() function for KVM ARM which will help us implement KVM_ARM_PREFERRED_TARGET ioctl for user space.
Signed-off-by: Anup Patel anup.patel@linaro.org Signed-off-by: Pranavkumar Sawargaonkar pranavkumar@linaro.org --- arch/arm/kvm/guest.c | 19 +++++++++++++++++++ arch/arm64/include/asm/kvm_host.h | 1 + 2 files changed, 20 insertions(+)
diff --git a/arch/arm/kvm/guest.c b/arch/arm/kvm/guest.c index 152d036..dae1e9f 100644 --- a/arch/arm/kvm/guest.c +++ b/arch/arm/kvm/guest.c @@ -222,6 +222,25 @@ int kvm_vcpu_set_target(struct kvm_vcpu *vcpu, return kvm_reset_vcpu(vcpu); }
+int kvm_vcpu_preferred_target(struct kvm_vcpu_init *init) +{ + int target = kvm_target_cpu(); + + if (target < 0) + return target; + + memset(init, 0, sizeof(*init)); + + /* For now, we return all optional features are available + * for preferred target. In future, we might have features + * available based on underlying host. + */ + init->target = (__u32)target; + init->features[0] |= (1 << KVM_ARM_VCPU_POWER_OFF); + + return 0; +} + int kvm_arch_vcpu_ioctl_get_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu) { return -EINVAL; diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h index f318c43..b609db3 100644 --- a/arch/arm64/include/asm/kvm_host.h +++ b/arch/arm64/include/asm/kvm_host.h @@ -156,6 +156,7 @@ struct kvm_vcpu_stat { struct kvm_vcpu_init; int kvm_vcpu_set_target(struct kvm_vcpu *vcpu, const struct kvm_vcpu_init *init); +int kvm_vcpu_preferred_target(struct kvm_vcpu_init *init); unsigned long kvm_arm_num_regs(struct kvm_vcpu *vcpu); int kvm_arm_copy_reg_indices(struct kvm_vcpu *vcpu, u64 __user *indices); struct kvm_one_reg;
On Sat, Sep 14, 2013 at 04:38:34PM +0530, Anup Patel wrote:
This patch implements kvm_vcpu_preferred_target() function for KVM ARM which will help us implement KVM_ARM_PREFERRED_TARGET ioctl for user space.
Signed-off-by: Anup Patel anup.patel@linaro.org Signed-off-by: Pranavkumar Sawargaonkar pranavkumar@linaro.org
arch/arm/kvm/guest.c | 19 +++++++++++++++++++ arch/arm64/include/asm/kvm_host.h | 1 + 2 files changed, 20 insertions(+)
diff --git a/arch/arm/kvm/guest.c b/arch/arm/kvm/guest.c index 152d036..dae1e9f 100644 --- a/arch/arm/kvm/guest.c +++ b/arch/arm/kvm/guest.c @@ -222,6 +222,25 @@ int kvm_vcpu_set_target(struct kvm_vcpu *vcpu, return kvm_reset_vcpu(vcpu); } +int kvm_vcpu_preferred_target(struct kvm_vcpu_init *init) +{
- int target = kvm_target_cpu();
- if (target < 0)
return target;
- memset(init, 0, sizeof(*init));
- /* For now, we return all optional features are available
kernel coding style requires wings for comments
* for preferred target. In future, we might have features
* available based on underlying host.
*/
- init->target = (__u32)target;
- init->features[0] |= (1 << KVM_ARM_VCPU_POWER_OFF);
- return 0;
+}
int kvm_arch_vcpu_ioctl_get_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu) { return -EINVAL; diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h index f318c43..b609db3 100644 --- a/arch/arm64/include/asm/kvm_host.h +++ b/arch/arm64/include/asm/kvm_host.h @@ -156,6 +156,7 @@ struct kvm_vcpu_stat { struct kvm_vcpu_init; int kvm_vcpu_set_target(struct kvm_vcpu *vcpu, const struct kvm_vcpu_init *init); +int kvm_vcpu_preferred_target(struct kvm_vcpu_init *init); unsigned long kvm_arm_num_regs(struct kvm_vcpu *vcpu); int kvm_arm_copy_reg_indices(struct kvm_vcpu *vcpu, u64 __user *indices); struct kvm_one_reg; -- 1.7.9.5
This patch implements kvm_vcpu_preferred_target() function for KVM ARM64 which will help us implement KVM_ARM_PREFERRED_TARGET ioctl for user space.
Signed-off-by: Anup Patel anup.patel@linaro.org Signed-off-by: Pranavkumar Sawargaonkar pranavkumar@linaro.org --- arch/arm/include/asm/kvm_host.h | 1 + arch/arm64/kvm/guest.c | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+)
diff --git a/arch/arm/include/asm/kvm_host.h b/arch/arm/include/asm/kvm_host.h index 7d22517..76f3c19 100644 --- a/arch/arm/include/asm/kvm_host.h +++ b/arch/arm/include/asm/kvm_host.h @@ -154,6 +154,7 @@ struct kvm_vcpu_stat { struct kvm_vcpu_init; int kvm_vcpu_set_target(struct kvm_vcpu *vcpu, const struct kvm_vcpu_init *init); +int kvm_vcpu_preferred_target(struct kvm_vcpu_init *init); unsigned long kvm_arm_num_regs(struct kvm_vcpu *vcpu); int kvm_arm_copy_reg_indices(struct kvm_vcpu *vcpu, u64 __user *indices); struct kvm_one_reg; diff --git a/arch/arm64/kvm/guest.c b/arch/arm64/kvm/guest.c index d7bf7d6..f8eb062 100644 --- a/arch/arm64/kvm/guest.c +++ b/arch/arm64/kvm/guest.c @@ -254,6 +254,26 @@ int kvm_vcpu_set_target(struct kvm_vcpu *vcpu, return kvm_reset_vcpu(vcpu); }
+int kvm_vcpu_preferred_target(struct kvm_vcpu_init *init) +{ + int target = kvm_target_cpu(); + + if (target < 0) + return target; + + memset(init, 0, sizeof(*init)); + + /* For now, we return all optional features are available + * for preferred target. In future, we might have features + * available based on underlying host. + */ + init->target = (__u32)target; + init->features[0] |= (1 << KVM_ARM_VCPU_POWER_OFF); + init->features[0] |= (1 << KVM_ARM_VCPU_EL1_32BIT); + + return 0; +} + int kvm_arch_vcpu_ioctl_get_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu) { return -EINVAL;
On Sat, Sep 14, 2013 at 04:38:35PM +0530, Anup Patel wrote:
This patch implements kvm_vcpu_preferred_target() function for KVM ARM64 which will help us implement KVM_ARM_PREFERRED_TARGET ioctl for user space.
Signed-off-by: Anup Patel anup.patel@linaro.org Signed-off-by: Pranavkumar Sawargaonkar pranavkumar@linaro.org
arch/arm/include/asm/kvm_host.h | 1 + arch/arm64/kvm/guest.c | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+)
diff --git a/arch/arm/include/asm/kvm_host.h b/arch/arm/include/asm/kvm_host.h index 7d22517..76f3c19 100644 --- a/arch/arm/include/asm/kvm_host.h +++ b/arch/arm/include/asm/kvm_host.h @@ -154,6 +154,7 @@ struct kvm_vcpu_stat { struct kvm_vcpu_init; int kvm_vcpu_set_target(struct kvm_vcpu *vcpu, const struct kvm_vcpu_init *init); +int kvm_vcpu_preferred_target(struct kvm_vcpu_init *init); unsigned long kvm_arm_num_regs(struct kvm_vcpu *vcpu); int kvm_arm_copy_reg_indices(struct kvm_vcpu *vcpu, u64 __user *indices); struct kvm_one_reg; diff --git a/arch/arm64/kvm/guest.c b/arch/arm64/kvm/guest.c index d7bf7d6..f8eb062 100644 --- a/arch/arm64/kvm/guest.c +++ b/arch/arm64/kvm/guest.c @@ -254,6 +254,26 @@ int kvm_vcpu_set_target(struct kvm_vcpu *vcpu, return kvm_reset_vcpu(vcpu); } +int kvm_vcpu_preferred_target(struct kvm_vcpu_init *init) +{
- int target = kvm_target_cpu();
- if (target < 0)
return target;
- memset(init, 0, sizeof(*init));
- /* For now, we return all optional features are available
* for preferred target. In future, we might have features
* available based on underlying host.
*/
same here, with comment formatting
- init->target = (__u32)target;
- init->features[0] |= (1 << KVM_ARM_VCPU_POWER_OFF);
- init->features[0] |= (1 << KVM_ARM_VCPU_EL1_32BIT);
- return 0;
+}
int kvm_arch_vcpu_ioctl_get_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu) { return -EINVAL; -- 1.7.9.5
For implementing CPU=host, we need a mechanism for querying preferred VCPU target type on underlying Host.
This patch implements KVM_ARM_PREFERRED_TARGET ioctl which return struct kvm_vcpu_init instance to user space for KVM ARM and KVM ARM64 containing information about preferred VCPU target type and optional VCPU features available for it.
Signed-off-by: Anup Patel anup.patel@linaro.org Signed-off-by: Pranavkumar Sawargaonkar pranavkumar@linaro.org --- arch/arm/kvm/arm.c | 12 ++++++++++++ include/uapi/linux/kvm.h | 1 + 2 files changed, 13 insertions(+)
diff --git a/arch/arm/kvm/arm.c b/arch/arm/kvm/arm.c index 9c697db..192212c 100644 --- a/arch/arm/kvm/arm.c +++ b/arch/arm/kvm/arm.c @@ -713,7 +713,19 @@ long kvm_arch_vcpu_ioctl(struct file *filp, return -EFAULT;
return kvm_vcpu_set_target(vcpu, &init); + } + case KVM_ARM_PREFERRED_TARGET: { + int err; + struct kvm_vcpu_init init; + + err = kvm_vcpu_preferred_target(&init); + if (err) + return err;
+ if (copy_to_user(argp, &init, sizeof(init))) + return -EFAULT; + + return 0; } case KVM_SET_ONE_REG: case KVM_GET_ONE_REG: { diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h index 99c2533..e32e776 100644 --- a/include/uapi/linux/kvm.h +++ b/include/uapi/linux/kvm.h @@ -1012,6 +1012,7 @@ struct kvm_s390_ucas_mapping { /* VM is being stopped by host */ #define KVM_KVMCLOCK_CTRL _IO(KVMIO, 0xad) #define KVM_ARM_VCPU_INIT _IOW(KVMIO, 0xae, struct kvm_vcpu_init) +#define KVM_ARM_PREFERRED_TARGET _IOR(KVMIO, 0xaf, struct kvm_vcpu_init) #define KVM_GET_REG_LIST _IOWR(KVMIO, 0xb0, struct kvm_reg_list)
#define KVM_DEV_ASSIGN_ENABLE_IOMMU (1 << 0)
To implement CPU=Host we have added KVM_ARM_PREFERRED_TARGET ioctl which provides information to user space required for creating VCPU matching underlying Host.
This patch adds info related to this new KVM_ARM_PREFERRED_TARGET ioctl in the KVM API documentation.
Signed-off-by: Anup Patel anup.patel@linaro.org Signed-off-by: Pranavkumar Sawargaonkar pranavkumar@linaro.org --- Documentation/virtual/kvm/api.txt | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-)
diff --git a/Documentation/virtual/kvm/api.txt b/Documentation/virtual/kvm/api.txt index ef925ea..85f8026 100644 --- a/Documentation/virtual/kvm/api.txt +++ b/Documentation/virtual/kvm/api.txt @@ -2303,8 +2303,27 @@ Possible features: - KVM_ARM_VCPU_EL1_32BIT: Starts the CPU in a 32bit mode. Depends on KVM_CAP_ARM_EL1_32BIT (arm64 only).
+4.83 KVM_ARM_PREFERRED_TARGET
-4.83 KVM_GET_REG_LIST +Capability: basic +Architectures: arm, arm64 +Type: vcpu ioctl +Parameters: struct struct kvm_vcpu_init (out) +Returns: 0 on success; -1 on error +Errors: + EINVAL: no preferred target available for the host + +This queries KVM for preferred CPU target type which can be emulated +by KVM on underlying host. + +The ioctl returns struct kvm_vcpu_init instance containing information +about preferred CPU target type and optional features available for it. + +The information returned by this ioctl can be used to prepare instance +of struct kvm_vcpu_init for KVM_ARM_VCPU_INIT ioctl which will result +in VCPU matching underlying host. + +4.84 KVM_GET_REG_LIST
Capability: basic Architectures: arm, arm64 @@ -2323,8 +2342,7 @@ struct kvm_reg_list { This ioctl returns the guest registers that are supported for the KVM_GET_ONE_REG/KVM_SET_ONE_REG calls.
- -4.84 KVM_ARM_SET_DEVICE_ADDR +4.85 KVM_ARM_SET_DEVICE_ADDR
Capability: KVM_CAP_ARM_SET_DEVICE_ADDR Architectures: arm, arm64 @@ -2362,7 +2380,7 @@ must be called after calling KVM_CREATE_IRQCHIP, but before calling KVM_RUN on any of the VCPUs. Calling this ioctl twice for any of the base addresses will return -EEXIST.
-4.85 KVM_PPC_RTAS_DEFINE_TOKEN +4.86 KVM_PPC_RTAS_DEFINE_TOKEN
Capability: KVM_CAP_PPC_RTAS Architectures: ppc
On Sat, Sep 14, 2013 at 04:38:37PM +0530, Anup Patel wrote:
To implement CPU=Host we have added KVM_ARM_PREFERRED_TARGET ioctl which provides information to user space required for creating VCPU matching underlying Host.
This patch adds info related to this new KVM_ARM_PREFERRED_TARGET ioctl in the KVM API documentation.
Signed-off-by: Anup Patel anup.patel@linaro.org Signed-off-by: Pranavkumar Sawargaonkar pranavkumar@linaro.org
Documentation/virtual/kvm/api.txt | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-)
diff --git a/Documentation/virtual/kvm/api.txt b/Documentation/virtual/kvm/api.txt index ef925ea..85f8026 100644 --- a/Documentation/virtual/kvm/api.txt +++ b/Documentation/virtual/kvm/api.txt @@ -2303,8 +2303,27 @@ Possible features:
- KVM_ARM_VCPU_EL1_32BIT: Starts the CPU in a 32bit mode. Depends on KVM_CAP_ARM_EL1_32BIT (arm64 only).
+4.83 KVM_ARM_PREFERRED_TARGET -4.83 KVM_GET_REG_LIST +Capability: basic +Architectures: arm, arm64 +Type: vcpu ioctl +Parameters: struct struct kvm_vcpu_init (out) +Returns: 0 on success; -1 on error +Errors:
- EINVAL: no preferred target available for the host
+This queries KVM for preferred CPU target type which can be emulated +by KVM on underlying host.
+The ioctl returns struct kvm_vcpu_init instance containing information +about preferred CPU target type and optional features available for it.
+The information returned by this ioctl can be used to prepare instance +of struct kvm_vcpu_init for KVM_ARM_VCPU_INIT ioctl which will result +in VCPU matching underlying host.
nit: you have some trailing white space here
+4.84 KVM_GET_REG_LIST Capability: basic Architectures: arm, arm64 @@ -2323,8 +2342,7 @@ struct kvm_reg_list { This ioctl returns the guest registers that are supported for the KVM_GET_ONE_REG/KVM_SET_ONE_REG calls.
-4.84 KVM_ARM_SET_DEVICE_ADDR +4.85 KVM_ARM_SET_DEVICE_ADDR Capability: KVM_CAP_ARM_SET_DEVICE_ADDR Architectures: arm, arm64 @@ -2362,7 +2380,7 @@ must be called after calling KVM_CREATE_IRQCHIP, but before calling KVM_RUN on any of the VCPUs. Calling this ioctl twice for any of the base addresses will return -EEXIST. -4.85 KVM_PPC_RTAS_DEFINE_TOKEN +4.86 KVM_PPC_RTAS_DEFINE_TOKEN Capability: KVM_CAP_PPC_RTAS Architectures: ppc -- 1.7.9.5
On Sat, Sep 14, 2013 at 4:38 PM, Anup Patel anup.patel@linaro.org wrote:
It will be very useful for user space if it has a method of querying VCPU target type matching to underlying Host. We can use such querying mechanism and implement machine models in user space where VCPU target type is always same-as/similar-to underlying Host (i.e. Target CPU=Host).
This patch series implements KVM_ARM_PREFERRED_TARGET ioclt for querying VCPU target type matching underlying host. Using this new ioctl we can implement VCPU target CPU=Host in user space (i.e. QEMU/KVMTOOL).
Also, it is not mandatory to call KVM_ARM_PREFERRED_TARGET ioctl and the old method of trying all possible target types using KVM_ARM_VCPU_INIT ioctl to initialize VCPU works fine.
Anup Patel (4): ARM: KVM: Implement kvm_vcpu_preferred_target() function ARM64: KVM: Implement kvm_vcpu_preferred_target() function ARM/ARM64: KVM: Implement KVM_ARM_PREFERRED_TARGET ioctl KVM: Add documentation for KVM_ARM_PREFERRED_TARGET ioctl
Documentation/virtual/kvm/api.txt | 26 ++++++++++++++++++++++---- arch/arm/include/asm/kvm_host.h | 1 + arch/arm/kvm/arm.c | 12 ++++++++++++ arch/arm/kvm/guest.c | 19 +++++++++++++++++++ arch/arm64/include/asm/kvm_host.h | 1 + arch/arm64/kvm/guest.c | 20 ++++++++++++++++++++ include/uapi/linux/kvm.h | 1 + 7 files changed, 76 insertions(+), 4 deletions(-)
-- 1.7.9.5
kvmarm mailing list kvmarm@lists.cs.columbia.edu https://lists.cs.columbia.edu/cucslists/listinfo/kvmarm
Hi Christoffer,
I forgot to address two of your comments in this patch-series: 1. Make the IOCTL as VM IOCTL 2. Return ENODEV instead of EINVAL from IOCTL.
I will take care of the above in v3.
Regards, Anup
On Sat, Sep 14, 2013 at 05:07:17PM +0530, Anup Patel wrote:
On Sat, Sep 14, 2013 at 4:38 PM, Anup Patel anup.patel@linaro.org wrote:
It will be very useful for user space if it has a method of querying VCPU target type matching to underlying Host. We can use such querying mechanism and implement machine models in user space where VCPU target type is always same-as/similar-to underlying Host (i.e. Target CPU=Host).
This patch series implements KVM_ARM_PREFERRED_TARGET ioclt for querying VCPU target type matching underlying host. Using this new ioctl we can implement VCPU target CPU=Host in user space (i.e. QEMU/KVMTOOL).
Also, it is not mandatory to call KVM_ARM_PREFERRED_TARGET ioctl and the old method of trying all possible target types using KVM_ARM_VCPU_INIT ioctl to initialize VCPU works fine.
Anup Patel (4): ARM: KVM: Implement kvm_vcpu_preferred_target() function ARM64: KVM: Implement kvm_vcpu_preferred_target() function ARM/ARM64: KVM: Implement KVM_ARM_PREFERRED_TARGET ioctl KVM: Add documentation for KVM_ARM_PREFERRED_TARGET ioctl
Documentation/virtual/kvm/api.txt | 26 ++++++++++++++++++++++---- arch/arm/include/asm/kvm_host.h | 1 + arch/arm/kvm/arm.c | 12 ++++++++++++ arch/arm/kvm/guest.c | 19 +++++++++++++++++++ arch/arm64/include/asm/kvm_host.h | 1 + arch/arm64/kvm/guest.c | 20 ++++++++++++++++++++ include/uapi/linux/kvm.h | 1 + 7 files changed, 76 insertions(+), 4 deletions(-)
-- 1.7.9.5
kvmarm mailing list kvmarm@lists.cs.columbia.edu https://lists.cs.columbia.edu/cucslists/listinfo/kvmarm
Hi Christoffer,
I forgot to address two of your comments in this patch-series:
- Make the IOCTL as VM IOCTL
- Return ENODEV instead of EINVAL from IOCTL.
I will take care of the above in v3.
No worries, sorry for the delay in reviewing.
I'm wondering if we should actually make the ioctl a system ioctl instead of a kvm ioctl so user space can just query the system about the preferred target without having to create any KVM data structures. Unless there's some problem with creating new system ioctls. Anyone?
Assuming you take care of the above then this looks good!
Thanks, -Christoffer
linaro-kernel@lists.linaro.org