linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v5 0/4] Target CPU=Host implementation for KVM ARM/ARM64
@ 2013-09-30  8:50 Anup Patel
  2013-09-30  8:50 ` [PATCH v5 1/4] ARM: KVM: Implement kvm_vcpu_preferred_target() function Anup Patel
                   ` (4 more replies)
  0 siblings, 5 replies; 8+ messages in thread
From: Anup Patel @ 2013-09-30  8:50 UTC (permalink / raw)
  To: linux-arm-kernel

It will be very useful for user space (QEMU/KVMTOOL) 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 vm ioclt for
querying VCPU target type matching underlying host. Using this new
ioctl we can implement VCPU target CPU=Host in user space.

Also, it is not mandatory to call KVM_ARM_PREFERRED_TARGET vm ioctl
and the old method of trying all possible target types using the
KVM_ARM_VCPU_INIT ioctl to initialize VCPU works fine.

V5:
 - Update documentation based on review comments

V4:
 - Fixed files exchanged between patches
 - For now return zeroed features in struct kvm_vcpu_init instance

V3:
 - Return -ENODEV if no preferred target available for host
 - Make KVM_ARM_PREFERRED_TARGET ioctl as vm ioctl

V2:
 - Renamed the ioclt to KVM_ARM_PREFERRED_TARGET
 - Return struct kvm_vcpu_init instace instead of just target type

V1:
 - Initial patch-set with ioctl named as KVM_ARM_SUITABLE_TARGET

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 |   31 +++++++++++++++++++++++++++----
 arch/arm/include/asm/kvm_host.h   |    1 +
 arch/arm/kvm/arm.c                |   13 +++++++++++++
 arch/arm/kvm/guest.c              |   20 ++++++++++++++++++++
 arch/arm64/include/asm/kvm_host.h |    1 +
 arch/arm64/kvm/guest.c            |   20 ++++++++++++++++++++
 include/uapi/linux/kvm.h          |    1 +
 7 files changed, 83 insertions(+), 4 deletions(-)

-- 
1.7.9.5

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH v5 1/4] ARM: KVM: Implement kvm_vcpu_preferred_target() function
  2013-09-30  8:50 [PATCH v5 0/4] Target CPU=Host implementation for KVM ARM/ARM64 Anup Patel
@ 2013-09-30  8:50 ` Anup Patel
  2013-09-30  8:50 ` [PATCH v5 2/4] ARM64: " Anup Patel
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 8+ messages in thread
From: Anup Patel @ 2013-09-30  8:50 UTC (permalink / raw)
  To: linux-arm-kernel

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/include/asm/kvm_host.h |    1 +
 arch/arm/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/arm/kvm/guest.c b/arch/arm/kvm/guest.c
index 152d036..21beea0 100644
--- a/arch/arm/kvm/guest.c
+++ b/arch/arm/kvm/guest.c
@@ -222,6 +222,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 -ENODEV;
+
+	memset(init, 0, sizeof(*init));
+
+	/* 
+	 * For now, we don't return any features.
+	 * In future, we might use features to return target
+	 * specific features available for the preferred
+	 * target type.
+	 */
+	init->target = (__u32)target;
+
+	return 0;
+}
+
 int kvm_arch_vcpu_ioctl_get_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu)
 {
 	return -EINVAL;
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH v5 2/4] ARM64: KVM: Implement kvm_vcpu_preferred_target() function
  2013-09-30  8:50 [PATCH v5 0/4] Target CPU=Host implementation for KVM ARM/ARM64 Anup Patel
  2013-09-30  8:50 ` [PATCH v5 1/4] ARM: KVM: Implement kvm_vcpu_preferred_target() function Anup Patel
@ 2013-09-30  8:50 ` Anup Patel
  2013-09-30  8:50 ` [PATCH v5 3/4] ARM/ARM64: KVM: Implement KVM_ARM_PREFERRED_TARGET ioctl Anup Patel
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 8+ messages in thread
From: Anup Patel @ 2013-09-30  8:50 UTC (permalink / raw)
  To: linux-arm-kernel

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/arm64/include/asm/kvm_host.h |    1 +
 arch/arm64/kvm/guest.c            |   20 ++++++++++++++++++++
 2 files changed, 21 insertions(+)

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;
diff --git a/arch/arm64/kvm/guest.c b/arch/arm64/kvm/guest.c
index d7bf7d6..94e4b7a 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 -ENODEV;
+
+	memset(init, 0, sizeof(*init));
+
+	/* 
+	 * For now, we don't return any features.
+	 * In future, we might use features to return target
+	 * specific features available for the preferred
+	 * target type.
+	 */
+	init->target = (__u32)target;
+
+	return 0;
+}
+
 int kvm_arch_vcpu_ioctl_get_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu)
 {
 	return -EINVAL;
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH v5 3/4] ARM/ARM64: KVM: Implement KVM_ARM_PREFERRED_TARGET ioctl
  2013-09-30  8:50 [PATCH v5 0/4] Target CPU=Host implementation for KVM ARM/ARM64 Anup Patel
  2013-09-30  8:50 ` [PATCH v5 1/4] ARM: KVM: Implement kvm_vcpu_preferred_target() function Anup Patel
  2013-09-30  8:50 ` [PATCH v5 2/4] ARM64: " Anup Patel
@ 2013-09-30  8:50 ` Anup Patel
  2013-09-30  8:50 ` [PATCH v5 4/4] KVM: Add documentation for " Anup Patel
  2013-10-02 16:04 ` [PATCH v5 0/4] Target CPU=Host implementation for KVM ARM/ARM64 Christoffer Dall
  4 siblings, 0 replies; 8+ messages in thread
