* [patch 01/11] [PATCH] kvm-s390: add parameter for KVM_CREATE_VM
2012-01-04 9:25 [patch 00/11] Ucontrol patchset respin without storage keys Carsten Otte
@ 2012-01-04 9:25 ` Carsten Otte
2012-01-04 9:25 ` [patch 02/11] [PATCH] kvm-s390-ucontrol: per vcpu address spaces Carsten Otte
` (12 subsequent siblings)
13 siblings, 0 replies; 22+ messages in thread
From: Carsten Otte @ 2012-01-04 9:25 UTC (permalink / raw)
To: Avi Kivity, Marcelo Tossati
Cc: Christian Borntraeger, Heiko Carstens, Martin Schwidefsky,
Cornelia Huck, KVM, Joachim von Buttlar, Jens Freimann, agraf,
Xiantao Zhang
[-- Attachment #1: enable-ucontrol.patch --]
[-- Type: text/plain, Size: 7043 bytes --]
This patch introduces a new config option for user controlled kernel
virtual machines. It introduces a parameter to KVM_CREATE_VM that
allows to set bits that alter the capabilities of the newly created
virtual machine.
The parameter is passed to kvm_arch_init_vm for all architectures.
The only valid modifier bit for now is KVM_VM_S390_UCONTROL.
This requires CAP_SYS_ADMIN privileges and creates a user controlled
virtual machine on s390 architectures.
Signed-off-by: Carsten Otte <cotte@de.ibm.com>
---
Documentation/virtual/kvm/api.txt | 7 ++++++-
arch/ia64/kvm/kvm-ia64.c | 5 ++++-
arch/powerpc/kvm/powerpc.c | 5 ++++-
arch/s390/kvm/Kconfig | 9 +++++++++
arch/s390/kvm/kvm-s390.c | 24 +++++++++++++++++++-----
arch/s390/kvm/kvm-s390.h | 10 ++++++++++
arch/x86/kvm/x86.c | 5 ++++-
include/linux/kvm.h | 3 +++
include/linux/kvm_host.h | 2 +-
virt/kvm/kvm_main.c | 13 +++++--------
10 files changed, 65 insertions(+), 18 deletions(-)
--- a/Documentation/virtual/kvm/api.txt
+++ b/Documentation/virtual/kvm/api.txt
@@ -95,7 +95,7 @@ described as 'basic' will be available.
Capability: basic
Architectures: all
Type: system ioctl
-Parameters: none
+Parameters: machine type identifier (KVM_VM_*)
Returns: a VM fd that can be used to control the new virtual machine.
The new VM has no virtual cpus and no memory. An mmap() of a VM fd
@@ -103,6 +103,11 @@ will access the virtual machine's physic
corresponds to guest physical address zero. Use of mmap() on a VM fd
is discouraged if userspace memory allocation (KVM_CAP_USER_MEMORY) is
available.
+You most certainly want to use 0 as machine type.
+
+In order to create user controlled virtual machines on S390, check
+KVM_CAP_S390_UCONTROL and use the flag KVM_VM_S390_UCONTROL as
+privileged user (CAP_SYS_ADMIN).
4.3 KVM_GET_MSR_INDEX_LIST
--- a/arch/ia64/kvm/kvm-ia64.c
+++ b/arch/ia64/kvm/kvm-ia64.c
@@ -809,10 +809,13 @@ static void kvm_build_io_pmt(struct kvm
#define GUEST_PHYSICAL_RR4 0x2739
#define VMM_INIT_RR 0x1660
-int kvm_arch_init_vm(struct kvm *kvm)
+int kvm_arch_init_vm(struct kvm *kvm, unsigned long type)
{
BUG_ON(!kvm);
+ if (type)
+ return -EINVAL;
+
kvm->arch.is_sn2 = ia64_platform_is("sn2");
kvm->arch.metaphysical_rr0 = GUEST_PHYSICAL_RR0;
--- a/arch/powerpc/kvm/powerpc.c
+++ b/arch/powerpc/kvm/powerpc.c
@@ -171,8 +171,11 @@ void kvm_arch_check_processor_compat(voi
*(int *)rtn = kvmppc_core_check_processor_compat();
}
-int kvm_arch_init_vm(struct kvm *kvm)
+int kvm_arch_init_vm(struct kvm *kvm, unsigned long type)
{
+ if (type)
+ return -EINVAL;
+
return kvmppc_core_init_vm(kvm);
}
--- a/arch/s390/kvm/Kconfig
+++ b/arch/s390/kvm/Kconfig
@@ -34,6 +34,15 @@ config KVM
If unsure, say N.
+config KVM_S390_UCONTROL
+ bool "Userspace controlled virtual machines"
+ depends on KVM
+ ---help---
+ Allow CAP_SYS_ADMIN users to create KVM virtual machines that are
+ controlled by userspace.
+
+ If unsure, say N.
+
# OK, it's a little counter-intuitive to do this, but it puts it neatly under
# the virtualization menu.
source drivers/vhost/Kconfig
--- a/arch/s390/kvm/kvm-s390.c
+++ b/arch/s390/kvm/kvm-s390.c
@@ -171,11 +171,22 @@ long kvm_arch_vm_ioctl(struct file *filp
return r;
}
-int kvm_arch_init_vm(struct kvm *kvm)
+int kvm_arch_init_vm(struct kvm *kvm, unsigned long type)
{
int rc;
char debug_name[16];
+ rc = -EINVAL;
+#ifdef CONFIG_KVM_S390_UCONTROL
+ if (type & ~KVM_VM_S390_UCONTROL)
+ goto out_err;
+ if ((type & KVM_VM_S390_UCONTROL) && (!capable(CAP_SYS_ADMIN)))
+ goto out_err;
+#else
+ if (type)
+ goto out_err;
+#endif
+
rc = s390_enable_sie();
if (rc)
goto out_err;
@@ -198,10 +209,13 @@ int kvm_arch_init_vm(struct kvm *kvm)
debug_register_view(kvm->arch.dbf, &debug_sprintf_view);
VM_EVENT(kvm, 3, "%s", "vm created");
- kvm->arch.gmap = gmap_alloc(current->mm);
- if (!kvm->arch.gmap)
- goto out_nogmap;
-
+ if (type & KVM_VM_S390_UCONTROL) {
+ kvm->arch.gmap = NULL;
+ } else {
+ kvm->arch.gmap = gmap_alloc(current->mm);
+ if (!kvm->arch.gmap)
+ goto out_nogmap;
+ }
return 0;
out_nogmap:
debug_unregister(kvm->arch.dbf);
--- a/arch/s390/kvm/kvm-s390.h
+++ b/arch/s390/kvm/kvm-s390.h
@@ -47,6 +47,16 @@ static inline int __cpu_is_stopped(struc
return atomic_read(&vcpu->arch.sie_block->cpuflags) & CPUSTAT_STOP_INT;
}
+static inline int kvm_is_ucontrol(struct kvm *kvm)
+{
+#ifdef CONFIG_KVM_S390_UCONTROL
+ if (kvm->arch.gmap)
+ return 0;
+ return 1;
+#else
+ return 0;
+#endif
+}
int kvm_s390_handle_wait(struct kvm_vcpu *vcpu);
enum hrtimer_restart kvm_s390_idle_wakeup(struct hrtimer *timer);
void kvm_s390_tasklet(unsigned long parm);
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -5986,8 +5986,11 @@ void kvm_arch_vcpu_uninit(struct kvm_vcp
free_page((unsigned long)vcpu->arch.pio_data);
}
-int kvm_arch_init_vm(struct kvm *kvm)
+int kvm_arch_init_vm(struct kvm *kvm, unsigned long type)
{
+ if (type)
+ return -EINVAL;
+
INIT_LIST_HEAD(&kvm->arch.active_mmu_pages);
INIT_LIST_HEAD(&kvm->arch.assigned_dev_head);
--- a/include/linux/kvm.h
+++ b/include/linux/kvm.h
@@ -431,6 +431,9 @@ struct kvm_ppc_pvinfo {
#define KVMIO 0xAE
+/* machine type bits, to be used as argument to KVM_CREATE_VM */
+#define KVM_VM_S390_UCONTROL 1
+
/*
* ioctls for /dev/kvm fds:
*/
--- a/include/linux/kvm_host.h
+++ b/include/linux/kvm_host.h
@@ -520,7 +520,7 @@ static inline void kvm_arch_free_vm(stru
}
#endif
-int kvm_arch_init_vm(struct kvm *kvm);
+int kvm_arch_init_vm(struct kvm *kvm, unsigned long type);
void kvm_arch_destroy_vm(struct kvm *kvm);
void kvm_free_all_assigned_devices(struct kvm *kvm);
void kvm_arch_sync_events(struct kvm *kvm);
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -449,7 +449,7 @@ static void kvm_init_memslots_id(struct
slots->id_to_index[i] = slots->memslots[i].id = i;
}
-static struct kvm *kvm_create_vm(void)
+static struct kvm *kvm_create_vm(unsigned long type)
{
int r, i;
struct kvm *kvm = kvm_arch_alloc_vm();
@@ -457,7 +457,7 @@ static struct kvm *kvm_create_vm(void)
if (!kvm)
return ERR_PTR(-ENOMEM);
- r = kvm_arch_init_vm(kvm);
+ r = kvm_arch_init_vm(kvm, type);
if (r)
goto out_err_nodisable;
@@ -2198,12 +2198,12 @@ static struct file_operations kvm_vm_fop
.llseek = noop_llseek,
};
-static int kvm_dev_ioctl_create_vm(void)
+static int kvm_dev_ioctl_create_vm(unsigned long type)
{
int r;
struct kvm *kvm;
- kvm = kvm_create_vm();
+ kvm = kvm_create_vm(type);
if (IS_ERR(kvm))
return PTR_ERR(kvm);
#ifdef KVM_COALESCED_MMIO_PAGE_OFFSET
@@ -2254,10 +2254,7 @@ static long kvm_dev_ioctl(struct file *f
r = KVM_API_VERSION;
break;
case KVM_CREATE_VM:
- r = -EINVAL;
- if (arg)
- goto out;
- r = kvm_dev_ioctl_create_vm();
+ r = kvm_dev_ioctl_create_vm(arg);
break;
case KVM_CHECK_EXTENSION:
r = kvm_dev_ioctl_check_extension_generic(arg);
^ permalink raw reply [flat|nested] 22+ messages in thread* [patch 02/11] [PATCH] kvm-s390-ucontrol: per vcpu address spaces
2012-01-04 9:25 [patch 00/11] Ucontrol patchset respin without storage keys Carsten Otte
2012-01-04 9:25 ` [patch 01/11] [PATCH] kvm-s390: add parameter for KVM_CREATE_VM Carsten Otte
@ 2012-01-04 9:25 ` Carsten Otte
2012-01-04 9:25 ` [patch 03/11] [PATCH] kvm-s390-ucontrol: export page faults to user Carsten Otte
` (11 subsequent siblings)
13 siblings, 0 replies; 22+ messages in thread
From: Carsten Otte @ 2012-01-04 9:25 UTC (permalink / raw)
To: Avi Kivity, Marcelo Tossati
Cc: Christian Borntraeger, Heiko Carstens, Martin Schwidefsky,
Cornelia Huck, KVM, Joachim von Buttlar, Jens Freimann, agraf
[-- Attachment #1: address-spaces.patch --]
[-- Type: text/plain, Size: 4752 bytes --]
This patch introduces two ioctls for virtual cpus, that are only
valid for kernel virtual machines that are controlled by userspace.
Each virtual cpu has its individual address space in this mode of
operation, and each address space is backed by the gmap
implementation just like the address space for regular KVM guests.
KVM_S390_UCAS_MAP allows to map a part of the user's virtual address
space to the vcpu. Starting offset and length in both the user and
the vcpu address space need to be aligned to 1M.
KVM_S390_UCAS_UNMAP can be used to unmap a range of memory from a
virtual cpu in a similar way.
Signed-off-by: Carsten Otte <cotte@de.ibm.com>
---
---
Documentation/virtual/kvm/api.txt | 38 ++++++++++++++++++++++++++++
arch/s390/kvm/kvm-s390.c | 50 +++++++++++++++++++++++++++++++++++++-
include/linux/kvm.h | 10 +++++++
3 files changed, 97 insertions(+), 1 deletion(-)
--- a/Documentation/virtual/kvm/api.txt
+++ b/Documentation/virtual/kvm/api.txt
@@ -1496,6 +1496,44 @@ following algorithm:
Some guests configure the LINT1 NMI input to cause a panic, aiding in
debugging.
+4.64 KVM_S390_UCAS_MAP
+
+Capability: KVM_CAP_S390_UCONTROL
+Architectures: s390
+Type: vcpu ioctl
+Parameters: struct kvm_s390_ucas_mapping (in)
+Returns: 0 in case of success
+
+The parameter is defined like this:
+ struct kvm_s390_ucas_mapping {
+ __u64 user_addr;
+ __u64 vcpu_addr;
+ __u64 length;
+ };
+
+This ioctl maps the memory at "user_addr" with the length "length" to
+the vcpu's address space starting at "vcpu_addr". All parameters need to
+be alligned by 1 megabyte.
+
+4.65 KVM_S390_UCAS_UNMAP
+
+Capability: KVM_CAP_S390_UCONTROL
+Architectures: s390
+Type: vcpu ioctl
+Parameters: struct kvm_s390_ucas_mapping (in)
+Returns: 0 in case of success
+
+The parameter is defined like this:
+ struct kvm_s390_ucas_mapping {
+ __u64 user_addr;
+ __u64 vcpu_addr;
+ __u64 length;
+ };
+
+This ioctl unmaps the memory in the vcpu's address space starting at
+"vcpu_addr" with the length "length". The field "user_addr" is ignored.
+All parameters need to be alligned by 1 megabyte.
+
5. The kvm_run structure
Application code obtains a pointer to the kvm_run structure by
--- a/arch/s390/kvm/kvm-s390.c
+++ b/arch/s390/kvm/kvm-s390.c
@@ -233,6 +233,10 @@ void kvm_arch_vcpu_destroy(struct kvm_vc
(__u64) vcpu->arch.sie_block)
vcpu->kvm->arch.sca->cpu[vcpu->vcpu_id].sda = 0;
smp_mb();
+
+ if (kvm_is_ucontrol(vcpu->kvm))
+ gmap_free(vcpu->arch.gmap);
+
free_page((unsigned long)(vcpu->arch.sie_block));
kvm_vcpu_uninit(vcpu);
kfree(vcpu);
@@ -263,12 +267,20 @@ void kvm_arch_destroy_vm(struct kvm *kvm
kvm_free_vcpus(kvm);
free_page((unsigned long)(kvm->arch.sca));
debug_unregister(kvm->arch.dbf);
- gmap_free(kvm->arch.gmap);
+ if (!kvm_is_ucontrol(kvm))
+ gmap_free(kvm->arch.gmap);
}
/* Section: vcpu related */
int kvm_arch_vcpu_init(struct kvm_vcpu *vcpu)
{
+ if (kvm_is_ucontrol(vcpu->kvm)) {
+ vcpu->arch.gmap = gmap_alloc(current->mm);
+ if (!vcpu->arch.gmap)
+ return -ENOMEM;
+ return 0;
+ }
+
vcpu->arch.gmap = vcpu->kvm->arch.gmap;
return 0;
}
@@ -687,6 +699,42 @@ long kvm_arch_vcpu_ioctl(struct file *fi
case KVM_S390_INITIAL_RESET:
r = kvm_arch_vcpu_ioctl_initial_reset(vcpu);
break;
+#ifdef CONFIG_KVM_S390_UCONTROL
+ case KVM_S390_UCAS_MAP: {
+ struct kvm_s390_ucas_mapping ucasmap;
+
+ if (copy_from_user(&ucasmap, argp, sizeof(ucasmap))) {
+ r = -EFAULT;
+ break;
+ }
+
+ if (!kvm_is_ucontrol(vcpu->kvm)) {
+ r = -EINVAL;
+ break;
+ }
+
+ r = gmap_map_segment(vcpu->arch.gmap, ucasmap.user_addr,
+ ucasmap.vcpu_addr, ucasmap.length);
+ break;
+ }
+ case KVM_S390_UCAS_UNMAP: {
+ struct kvm_s390_ucas_mapping ucasmap;
+
+ if (copy_from_user(&ucasmap, argp, sizeof(ucasmap))) {
+ r = -EFAULT;
+ break;
+ }
+
+ if (!kvm_is_ucontrol(vcpu->kvm)) {
+ r = -EINVAL;
+ break;
+ }
+
+ r = gmap_unmap_segment(vcpu->arch.gmap, ucasmap.vcpu_addr,
+ ucasmap.length);
+ break;
+ }
+#endif
default:
r = -EINVAL;
}
--- a/include/linux/kvm.h
+++ b/include/linux/kvm.h
@@ -658,6 +658,16 @@ struct kvm_clock_data {
struct kvm_userspace_memory_region)
#define KVM_SET_TSS_ADDR _IO(KVMIO, 0x47)
#define KVM_SET_IDENTITY_MAP_ADDR _IOW(KVMIO, 0x48, __u64)
+
+/* enable ucontrol for s390 */
+struct kvm_s390_ucas_mapping {
+ __u64 user_addr;
+ __u64 vcpu_addr;
+ __u64 length;
+};
+#define KVM_S390_UCAS_MAP _IOW(KVMIO, 0x50, struct kvm_s390_ucas_mapping)
+#define KVM_S390_UCAS_UNMAP _IOW(KVMIO, 0x51, struct kvm_s390_ucas_mapping)
+
/* Device model IOC */
#define KVM_CREATE_IRQCHIP _IO(KVMIO, 0x60)
#define KVM_IRQ_LINE _IOW(KVMIO, 0x61, struct kvm_irq_level)
^ permalink raw reply [flat|nested] 22+ messages in thread* [patch 03/11] [PATCH] kvm-s390-ucontrol: export page faults to user
2012-01-04 9:25 [patch 00/11] Ucontrol patchset respin without storage keys Carsten Otte
2012-01-04 9:25 ` [patch 01/11] [PATCH] kvm-s390: add parameter for KVM_CREATE_VM Carsten Otte
2012-01-04 9:25 ` [patch 02/11] [PATCH] kvm-s390-ucontrol: per vcpu address spaces Carsten Otte
@ 2012-01-04 9:25 ` Carsten Otte
2012-01-04 9:25 ` [patch 04/11] [PATCH] kvm-s390-ucontrol: export SIE control block " Carsten Otte
` (10 subsequent siblings)
13 siblings, 0 replies; 22+ messages in thread
From: Carsten Otte @ 2012-01-04 9:25 UTC (permalink / raw)
To: Avi Kivity, Marcelo Tossati
Cc: Christian Borntraeger, Heiko Carstens, Martin Schwidefsky,
Cornelia Huck, KVM, Joachim von Buttlar, Jens Freimann, agraf
[-- Attachment #1: page-fault-exit.patch --]
[-- Type: text/plain, Size: 4596 bytes --]
This patch introduces a new exit reason in the kvm_run structure
named KVM_EXIT_S390_UCONTROL. This exit indicates, that a virtual cpu
has regognized a fault on the host page table. The idea is that
userspace can handle this fault by mapping memory at the fault
location into the cpu's address space and then continue to run the
virtual cpu.
Signed-off-by: Carsten Otte <cotte@de.ibm.com>
---
---
Documentation/virtual/kvm/api.txt | 14 ++++++++++++++
arch/s390/kvm/kvm-s390.c | 32 +++++++++++++++++++++++++++-----
arch/s390/kvm/kvm-s390.h | 1 +
include/linux/kvm.h | 6 ++++++
4 files changed, 48 insertions(+), 5 deletions(-)
--- a/Documentation/virtual/kvm/api.txt
+++ b/Documentation/virtual/kvm/api.txt
@@ -1694,6 +1694,20 @@ s390 specific.
s390 specific.
+ /* KVM_EXIT_S390_UCONTROL */
+ struct {
+ __u64 trans_exc_code;
+ __u32 pgm_code;
+ } s390_ucontrol;
+
+s390 specific. A page fault has occurred for a user controlled virtual
+machine (KVM_VM_S390_UNCONTROL) on it's host page table that cannot be
+resolved by the kernel.
+The program code and the translation exception code that were placed
+in the cpu's lowcore are presented here as defined by the z Architecture
+Principles of Operation Book in the Chapter for Dynamic Address Translation
+(DAT)
+
/* KVM_EXIT_DCR */
struct {
__u32 dcrn;
--- a/arch/s390/kvm/kvm-s390.c
+++ b/arch/s390/kvm/kvm-s390.c
@@ -493,8 +493,10 @@ int kvm_arch_vcpu_ioctl_set_mpstate(stru
return -EINVAL; /* not implemented yet */
}
-static void __vcpu_run(struct kvm_vcpu *vcpu)
+static int __vcpu_run(struct kvm_vcpu *vcpu)
{
+ int rc;
+
memcpy(&vcpu->arch.sie_block->gg14, &vcpu->arch.guest_gprs[14], 16);
if (need_resched())
@@ -511,9 +513,15 @@ static void __vcpu_run(struct kvm_vcpu *
local_irq_enable();
VCPU_EVENT(vcpu, 6, "entering sie flags %x",
atomic_read(&vcpu->arch.sie_block->cpuflags));
- if (sie64a(vcpu->arch.sie_block, vcpu->arch.guest_gprs)) {
- VCPU_EVENT(vcpu, 3, "%s", "fault in sie instruction");
- kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);
+ rc = sie64a(vcpu->arch.sie_block, vcpu->arch.guest_gprs);
+ if (rc) {
+ if (kvm_is_ucontrol(vcpu->kvm)) {
+ rc = SIE_INTERCEPT_UCONTROL;
+ } else {
+ VCPU_EVENT(vcpu, 3, "%s", "fault in sie instruction");
+ kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);
+ rc = 0;
+ }
}
VCPU_EVENT(vcpu, 6, "exit sie icptcode %d",
vcpu->arch.sie_block->icptcode);
@@ -522,6 +530,7 @@ static void __vcpu_run(struct kvm_vcpu *
local_irq_enable();
memcpy(&vcpu->arch.guest_gprs[14], &vcpu->arch.sie_block->gg14, 16);
+ return rc;
}
int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
@@ -542,6 +551,7 @@ rerun_vcpu:
case KVM_EXIT_UNKNOWN:
case KVM_EXIT_INTR:
case KVM_EXIT_S390_RESET:
+ case KVM_EXIT_S390_UCONTROL:
break;
default:
BUG();
@@ -553,7 +563,9 @@ rerun_vcpu:
might_fault();
do {
- __vcpu_run(vcpu);
+ rc = __vcpu_run(vcpu);
+ if (rc)
+ break;
rc = kvm_handle_sie_intercept(vcpu);
} while (!signal_pending(current) && !rc);
@@ -565,6 +577,16 @@ rerun_vcpu:
rc = -EINTR;
}
+#ifdef CONFIG_KVM_S390_UCONTROL
+ if (rc == SIE_INTERCEPT_UCONTROL) {
+ kvm_run->exit_reason = KVM_EXIT_S390_UCONTROL;
+ kvm_run->s390_ucontrol.trans_exc_code =
+ current->thread.gmap_addr;
+ kvm_run->s390_ucontrol.pgm_code = 0x10;
+ rc = 0;
+ }
+#endif
+
if (rc == -EOPNOTSUPP) {
/* intercept cannot be handled in-kernel, prepare kvm-run */
kvm_run->exit_reason = KVM_EXIT_S390_SIEIC;
--- a/arch/s390/kvm/kvm-s390.h
+++ b/arch/s390/kvm/kvm-s390.h
@@ -26,6 +26,7 @@ typedef int (*intercept_handler_t)(struc
/* negativ values are error codes, positive values for internal conditions */
#define SIE_INTERCEPT_RERUNVCPU (1<<0)
+#define SIE_INTERCEPT_UCONTROL (1<<1)
int kvm_handle_sie_intercept(struct kvm_vcpu *vcpu);
#define VM_EVENT(d_kvm, d_loglevel, d_string, d_args...)\
--- a/include/linux/kvm.h
+++ b/include/linux/kvm.h
@@ -162,6 +162,7 @@ struct kvm_pit_config {
#define KVM_EXIT_INTERNAL_ERROR 17
#define KVM_EXIT_OSI 18
#define KVM_EXIT_PAPR_HCALL 19
+#define KVM_EXIT_S390_UCONTROL 20
/* For KVM_EXIT_INTERNAL_ERROR */
#define KVM_INTERNAL_ERROR_EMULATION 1
@@ -249,6 +250,11 @@ struct kvm_run {
#define KVM_S390_RESET_CPU_INIT 8
#define KVM_S390_RESET_IPL 16
__u64 s390_reset_flags;
+ /* KVM_EXIT_S390_UCONTROL */
+ struct {
+ __u64 trans_exc_code;
+ __u32 pgm_code;
+ } s390_ucontrol;
/* KVM_EXIT_DCR */
struct {
__u32 dcrn;
^ permalink raw reply [flat|nested] 22+ messages in thread* [patch 04/11] [PATCH] kvm-s390-ucontrol: export SIE control block to user
2012-01-04 9:25 [patch 00/11] Ucontrol patchset respin without storage keys Carsten Otte
` (2 preceding siblings ...)
2012-01-04 9:25 ` [patch 03/11] [PATCH] kvm-s390-ucontrol: export page faults to user Carsten Otte
@ 2012-01-04 9:25 ` Carsten Otte
2012-01-04 9:25 ` [patch 05/11] [PATCH] kvm-s390-ucontrol: disable in-kernel handling of SIE intercepts Carsten Otte
` (9 subsequent siblings)
13 siblings, 0 replies; 22+ messages in thread
From: Carsten Otte @ 2012-01-04 9:25 UTC (permalink / raw)
To: Avi Kivity, Marcelo Tossati
Cc: Christian Borntraeger, Heiko Carstens, Martin Schwidefsky,
Cornelia Huck, KVM, Joachim von Buttlar, Jens Freimann, agraf,
Xiantao Zhang
[-- Attachment #1: sie-control-block-to-user.patch --]
[-- Type: text/plain, Size: 3783 bytes --]
This patch exports the s390 SIE hardware control block to userspace
via the mapping of the vcpu file descriptor. In order to do so,
a new arch callback named kvm_arch_vcpu_fault is introduced for all
architectures. It allows to map architecture specific pages.
Signed-off-by: Carsten Otte <cotte@de.ibm.com>
---
---
Documentation/virtual/kvm/api.txt | 5 +++++
arch/ia64/kvm/kvm-ia64.c | 5 +++++
arch/powerpc/kvm/powerpc.c | 5 +++++
arch/s390/kvm/kvm-s390.c | 13 +++++++++++++
arch/x86/kvm/x86.c | 5 +++++
include/linux/kvm.h | 2 ++
include/linux/kvm_host.h | 1 +
virt/kvm/kvm_main.c | 2 +-
8 files changed, 37 insertions(+), 1 deletion(-)
--- a/Documentation/virtual/kvm/api.txt
+++ b/Documentation/virtual/kvm/api.txt
@@ -218,6 +218,11 @@ allocation of vcpu ids. For example, if
single-threaded guest vcpus, it should make all vcpu ids be a multiple
of the number of vcpus per vcore.
+For virtual cpus that have been created with S390 user controlled virtual
+machines, the resulting vcpu fd can be memory mapped at page offset
+KVM_S390_SIE_PAGE_OFFSET in order to obtain a memory map of the virtual
+cpu's hardware control block.
+
4.8 KVM_GET_DIRTY_LOG (vm ioctl)
Capability: basic
--- a/arch/ia64/kvm/kvm-ia64.c
+++ b/arch/ia64/kvm/kvm-ia64.c
@@ -1566,6 +1566,11 @@ out:
return r;
}
+int kvm_arch_vcpu_fault(struct kvm_vcpu *vcpu, struct vm_fault *vmf)
+{
+ return VM_FAULT_SIGBUS;
+}
+
int kvm_arch_prepare_memory_region(struct kvm *kvm,
struct kvm_memory_slot *memslot,
struct kvm_memory_slot old,
--- a/arch/powerpc/kvm/powerpc.c
+++ b/arch/powerpc/kvm/powerpc.c
@@ -659,6 +659,11 @@ out:
return r;
}
+int kvm_arch_vcpu_fault(struct kvm_vcpu *vcpu, struct vm_fault *vmf)
+{
+ return VM_FAULT_SIGBUS;
+}
+
static int kvm_vm_ioctl_get_pvinfo(struct kvm_ppc_pvinfo *pvinfo)
{
u32 inst_lis = 0x3c000000;
--- a/arch/s390/kvm/kvm-s390.c
+++ b/arch/s390/kvm/kvm-s390.c
@@ -763,6 +763,19 @@ long kvm_arch_vcpu_ioctl(struct file *fi
return r;
}
+int kvm_arch_vcpu_fault(struct kvm_vcpu *vcpu, struct vm_fault *vmf)
+{
+#ifdef CONFIG_KVM_S390_UCONTROL
+ if ((vmf->pgoff == KVM_S390_SIE_PAGE_OFFSET)
+ && (kvm_is_ucontrol(vcpu->kvm))) {
+ vmf->page = virt_to_page(vcpu->arch.sie_block);
+ get_page(vmf->page);
+ return 0;
+ }
+#endif
+ return VM_FAULT_SIGBUS;
+}
+
/* Section: memory related */
int kvm_arch_prepare_memory_region(struct kvm *kvm,
struct kvm_memory_slot *memslot,
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -2792,6 +2792,11 @@ out:
return r;
}
+int kvm_arch_vcpu_fault(struct kvm_vcpu *vcpu, struct vm_fault *vmf)
+{
+ return VM_FAULT_SIGBUS;
+}
+
static int kvm_vm_ioctl_set_tss_addr(struct kvm *kvm, unsigned long addr)
{
int ret;
--- a/include/linux/kvm.h
+++ b/include/linux/kvm.h
@@ -440,6 +440,8 @@ struct kvm_ppc_pvinfo {
/* machine type bits, to be used as argument to KVM_CREATE_VM */
#define KVM_VM_S390_UCONTROL 1
+#define KVM_S390_SIE_PAGE_OFFSET 1
+
/*
* ioctls for /dev/kvm fds:
*/
--- a/include/linux/kvm_host.h
+++ b/include/linux/kvm_host.h
@@ -450,6 +450,7 @@ long kvm_arch_dev_ioctl(struct file *fil
unsigned int ioctl, unsigned long arg);
long kvm_arch_vcpu_ioctl(struct file *filp,
unsigned int ioctl, unsigned long arg);
+int kvm_arch_vcpu_fault(struct kvm_vcpu *vcpu, struct vm_fault *vmf);
int kvm_dev_ioctl_check_extension(long ext);
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -1657,7 +1657,7 @@ static int kvm_vcpu_fault(struct vm_area
page = virt_to_page(vcpu->kvm->coalesced_mmio_ring);
#endif
else
- return VM_FAULT_SIGBUS;
+ return kvm_arch_vcpu_fault(vcpu, vmf);
get_page(page);
vmf->page = page;
return 0;
^ permalink raw reply [flat|nested] 22+ messages in thread* [patch 05/11] [PATCH] kvm-s390-ucontrol: disable in-kernel handling of SIE intercepts
2012-01-04 9:25 [patch 00/11] Ucontrol patchset respin without storage keys Carsten Otte
` (3 preceding siblings ...)
2012-01-04 9:25 ` [patch 04/11] [PATCH] kvm-s390-ucontrol: export SIE control block " Carsten Otte
@ 2012-01-04 9:25 ` Carsten Otte
2012-01-04 9:25 ` [patch 06/11] [PATCH] kvm-s390-ucontrol: disable in-kernel irq stack Carsten Otte
` (8 subsequent siblings)
13 siblings, 0 replies; 22+ messages in thread
From: Carsten Otte @ 2012-01-04 9:25 UTC (permalink / raw)
To: Avi Kivity, Marcelo Tossati
Cc: Christian Borntraeger, Heiko Carstens, Martin Schwidefsky,
Cornelia Huck, KVM, Joachim von Buttlar, Jens Freimann, agraf
[-- Attachment #1: no-sie-intercepts-for-ucontrol.patch --]
[-- Type: text/plain, Size: 823 bytes --]
This patch disables in-kernel handling of SIE intercepts for user
controlled virtual machines. All intercepts are passed to userspace
via KVM_EXIT_SIE exit reason just like SIE intercepts that cannot be
handled in-kernel for regular KVM guests.
Signed-off-by: Carsten Otte <cotte@de.ibm.com>
---
Index: linux-2.5-cecsim/arch/s390/kvm/kvm-s390.c
===================================================================
--- linux-2.5-cecsim.orig/arch/s390/kvm/kvm-s390.c
+++ linux-2.5-cecsim/arch/s390/kvm/kvm-s390.c
@@ -566,7 +566,10 @@ rerun_vcpu:
rc = __vcpu_run(vcpu);
if (rc)
break;
- rc = kvm_handle_sie_intercept(vcpu);
+ if (kvm_is_ucontrol(vcpu->kvm))
+ rc = -EOPNOTSUPP;
+ else
+ rc = kvm_handle_sie_intercept(vcpu);
} while (!signal_pending(current) && !rc);
if (rc == SIE_INTERCEPT_RERUNVCPU)
^ permalink raw reply [flat|nested] 22+ messages in thread* [patch 06/11] [PATCH] kvm-s390-ucontrol: disable in-kernel irq stack
2012-01-04 9:25 [patch 00/11] Ucontrol patchset respin without storage keys Carsten Otte
` (4 preceding siblings ...)
2012-01-04 9:25 ` [patch 05/11] [PATCH] kvm-s390-ucontrol: disable in-kernel handling of SIE intercepts Carsten Otte
@ 2012-01-04 9:25 ` Carsten Otte
2012-01-04 9:25 ` [patch 07/11] [PATCH] kvm-s390-ucontrol: interface to inject faults on a vcpu page table Carsten Otte
` (7 subsequent siblings)
13 siblings, 0 replies; 22+ messages in thread
From: Carsten Otte @ 2012-01-04 9:25 UTC (permalink / raw)
To: Avi Kivity, Marcelo Tossati
Cc: Christian Borntraeger, Heiko Carstens, Martin Schwidefsky,
Cornelia Huck, KVM, Joachim von Buttlar, Jens Freimann, agraf
[-- Attachment #1: kvm-disable-irq-stack.patch --]
[-- Type: text/plain, Size: 750 bytes --]
This patch disables the in-kernel interrupt stack for KVM virtual
machines that are controlled by user. Userspace has to take care
of handling interrupts on its own.
Signed-off-by: Carsten Otte <cotte@de.ibm.com>
---
Index: linux-2.5-cecsim/arch/s390/kvm/kvm-s390.c
===================================================================
--- linux-2.5-cecsim.orig/arch/s390/kvm/kvm-s390.c
+++ linux-2.5-cecsim/arch/s390/kvm/kvm-s390.c
@@ -505,7 +505,8 @@ static int __vcpu_run(struct kvm_vcpu *v
if (test_thread_flag(TIF_MCCK_PENDING))
s390_handle_mcck();
- kvm_s390_deliver_pending_interrupts(vcpu);
+ if (!kvm_is_ucontrol(vcpu->kvm))
+ kvm_s390_deliver_pending_interrupts(vcpu);
vcpu->arch.sie_block->icptcode = 0;
local_irq_disable();
^ permalink raw reply [flat|nested] 22+ messages in thread* [patch 07/11] [PATCH] kvm-s390-ucontrol: interface to inject faults on a vcpu page table
2012-01-04 9:25 [patch 00/11] Ucontrol patchset respin without storage keys Carsten Otte
` (5 preceding siblings ...)
2012-01-04 9:25 ` [patch 06/11] [PATCH] kvm-s390-ucontrol: disable in-kernel irq stack Carsten Otte
@ 2012-01-04 9:25 ` Carsten Otte
2012-01-04 14:52 ` Avi Kivity
2012-01-04 9:25 ` [patch 08/11] [PATCH] kvm-s390-ucontrol: disable sca Carsten Otte
` (6 subsequent siblings)
13 siblings, 1 reply; 22+ messages in thread
From: Carsten Otte @ 2012-01-04 9:25 UTC (permalink / raw)
To: Avi Kivity, Marcelo Tossati
Cc: Christian Borntraeger, Heiko Carstens, Martin Schwidefsky,
Cornelia Huck, KVM, Joachim von Buttlar, Jens Freimann, agraf
[-- Attachment #1: guest-fault-interface.patch --]
[-- Type: text/plain, Size: 2507 bytes --]
This patch allows the user to fault in pages on a virtual cpus
address space for user controlled virtual machines. Typically this
is superfluous because userspace can just create a mapping and
let the kernel's page fault logic take are of it. There is one
exception: SIE won't start if the lowcore is not present. Normally
the kernel takes care of this [handle_validity() in
arch/s390/kvm/intercept.c] but since the kernel does not handle
intercepts for user controlled virtual machines, userspace needs to
be able to handle this condition.
Signed-off-by: Carsten Otte <cotte@de.ibm.com>
---
---
Documentation/virtual/kvm/api.txt | 16 ++++++++++++++++
arch/s390/kvm/kvm-s390.c | 6 ++++++
include/linux/kvm.h | 1 +
3 files changed, 23 insertions(+)
--- a/Documentation/virtual/kvm/api.txt
+++ b/Documentation/virtual/kvm/api.txt
@@ -1539,6 +1539,22 @@ This ioctl unmaps the memory in the vcpu
"vcpu_addr" with the length "length". The field "user_addr" is ignored.
All parameters need to be alligned by 1 megabyte.
+4.66 KVM_S390_VCPU_FAULT
+
+Capability: KVM_CAP_S390_UCONTROL
+Architectures: s390
+Type: vcpu ioctl
+Parameters: vcpu absolute address (in)
+Returns: 0 in case of success
+
+This call creates a page table entry on the virtual cpu's address space
+(for user controlled virtual machines) or the virtual machine's address
+space (for regular virtual machines). This only works for minor faults,
+thus it's recommended to access subject memory page via the user page
+table upfront. This is useful to handle validity intercepts for user
+controlled virtual machines to fault in the virtual cpu's lowcore pages
+prior to calling the KVM_RUN ioctl.
+
5. The kvm_run structure
Application code obtains a pointer to the kvm_run structure by
--- a/arch/s390/kvm/kvm-s390.c
+++ b/arch/s390/kvm/kvm-s390.c
@@ -761,6 +761,12 @@ long kvm_arch_vcpu_ioctl(struct file *fi
break;
}
#endif
+ case KVM_S390_VCPU_FAULT: {
+ r = gmap_fault(arg, vcpu->arch.gmap);
+ if (!IS_ERR_VALUE(r))
+ r = 0;
+ break;
+ }
default:
r = -EINVAL;
}
--- a/include/linux/kvm.h
+++ b/include/linux/kvm.h
@@ -675,6 +675,7 @@ struct kvm_s390_ucas_mapping {
};
#define KVM_S390_UCAS_MAP _IOW(KVMIO, 0x50, struct kvm_s390_ucas_mapping)
#define KVM_S390_UCAS_UNMAP _IOW(KVMIO, 0x51, struct kvm_s390_ucas_mapping)
+#define KVM_S390_VCPU_FAULT _IOW(KVMIO, 0x52, unsigned long)
/* Device model IOC */
#define KVM_CREATE_IRQCHIP _IO(KVMIO, 0x60)
^ permalink raw reply [flat|nested] 22+ messages in thread* Re: [patch 07/11] [PATCH] kvm-s390-ucontrol: interface to inject faults on a vcpu page table
2012-01-04 9:25 ` [patch 07/11] [PATCH] kvm-s390-ucontrol: interface to inject faults on a vcpu page table Carsten Otte
@ 2012-01-04 14:52 ` Avi Kivity
2012-01-04 16:09 ` Carsten Otte
0 siblings, 1 reply; 22+ messages in thread
From: Avi Kivity @ 2012-01-04 14:52 UTC (permalink / raw)
To: Carsten Otte
Cc: Marcelo Tossati, Christian Borntraeger, Heiko Carstens,
Martin Schwidefsky, Cornelia Huck, KVM, Joachim von Buttlar,
Jens Freimann, agraf
On 01/04/2012 11:25 AM, Carsten Otte wrote:
> This patch allows the user to fault in pages on a virtual cpus
> address space for user controlled virtual machines. Typically this
> is superfluous because userspace can just create a mapping and
> let the kernel's page fault logic take are of it. There is one
> exception: SIE won't start if the lowcore is not present. Normally
> the kernel takes care of this [handle_validity() in
> arch/s390/kvm/intercept.c] but since the kernel does not handle
> intercepts for user controlled virtual machines, userspace needs to
> be able to handle this condition.
There is an alternative, if you can recognize this condition exactly
from the hardware fault, you can fault the lowcore yourself and retry.
This eliminates a user interface. Is this workable?
--
error compiling committee.c: too many arguments to function
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [patch 07/11] [PATCH] kvm-s390-ucontrol: interface to inject faults on a vcpu page table
2012-01-04 14:52 ` Avi Kivity
@ 2012-01-04 16:09 ` Carsten Otte
2012-01-04 16:34 ` Carsten Otte
0 siblings, 1 reply; 22+ messages in thread
From: Carsten Otte @ 2012-01-04 16:09 UTC (permalink / raw)
To: Avi Kivity
Cc: Marcelo Tossati, borntrae, heicars2, mschwid2, huckc, KVM,
Joachim von Buttlar, Jens Freimann, agraf
On 04.01.2012 15:52, Avi Kivity wrote:
> On 01/04/2012 11:25 AM, Carsten Otte wrote:
>> This patch allows the user to fault in pages on a virtual cpus
>> address space for user controlled virtual machines. Typically this
>> is superfluous because userspace can just create a mapping and
>> let the kernel's page fault logic take are of it. There is one
>> exception: SIE won't start if the lowcore is not present. Normally
>> the kernel takes care of this [handle_validity() in
>> arch/s390/kvm/intercept.c] but since the kernel does not handle
>> intercepts for user controlled virtual machines, userspace needs to
>> be able to handle this condition.
>
> There is an alternative, if you can recognize this condition exactly
> from the hardware fault, you can fault the lowcore yourself and retry.
> This eliminates a user interface. Is this workable?
The situation is very easy to detect, SIE won't start and it'll tell
us in the intercept info (processed in userspace in case of ucontrol)
that the lowcore is not mapped in. Now userspace can a) create a
mapping of a guest to user space for the vcpu using KVM_S390_UCAS_MAP
which will create an invalid segment table entry (pmd), and b) touch the
page to make the pte for it valid in user space, but it cannot create a
segment table entry (pmd) on the guest table that points to the page
table that is shared between both spaces.
It is an optimization that KVM_S390_UCAS_MAP does'nt create a whole
page table right away. If we did that, we'd run out of memory pretty
fast once our regression runs simulate a couple of mainframes in
parallel with some terabytes of simulated memory each.
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [patch 07/11] [PATCH] kvm-s390-ucontrol: interface to inject faults on a vcpu page table
2012-01-04 16:09 ` Carsten Otte
@ 2012-01-04 16:34 ` Carsten Otte
2012-01-04 17:25 ` Avi Kivity
0 siblings, 1 reply; 22+ messages in thread
From: Carsten Otte @ 2012-01-04 16:34 UTC (permalink / raw)
To: Avi Kivity
Cc: Marcelo Tossati, borntrae, heicars2, mschwid2, huckc, KVM,
Joachim von Buttlar, Jens Freimann, agraf
Avi wrote:
> There is an alternative, if you can recognize this condition exactly
> from the hardware fault, you can fault the lowcore yourself and retry.
> This eliminates a user interface. Is this workable?
I've read your comment again, and understood it this time. Trouble is
that the kernel cannot handle the situation either: userspace may need
to malloc some memory and call KVM_S390_UCAS_MAP prior to resolving it.
One could avoid the user interface by partially handling it in-kernel
and partially handling it in userspace without handshaking:
- user calls KVM_RUN
- SIE validity intercept
- kernel tries to gmap_fault and recognizes -EFAULT
- kernel returns validity intercept to user
- user does KVM_S390_UCAS_MAP
- user calls KVM_RUN
- SIE validity intercept
- kernel tries to gmap_fault and succeeds
- SIE runs ok
I guess I prefer to do processing of one operation in one place, and
thus I prefer the user interface over this. But yes, it'd be workable
without this interface. Is this what you want?
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [patch 07/11] [PATCH] kvm-s390-ucontrol: interface to inject faults on a vcpu page table
2012-01-04 16:34 ` Carsten Otte
@ 2012-01-04 17:25 ` Avi Kivity
0 siblings, 0 replies; 22+ messages in thread
From: Avi Kivity @ 2012-01-04 17:25 UTC (permalink / raw)
To: Carsten Otte
Cc: Marcelo Tossati, borntrae, heicars2, mschwid2, huckc, KVM,
Joachim von Buttlar, Jens Freimann, agraf
On 01/04/2012 06:34 PM, Carsten Otte wrote:
> Avi wrote:
>> There is an alternative, if you can recognize this condition exactly
>> from the hardware fault, you can fault the lowcore yourself and retry.
>> This eliminates a user interface. Is this workable?
> I've read your comment again, and understood it this time. Trouble is
> that the kernel cannot handle the situation either: userspace may need
> to malloc some memory and call KVM_S390_UCAS_MAP prior to resolving it.
> One could avoid the user interface by partially handling it in-kernel
> and partially handling it in userspace without handshaking:
> - user calls KVM_RUN
> - SIE validity intercept
> - kernel tries to gmap_fault and recognizes -EFAULT
> - kernel returns validity intercept to user
> - user does KVM_S390_UCAS_MAP
> - user calls KVM_RUN
> - SIE validity intercept
> - kernel tries to gmap_fault and succeeds
> - SIE runs ok
>
> I guess I prefer to do processing of one operation in one place, and
> thus I prefer the user interface over this. But yes, it'd be workable
> without this interface. Is this what you want?
No, I think your patch as is would be better. Thanks.
--
error compiling committee.c: too many arguments to function
^ permalink raw reply [flat|nested] 22+ messages in thread
* [patch 08/11] [PATCH] kvm-s390-ucontrol: disable sca
2012-01-04 9:25 [patch 00/11] Ucontrol patchset respin without storage keys Carsten Otte
` (6 preceding siblings ...)
2012-01-04 9:25 ` [patch 07/11] [PATCH] kvm-s390-ucontrol: interface to inject faults on a vcpu page table Carsten Otte
@ 2012-01-04 9:25 ` Carsten Otte
2012-01-04 9:25 ` [patch 09/11] [PATCH] kvm-s390: fix assumption for KVM_MAX_VCPUS Carsten Otte
` (5 subsequent siblings)
13 siblings, 0 replies; 22+ messages in thread
From: Carsten Otte @ 2012-01-04 9:25 UTC (permalink / raw)
To: Avi Kivity, Marcelo Tossati
Cc: Christian Borntraeger, Heiko Carstens, Martin Schwidefsky,
Cornelia Huck, KVM, Joachim von Buttlar, Jens Freimann, agraf
[-- Attachment #1: do-not-add-ucontrol-cpus-to-sca.patch --]
[-- Type: text/plain, Size: 2061 bytes --]
This patch makes sure user controlled virtual machines do not use a
system control area (sca). This is needed in order to create
virtual machines with more cpus than the size of the sca [64].
Signed-off-by: Carsten Otte <cotte@de.ibm.com>
---
Index: linux-2.5-cecsim/arch/s390/kvm/kvm-s390.c
===================================================================
--- linux-2.5-cecsim.orig/arch/s390/kvm/kvm-s390.c
+++ linux-2.5-cecsim/arch/s390/kvm/kvm-s390.c
@@ -228,10 +228,13 @@ out_err:
void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu)
{
VCPU_EVENT(vcpu, 3, "%s", "free cpu");
- clear_bit(63 - vcpu->vcpu_id, (unsigned long *) &vcpu->kvm->arch.sca->mcn);
- if (vcpu->kvm->arch.sca->cpu[vcpu->vcpu_id].sda ==
- (__u64) vcpu->arch.sie_block)
- vcpu->kvm->arch.sca->cpu[vcpu->vcpu_id].sda = 0;
+ if (!kvm_is_ucontrol(vcpu->kvm)) {
+ clear_bit(63 - vcpu->vcpu_id,
+ (unsigned long *) &vcpu->kvm->arch.sca->mcn);
+ if (vcpu->kvm->arch.sca->cpu[vcpu->vcpu_id].sda ==
+ (__u64) vcpu->arch.sie_block)
+ vcpu->kvm->arch.sca->cpu[vcpu->vcpu_id].sda = 0;
+ }
smp_mb();
if (kvm_is_ucontrol(vcpu->kvm))
@@ -368,12 +371,19 @@ struct kvm_vcpu *kvm_arch_vcpu_create(st
goto out_free_cpu;
vcpu->arch.sie_block->icpua = id;
- BUG_ON(!kvm->arch.sca);
- if (!kvm->arch.sca->cpu[id].sda)
- kvm->arch.sca->cpu[id].sda = (__u64) vcpu->arch.sie_block;
- vcpu->arch.sie_block->scaoh = (__u32)(((__u64)kvm->arch.sca) >> 32);
- vcpu->arch.sie_block->scaol = (__u32)(__u64)kvm->arch.sca;
- set_bit(63 - id, (unsigned long *) &kvm->arch.sca->mcn);
+ if (!kvm_is_ucontrol(kvm)) {
+ if (!kvm->arch.sca) {
+ WARN_ON_ONCE(1);
+ goto out_free_cpu;
+ }
+ if (!kvm->arch.sca->cpu[id].sda)
+ kvm->arch.sca->cpu[id].sda =
+ (__u64) vcpu->arch.sie_block;
+ vcpu->arch.sie_block->scaoh =
+ (__u32)(((__u64)kvm->arch.sca) >> 32);
+ vcpu->arch.sie_block->scaol = (__u32)(__u64)kvm->arch.sca;
+ set_bit(63 - id, (unsigned long *) &kvm->arch.sca->mcn);
+ }
spin_lock_init(&vcpu->arch.local_int.lock);
INIT_LIST_HEAD(&vcpu->arch.local_int.list);
^ permalink raw reply [flat|nested] 22+ messages in thread* [patch 09/11] [PATCH] kvm-s390: fix assumption for KVM_MAX_VCPUS
2012-01-04 9:25 [patch 00/11] Ucontrol patchset respin without storage keys Carsten Otte
` (7 preceding siblings ...)
2012-01-04 9:25 ` [patch 08/11] [PATCH] kvm-s390-ucontrol: disable sca Carsten Otte
@ 2012-01-04 9:25 ` Carsten Otte
2012-01-04 9:25 ` [patch 10/11] [PATCH] kvm-s390-ucontrol: announce capability for user controlled vms Carsten Otte
` (4 subsequent siblings)
13 siblings, 0 replies; 22+ messages in thread
From: Carsten Otte @ 2012-01-04 9:25 UTC (permalink / raw)
To: Avi Kivity, Marcelo Tossati
Cc: Christian Borntraeger, Heiko Carstens, Martin Schwidefsky,
Cornelia Huck, KVM, Joachim von Buttlar, Jens Freimann, agraf
[-- Attachment #1: allow-more-than-64-vcpus.patch --]
[-- Type: text/plain, Size: 854 bytes --]
This patch fixes definition of the idle_mask and the local_int array
in kvm_s390_float_interrupt. Previous definition had 64 cpus max
hardcoded instead of using KVM_MAX_VCPUS.
Signed-off-by: Carsten Otte <cotte@de.ibm.com>
---
Index: linux-2.5-cecsim/arch/s390/include/asm/kvm_host.h
===================================================================
--- linux-2.5-cecsim.orig/arch/s390/include/asm/kvm_host.h
+++ linux-2.5-cecsim/arch/s390/include/asm/kvm_host.h
@@ -220,8 +220,9 @@ struct kvm_s390_float_interrupt {
struct list_head list;
atomic_t active;
int next_rr_cpu;
- unsigned long idle_mask [(64 + sizeof(long) - 1) / sizeof(long)];
- struct kvm_s390_local_interrupt *local_int[64];
+ unsigned long idle_mask[(KVM_MAX_VCPUS + sizeof(long) - 1)
+ / sizeof(long)];
+ struct kvm_s390_local_interrupt *local_int[KVM_MAX_VCPUS];
};
^ permalink raw reply [flat|nested] 22+ messages in thread* [patch 10/11] [PATCH] kvm-s390-ucontrol: announce capability for user controlled vms
2012-01-04 9:25 [patch 00/11] Ucontrol patchset respin without storage keys Carsten Otte
` (8 preceding siblings ...)
2012-01-04 9:25 ` [patch 09/11] [PATCH] kvm-s390: fix assumption for KVM_MAX_VCPUS Carsten Otte
@ 2012-01-04 9:25 ` Carsten Otte
2012-01-04 9:25 ` [patch 11/11] [PATCH] kvm-s390: Fix return code for unknown ioctl numbers Carsten Otte
` (3 subsequent siblings)
13 siblings, 0 replies; 22+ messages in thread
From: Carsten Otte @ 2012-01-04 9:25 UTC (permalink / raw)
To: Avi Kivity, Marcelo Tossati
Cc: Christian Borntraeger, Heiko Carstens, Martin Schwidefsky,
Cornelia Huck, KVM, Joachim von Buttlar, Jens Freimann, agraf
[-- Attachment #1: announce-ucas.patch --]
[-- Type: text/plain, Size: 876 bytes --]
This patch announces a new capability KVM_CAP_S390_UCONTROL that
indicates that kvm can now support virtual machines that are
controlled by userspace.
Signed-off-by: Carsten Otte <cotte@de.ibm.com>
---
---
arch/s390/kvm/kvm-s390.c | 3 +++
include/linux/kvm.h | 1 +
2 files changed, 4 insertions(+)
--- a/arch/s390/kvm/kvm-s390.c
+++ b/arch/s390/kvm/kvm-s390.c
@@ -129,6 +129,9 @@ int kvm_dev_ioctl_check_extension(long e
case KVM_CAP_S390_PSW:
case KVM_CAP_S390_GMAP:
case KVM_CAP_SYNC_MMU:
+#ifdef CONFIG_KVM_S390_UCONTROL
+ case KVM_CAP_S390_UCONTROL:
+#endif
r = 1;
break;
default:
--- a/include/linux/kvm.h
+++ b/include/linux/kvm.h
@@ -569,6 +569,7 @@ struct kvm_ppc_pvinfo {
#define KVM_CAP_PPC_PAPR 68
#define KVM_CAP_S390_GMAP 71
#define KVM_CAP_TSC_DEADLINE_TIMER 72
+#define KVM_CAP_S390_UCONTROL 73
#ifdef KVM_CAP_IRQ_ROUTING
^ permalink raw reply [flat|nested] 22+ messages in thread* [patch 11/11] [PATCH] kvm-s390: Fix return code for unknown ioctl numbers
2012-01-04 9:25 [patch 00/11] Ucontrol patchset respin without storage keys Carsten Otte
` (9 preceding siblings ...)
2012-01-04 9:25 ` [patch 10/11] [PATCH] kvm-s390-ucontrol: announce capability for user controlled vms Carsten Otte
@ 2012-01-04 9:25 ` Carsten Otte
2012-01-04 14:54 ` [patch 00/11] Ucontrol patchset respin without storage keys Avi Kivity
` (2 subsequent siblings)
13 siblings, 0 replies; 22+ messages in thread
From: Carsten Otte @ 2012-01-04 9:25 UTC (permalink / raw)
To: Avi Kivity, Marcelo Tossati
Cc: Christian Borntraeger, Heiko Carstens, Martin Schwidefsky,
Cornelia Huck, KVM, Joachim von Buttlar, Jens Freimann, agraf
[-- Attachment #1: fix-ioctl-return-values.patch --]
[-- Type: text/plain, Size: 431 bytes --]
This patch fixes the return code of kvm_arch_vcpu_ioctl in case
of an unkown ioctl number.
Signed-off-by: Carsten Otte <cotte@de.ibm.com>
---
---
arch/s390/kvm/kvm-s390.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
--- a/arch/s390/kvm/kvm-s390.c
+++ b/arch/s390/kvm/kvm-s390.c
@@ -781,7 +781,7 @@ long kvm_arch_vcpu_ioctl(struct file *fi
break;
}
default:
- r = -EINVAL;
+ r = -ENOTTY;
}
return r;
}
^ permalink raw reply [flat|nested] 22+ messages in thread* Re: [patch 00/11] Ucontrol patchset respin without storage keys
2012-01-04 9:25 [patch 00/11] Ucontrol patchset respin without storage keys Carsten Otte
` (10 preceding siblings ...)
2012-01-04 9:25 ` [patch 11/11] [PATCH] kvm-s390: Fix return code for unknown ioctl numbers Carsten Otte
@ 2012-01-04 14:54 ` Avi Kivity
2012-01-04 14:56 ` Avi Kivity
2012-01-05 13:41 ` Marcelo Tosatti
2012-01-09 12:19 ` Marcelo Tosatti
13 siblings, 1 reply; 22+ messages in thread
From: Avi Kivity @ 2012-01-04 14:54 UTC (permalink / raw)
To: Carsten Otte
Cc: Marcelo Tossati, Christian Borntraeger, Heiko Carstens,
Martin Schwidefsky, Cornelia Huck, KVM, Joachim von Buttlar,
Jens Freimann, agraf
On 01/04/2012 11:25 AM, Carsten Otte wrote:
> Hi Avi,
>
> after some more discussion about how to do storage keys proper, I could
> not come up with a sane and safe way of doing SSKE without either
> over or underindicating the change bit in corner cases (leads to
> corrupted guest memory or host kernel panic).
> The storage key operations are completely seperate from the rest of
> the ucontrol series:
> - ucontrol VMs can operate without them (handled by hardware)
> - regular VMs can make use of them too (needed for live migration)
>
> This respin only contains the non-controversial patches. I would
> kindly like to ask for inclusion, I will retry on storage keys as
> soon as I've got a solution.
Everything looks good to me. I'll wait for a bit for more reviews (and
possibly Reviewed-by:s), and to see if my suggestion re patch 7 is any good.
--
error compiling committee.c: too many arguments to function
^ permalink raw reply [flat|nested] 22+ messages in thread* Re: [patch 00/11] Ucontrol patchset respin without storage keys
2012-01-04 14:54 ` [patch 00/11] Ucontrol patchset respin without storage keys Avi Kivity
@ 2012-01-04 14:56 ` Avi Kivity
0 siblings, 0 replies; 22+ messages in thread
From: Avi Kivity @ 2012-01-04 14:56 UTC (permalink / raw)
To: Carsten Otte
Cc: Marcelo Tossati, Christian Borntraeger, Heiko Carstens,
Martin Schwidefsky, Cornelia Huck, KVM, Joachim von Buttlar,
Jens Freimann, agraf
On 01/04/2012 04:54 PM, Avi Kivity wrote:
> On 01/04/2012 11:25 AM, Carsten Otte wrote:
> > Hi Avi,
> >
> > after some more discussion about how to do storage keys proper, I could
> > not come up with a sane and safe way of doing SSKE without either
> > over or underindicating the change bit in corner cases (leads to
> > corrupted guest memory or host kernel panic).
> > The storage key operations are completely seperate from the rest of
> > the ucontrol series:
> > - ucontrol VMs can operate without them (handled by hardware)
> > - regular VMs can make use of them too (needed for live migration)
> >
> > This respin only contains the non-controversial patches. I would
> > kindly like to ask for inclusion, I will retry on storage keys as
> > soon as I've got a solution.
>
> Everything looks good to me. I'll wait for a bit for more reviews (and
> possibly Reviewed-by:s), and to see if my suggestion re patch 7 is any good.
>
btw, when I say "I'll wait a bit" I really mean "I'll forget everything
about it", so feel free to remind me in a few days.
--
error compiling committee.c: too many arguments to function
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [patch 00/11] Ucontrol patchset respin without storage keys
2012-01-04 9:25 [patch 00/11] Ucontrol patchset respin without storage keys Carsten Otte
` (11 preceding siblings ...)
2012-01-04 14:54 ` [patch 00/11] Ucontrol patchset respin without storage keys Avi Kivity
@ 2012-01-05 13:41 ` Marcelo Tosatti
2012-01-05 13:47 ` Marcelo Tosatti
2012-01-09 12:19 ` Marcelo Tosatti
13 siblings, 1 reply; 22+ messages in thread
From: Marcelo Tosatti @ 2012-01-05 13:41 UTC (permalink / raw)
To: Carsten Otte
Cc: Avi Kivity, Christian Borntraeger, Heiko Carstens,
Martin Schwidefsky, Cornelia Huck, KVM, Joachim von Buttlar,
Jens Freimann, agraf
On Wed, Jan 04, 2012 at 10:25:19AM +0100, Carsten Otte wrote:
> Hi Avi,
>
> after some more discussion about how to do storage keys proper, I could
> not come up with a sane and safe way of doing SSKE without either
> over or underindicating the change bit in corner cases (leads to
> corrupted guest memory or host kernel panic).
> The storage key operations are completely seperate from the rest of
> the ucontrol series:
> - ucontrol VMs can operate without them (handled by hardware)
> - regular VMs can make use of them too (needed for live migration)
>
> This respin only contains the non-controversial patches. I would
> kindly like to ask for inclusion, I will retry on storage keys as
> soon as I've got a solution.
>
> so long,
> Carsten
Looks good to me.
^ permalink raw reply [flat|nested] 22+ messages in thread* Re: [patch 00/11] Ucontrol patchset respin without storage keys
2012-01-05 13:41 ` Marcelo Tosatti
@ 2012-01-05 13:47 ` Marcelo Tosatti
2012-01-05 15:24 ` Carsten Otte
0 siblings, 1 reply; 22+ messages in thread
From: Marcelo Tosatti @ 2012-01-05 13:47 UTC (permalink / raw)
To: Carsten Otte
Cc: Avi Kivity, Christian Borntraeger, Heiko Carstens,
Martin Schwidefsky, Cornelia Huck, KVM, Joachim von Buttlar,
Jens Freimann, agraf
On Thu, Jan 05, 2012 at 11:41:30AM -0200, Marcelo Tosatti wrote:
> On Wed, Jan 04, 2012 at 10:25:19AM +0100, Carsten Otte wrote:
> > Hi Avi,
> >
> > after some more discussion about how to do storage keys proper, I could
> > not come up with a sane and safe way of doing SSKE without either
> > over or underindicating the change bit in corner cases (leads to
> > corrupted guest memory or host kernel panic).
> > The storage key operations are completely seperate from the rest of
> > the ucontrol series:
> > - ucontrol VMs can operate without them (handled by hardware)
> > - regular VMs can make use of them too (needed for live migration)
> >
> > This respin only contains the non-controversial patches. I would
> > kindly like to ask for inclusion, I will retry on storage keys as
> > soon as I've got a solution.
> >
> > so long,
> > Carsten
>
> Looks good to me.
Where is the userspace part?
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [patch 00/11] Ucontrol patchset respin without storage keys
2012-01-05 13:47 ` Marcelo Tosatti
@ 2012-01-05 15:24 ` Carsten Otte
0 siblings, 0 replies; 22+ messages in thread
From: Carsten Otte @ 2012-01-05 15:24 UTC (permalink / raw)
To: Marcelo Tosatti
Cc: Avi Kivity, borntrae, heicars2, mschwid2, huckc, KVM,
Joachim von Buttlar, Jens Freimann, agraf
On 05.01.2012 14:47, Marcelo Tosatti wrote:
> Where is the userspace part?
The ucontrol patchset is intended to be used with a machine
simulator called cecsim. It can emulate an entire mainframe
including nested virtualisation and is used for development
and test of N+1 generation firmware on N generation host
prior to availability of actual N+1 generation silicon. Thus,
frankly, we don't ship it (neither source nor binary).
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [patch 00/11] Ucontrol patchset respin without storage keys
2012-01-04 9:25 [patch 00/11] Ucontrol patchset respin without storage keys Carsten Otte
` (12 preceding siblings ...)
2012-01-05 13:41 ` Marcelo Tosatti
@ 2012-01-09 12:19 ` Marcelo Tosatti
13 siblings, 0 replies; 22+ messages in thread
From: Marcelo Tosatti @ 2012-01-09 12:19 UTC (permalink / raw)
To: Carsten Otte
Cc: Avi Kivity, Christian Borntraeger, Heiko Carstens,
Martin Schwidefsky, Cornelia Huck, KVM, Joachim von Buttlar,
Jens Freimann, agraf
On Wed, Jan 04, 2012 at 10:25:19AM +0100, Carsten Otte wrote:
> Hi Avi,
>
> after some more discussion about how to do storage keys proper, I could
> not come up with a sane and safe way of doing SSKE without either
> over or underindicating the change bit in corner cases (leads to
> corrupted guest memory or host kernel panic).
> The storage key operations are completely seperate from the rest of
> the ucontrol series:
> - ucontrol VMs can operate without them (handled by hardware)
> - regular VMs can make use of them too (needed for live migration)
>
> This respin only contains the non-controversial patches. I would
> kindly like to ask for inclusion, I will retry on storage keys as
> soon as I've got a solution.
>
> so long,
> Carsten
Applied, thanks.
^ permalink raw reply [flat|nested] 22+ messages in thread