From: Anup Patel @ 2013-09-30  8:50 UTC (permalink / raw)
  To: linux-arm-kernel

For implementing CPU=host, we need a mechanism for querying
preferred VCPU target type on underlying Host.

This patch implements KVM_ARM_PREFERRED_TARGET vm ioctl which
returns struct kvm_vcpu_init instance containing information
about preferred VCPU target type and target specific 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       |   13 +++++++++++++
 include/uapi/linux/kvm.h |    1 +
 2 files changed, 14 insertions(+)

diff --git a/arch/arm/kvm/arm.c b/arch/arm/kvm/arm.c
index 9c697db..cc5adb9 100644
--- a/arch/arm/kvm/arm.c
+++ b/arch/arm/kvm/arm.c
@@ -797,6 +797,19 @@ long kvm_arch_vm_ioctl(struct file *filp,
 			return -EFAULT;
 		return kvm_vm_ioctl_set_device_addr(kvm, &dev_addr);
 	}
+	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;
+	}
 	default:
 		return -EINVAL;
 	}
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)
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH v5 4/4] KVM: Add documentation for KVM_ARM_PREFERRED_TARGET ioctl
  2013-09-30  8:50 [PATCH v5 0/4] Target CPU=Host implementation for KVM ARM/ARM64 Anup Patel
                   ` (2 preceding siblings ...)
  2013-09-30  8:50 ` [PATCH v5 3/4] ARM/ARM64: KVM: Implement KVM_ARM_PREFERRED_TARGET ioctl Anup Patel
@ 2013-09-30  8:50 ` Anup Patel
  2013-10-02 16:04 ` [PATCH v5 0/4] Target CPU=Host implementation for KVM ARM/ARM64 Christoffer Dall
  4 siblings, 0 replies; 8+ messages in thread
From: Anup Patel @ 2013-09-30  8:50 UTC (permalink / raw)
  To: linux-arm-kernel

To implement CPU=Host we have added KVM_ARM_PREFERRED_TARGET
vm 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
vm 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 |   31 +++++++++++++++++++++++++++----
 1 file changed, 27 insertions(+), 4 deletions(-)

diff --git a/Documentation/virtual/kvm/api.txt b/Documentation/virtual/kvm/api.txt
index 858aecf..076b849 100644
--- a/Documentation/virtual/kvm/api.txt
+++ b/Documentation/virtual/kvm/api.txt
@@ -2304,7 +2304,31 @@ Possible features:
 	  Depends on KVM_CAP_ARM_EL1_32BIT (arm64 only).
 
 
-4.83 KVM_GET_REG_LIST
+4.83 KVM_ARM_PREFERRED_TARGET
+
+Capability: basic
+Architectures: arm, arm64
+Type: vm ioctl
+Parameters: struct struct kvm_vcpu_init (out)
+Returns: 0 on success; -1 on error
+Errors:
+ ?ENODEV: ???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 recommended features for it.  The
+kvm_vcpu_init->features bitmap returned will have feature bits set if
+the preferred target recommends setting these features, but this is
+not mandatory.
+
+The information returned by this ioctl can be used to prepare an instance
+of struct kvm_vcpu_init for KVM_ARM_VCPU_INIT ioctl which will result in
+in VCPU matching underlying host.
+
+
+4.84 KVM_GET_REG_LIST
 
 Capability: basic
 Architectures: arm, arm64
@@ -2323,8 +2347,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 +2385,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

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH v5 0/4] Target CPU=Host implementation for KVM ARM/ARM64
  2013-09-30  8:50 [PATCH v5 0/4] Target CPU=Host implementation for KVM ARM/ARM64 Anup Patel
                   ` (3 preceding siblings ...)
  2013-09-30  8:50 ` [PATCH v5 4/4] KVM: Add documentation for " Anup Patel
@ 2013-10-02 16:04 ` Christoffer Dall
  2013-10-02 16:17   ` Marc Zyngier
  4 siblings, 1 reply; 8+ messages in thread
From: Christoffer Dall @ 2013-10-02 16:04 UTC (permalink / raw)
  To: linux-arm-kernel

On Mon, Sep 30, 2013 at 02:20:04PM +0530, Anup Patel wrote:
> It will be very useful for user space (QEMU/KVMTOOL) 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 vm ioclt for
> querying VCPU target type matching underlying host. Using this new
> ioctl we can implement VCPU target CPU=Host in user space.
> 
> Also, it is not mandatory to call KVM_ARM_PREFERRED_TARGET vm ioctl
> and the old method of trying all possible target types using the
> KVM_ARM_VCPU_INIT ioctl to initialize VCPU works fine.
> 
Looks good to me, as soon as Marc acks this one, I'll merge it.

-Christoffer

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH v5 0/4] Target CPU=Host implementation for KVM ARM/ARM64
  2013-10-02 16:04 ` [PATCH v5 0/4] Target CPU=Host implementation for KVM ARM/ARM64 Christoffer Dall
@ 2013-10-02 16:17   ` Marc Zyngier
  2013-10-02 18:32     ` Christoffer Dall
  0 siblings, 1 reply; 8+ messages in thread
From: Marc Zyngier @ 2013-10-02 16:17 UTC (permalink / raw)
  To: linux-arm-kernel

On 02/10/13 17:04, Christoffer Dall wrote:
> On Mon, Sep 30, 2013 at 02:20:04PM +0530, Anup Patel wrote:
>> It will be very useful for user space (QEMU/KVMTOOL) 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 vm ioclt for
>> querying VCPU target type matching underlying host. Using this new
>> ioctl we can implement VCPU target CPU=Host in user space.
>>
>> Also, it is not mandatory to call KVM_ARM_PREFERRED_TARGET vm ioctl
>> and the old method of trying all possible target types using the
>> KVM_ARM_VCPU_INIT ioctl to initialize VCPU works fine.
>>
> Looks good to me, as soon as Marc acks this one, I'll merge it.

Yup, go for it:

Acked-by: Marc Zyngier <marc.zyngier@arm.com>

	M.
-- 
Jazz is not dead. It just smells funny...

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH v5 0/4] Target CPU=Host implementation for KVM ARM/ARM64
  2013-10-02 16:17   ` Marc Zyngier
@ 2013-10-02 18:32     ` Christoffer Dall
  0 siblings, 0 replies; 8+ messages in thread
From: Christoffer Dall @ 2013-10-02 18:32 UTC (permalink / raw)
  To: linux-arm-kernel

On Wed, Oct 02, 2013 at 05:17:41PM +0100, Marc Zyngier wrote:
> On 02/10/13 17:04, Christoffer Dall wrote:
> > On Mon, Sep 30, 2013 at 02:20:04PM +0530, Anup Patel wrote:
> >> It will be very useful for user space (QEMU/KVMTOOL) 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 vm ioclt for
> >> querying VCPU target type matching underlying host. Using this new
> >> ioctl we can implement VCPU target CPU=Host in user space.
> >>
> >> Also, it is not mandatory to call KVM_ARM_PREFERRED_TARGET vm ioctl
> >> and the old method of trying all possible target types using the
> >> KVM_ARM_VCPU_INIT ioctl to initialize VCPU works fine.
> >>
> > Looks good to me, as soon as Marc acks this one, I'll merge it.
> 
> Yup, go for it:
> 
> Acked-by: Marc Zyngier <marc.zyngier@arm.com>
> 
Cool, merged in kvm-arm-next, tested with changes to experimental qemu
mach-virt patches on vexpress TC2.

-Christoffer

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2013-10-02 18:32 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-09-30  8:50 [PATCH v5 0/4] Target CPU=Host implementation for KVM ARM/ARM64 Anup Patel
2013-09-30  8:50 ` [PATCH v5 1/4] ARM: KVM: Implement kvm_vcpu_preferred_target() function Anup Patel
2013-09-30  8:50 ` [PATCH v5 2/4] ARM64: " Anup Patel
2013-09-30  8:50 ` [PATCH v5 3/4] ARM/ARM64: KVM: Implement KVM_ARM_PREFERRED_TARGET ioctl Anup Patel
2013-09-30  8:50 ` [PATCH v5 4/4] KVM: Add documentation for " Anup Patel
2013-10-02 16:04 ` [PATCH v5 0/4] Target CPU=Host implementation for KVM ARM/ARM64 Christoffer Dall
2013-10-02 16:17   ` Marc Zyngier
2013-10-02 18:32     ` Christoffer Dall

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).