* [GIT PULL 00/23] KVM: s390 features, kvm_get_vcpu_by_id and stat for 4.5
@ 2015-12-02 11:06 Christian Borntraeger
2015-12-02 11:06 ` [GIT PULL 01/23] KVM: Use common function for VCPU lookup by id Christian Borntraeger
` (23 more replies)
0 siblings, 24 replies; 29+ messages in thread
From: Christian Borntraeger @ 2015-12-02 11:06 UTC (permalink / raw)
To: Paolo Bonzini
Cc: KVM, linux-s390, Cornelia Huck, Jens Freimann, Alexander Graf
Paolo,
here is the first s390 pull request for 4.5. It also contains the
remaining vcpu lookup changes and an improved cleanup of the kvm_stat
exit path.
I have deferred the kvm_stat per VM patches.
The s390 changes are:
- ESCA support (up to 248 CPUs)
- detection if KVM works (e.g. for nested virtualization)
- cleanups
The following changes since commit bb11c6c96544737aede6a2eb92e5c6bc8b46534b:
KVM: x86: MMU: Remove unused parameter parent_pte from kvm_mmu_get_page() (2015-11-26 15:31:36 +0100)
are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/kvms390/linux.git tags/kvm-s390-next-4.5-1
for you to fetch changes up to 2f8a43d45d14ad62b105ed99151b453c12df7149:
KVM: s390: remove redudant assigment of error code (2015-11-30 12:47:13 +0100)
----------------------------------------------------------------
KVM: s390 features, kvm_get_vcpu_by_id and stat
Several features for s390
1. ESCA support (up to 248 vCPUs)
2. KVM detection: we can now detect if we support KVM (e.g. does KVM
under KVM work?)
kvm_stat:
1. cleanup
kvm_get_vcpu_by_id:
1. Use kvm_get_vcpu_by_id where appropriate
2. Apply a heuristic to optimize for ID VCPU == No. VCPU
----------------------------------------------------------------
Christian Borntraeger (1):
KVM: s390: remove redudant assigment of error code
David Hildenbrand (12):
KVM: Use common function for VCPU lookup by id
KVM: use heuristic for fast VCPU lookup by id
KVM: s390: rewrite vcpu_post_run and drop out early
KVM: s390: fast path for sca_ext_call_pending
KVM: s390: we always have a SCA
KVM: s390: fix SCA related races and double use
KVM: s390: always set/clear the SCA sda field
KVM: s390: cleanup sca_add_vcpu
KVM: s390: don't switch to ESCA for ucontrol
s390/sclp: introduce check for SIE
s390: show virtualization support in /proc/cpuinfo
KVM: s390: don't load kvm without virtualization support
Eugene (jno) Dvurechenski (8):
s390/sclp: introduce checks for ESCA and HVS
KVM: s390: Generalize access to IPTE controls
KVM: s390: Generalize access to SIGP controls
KVM: s390: Provide SCA-aware helpers for VCPU add/del
KVM: s390: Introduce new structures
KVM: s390: Make provisions for ESCA utilization
KVM: s390: Introduce switching code
KVM: s390: Enable up to 248 VCPUs per VM
Heiko Carstens (1):
KVM: s390: remove pointless test_facility(2) check
Janosch Frank (1):
KVM: Remove unnecessary debugfs dentry references
arch/powerpc/kvm/book3s_hv.c | 10 +-
arch/s390/include/asm/elf.h | 7 ++
arch/s390/include/asm/kvm_host.h | 49 +++++++-
arch/s390/include/asm/sclp.h | 8 +-
arch/s390/kernel/processor.c | 6 +
arch/s390/kernel/setup.c | 9 ++
arch/s390/kvm/diag.c | 11 +-
arch/s390/kvm/gaccess.c | 38 +++++--
arch/s390/kvm/intercept.c | 7 +-
arch/s390/kvm/interrupt.c | 133 +++++++++++++++++-----
arch/s390/kvm/kvm-s390.c | 237 +++++++++++++++++++++++++++------------
arch/s390/kvm/kvm-s390.h | 7 ++
drivers/s390/char/sclp_early.c | 8 +-
include/linux/kvm_host.h | 6 +-
virt/kvm/kvm_main.c | 30 ++---
15 files changed, 407 insertions(+), 159 deletions(-)
^ permalink raw reply [flat|nested] 29+ messages in thread
* [GIT PULL 01/23] KVM: Use common function for VCPU lookup by id
2015-12-02 11:06 [GIT PULL 00/23] KVM: s390 features, kvm_get_vcpu_by_id and stat for 4.5 Christian Borntraeger
@ 2015-12-02 11:06 ` Christian Borntraeger
2015-12-02 11:06 ` [GIT PULL 02/23] KVM: use heuristic for fast " Christian Borntraeger
` (22 subsequent siblings)
23 siblings, 0 replies; 29+ messages in thread
From: Christian Borntraeger @ 2015-12-02 11:06 UTC (permalink / raw)
To: Paolo Bonzini
Cc: KVM, linux-s390, Cornelia Huck, Jens Freimann, Alexander Graf
From: David Hildenbrand <dahi@linux.vnet.ibm.com>
Let's reuse the new common function for VPCU lookup by id.
Reviewed-by: Christian Borntraeger <borntraeger@de.ibm.com>
Reviewed-by: Dominik Dingel <dingel@linux.vnet.ibm.com>
Signed-off-by: David Hildenbrand <dahi@linux.vnet.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
[split out the new function into a separate patch]
---
arch/powerpc/kvm/book3s_hv.c | 10 ++--------
arch/s390/kvm/diag.c | 11 +++--------
virt/kvm/kvm_main.c | 12 +++++-------
3 files changed, 10 insertions(+), 23 deletions(-)
diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c
index 54b45b7..a29da44 100644
--- a/arch/powerpc/kvm/book3s_hv.c
+++ b/arch/powerpc/kvm/book3s_hv.c
@@ -308,16 +308,10 @@ static void kvmppc_dump_regs(struct kvm_vcpu *vcpu)
static struct kvm_vcpu *kvmppc_find_vcpu(struct kvm *kvm, int id)
{
- int r;
- struct kvm_vcpu *v, *ret = NULL;
+ struct kvm_vcpu *ret;
mutex_lock(&kvm->lock);
- kvm_for_each_vcpu(r, v, kvm) {
- if (v->vcpu_id == id) {
- ret = v;
- break;
- }
- }
+ ret = kvm_get_vcpu_by_id(kvm, id);
mutex_unlock(&kvm->lock);
return ret;
}
diff --git a/arch/s390/kvm/diag.c b/arch/s390/kvm/diag.c
index 5fbfb88..05f7de9 100644
--- a/arch/s390/kvm/diag.c
+++ b/arch/s390/kvm/diag.c
@@ -155,10 +155,8 @@ static int __diag_time_slice_end(struct kvm_vcpu *vcpu)
static int __diag_time_slice_end_directed(struct kvm_vcpu *vcpu)
{
- struct kvm *kvm = vcpu->kvm;
struct kvm_vcpu *tcpu;
int tid;
- int i;
tid = vcpu->run->s.regs.gprs[(vcpu->arch.sie_block->ipa & 0xf0) >> 4];
vcpu->stat.diagnose_9c++;
@@ -167,12 +165,9 @@ static int __diag_time_slice_end_directed(struct kvm_vcpu *vcpu)
if (tid == vcpu->vcpu_id)
return 0;
- kvm_for_each_vcpu(i, tcpu, kvm)
- if (tcpu->vcpu_id == tid) {
- kvm_vcpu_yield_to(tcpu);
- break;
- }
-
+ tcpu = kvm_get_vcpu_by_id(vcpu->kvm, tid);
+ if (tcpu)
+ kvm_vcpu_yield_to(tcpu);
return 0;
}
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index 73cbb41..9649a42 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -2257,7 +2257,7 @@ static int create_vcpu_fd(struct kvm_vcpu *vcpu)
static int kvm_vm_ioctl_create_vcpu(struct kvm *kvm, u32 id)
{
int r;
- struct kvm_vcpu *vcpu, *v;
+ struct kvm_vcpu *vcpu;
if (id >= KVM_MAX_VCPUS)
return -EINVAL;
@@ -2281,12 +2281,10 @@ static int kvm_vm_ioctl_create_vcpu(struct kvm *kvm, u32 id)
r = -EINVAL;
goto unlock_vcpu_destroy;
}
-
- kvm_for_each_vcpu(r, v, kvm)
- if (v->vcpu_id == id) {
- r = -EEXIST;
- goto unlock_vcpu_destroy;
- }
+ if (kvm_get_vcpu_by_id(kvm, id)) {
+ r = -EEXIST;
+ goto unlock_vcpu_destroy;
+ }
BUG_ON(kvm->vcpus[atomic_read(&kvm->online_vcpus)]);
--
2.3.0
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [GIT PULL 02/23] KVM: use heuristic for fast VCPU lookup by id
2015-12-02 11:06 [GIT PULL 00/23] KVM: s390 features, kvm_get_vcpu_by_id and stat for 4.5 Christian Borntraeger
2015-12-02 11:06 ` [GIT PULL 01/23] KVM: Use common function for VCPU lookup by id Christian Borntraeger
@ 2015-12-02 11:06 ` Christian Borntraeger
2015-12-02 11:06 ` [GIT PULL 03/23] KVM: Remove unnecessary debugfs dentry references Christian Borntraeger
` (21 subsequent siblings)
23 siblings, 0 replies; 29+ messages in thread
From: Christian Borntraeger @ 2015-12-02 11:06 UTC (permalink / raw)
To: Paolo Bonzini
Cc: KVM, linux-s390, Cornelia Huck, Jens Freimann, Alexander Graf
From: David Hildenbrand <dahi@linux.vnet.ibm.com>
Usually, VCPU ids match the array index. So let's try a fast
lookup first before falling back to the slow iteration.
Suggested-by: Christian Borntraeger <borntraeger@de.ibm.com>
Reviewed-by: Dominik Dingel <dingel@linux.vnet.ibm.com>
Reviewed-by: Christian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: David Hildenbrand <dahi@linux.vnet.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
---
include/linux/kvm_host.h | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
index 2911919..a754fc0 100644
--- a/include/linux/kvm_host.h
+++ b/include/linux/kvm_host.h
@@ -472,6 +472,11 @@ static inline struct kvm_vcpu *kvm_get_vcpu_by_id(struct kvm *kvm, int id)
struct kvm_vcpu *vcpu;
int i;
+ if (id < 0 || id >= KVM_MAX_VCPUS)
+ return NULL;
+ vcpu = kvm_get_vcpu(kvm, id);
+ if (vcpu && vcpu->vcpu_id == id)
+ return vcpu;
kvm_for_each_vcpu(i, vcpu, kvm)
if (vcpu->vcpu_id == id)
return vcpu;
--
2.3.0
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [GIT PULL 03/23] KVM: Remove unnecessary debugfs dentry references
2015-12-02 11:06 [GIT PULL 00/23] KVM: s390 features, kvm_get_vcpu_by_id and stat for 4.5 Christian Borntraeger
2015-12-02 11:06 ` [GIT PULL 01/23] KVM: Use common function for VCPU lookup by id Christian Borntraeger
2015-12-02 11:06 ` [GIT PULL 02/23] KVM: use heuristic for fast " Christian Borntraeger
@ 2015-12-02 11:06 ` Christian Borntraeger
2015-12-02 11:06 ` [GIT PULL 04/23] KVM: s390: rewrite vcpu_post_run and drop out early Christian Borntraeger
` (20 subsequent siblings)
23 siblings, 0 replies; 29+ messages in thread
From: Christian Borntraeger @ 2015-12-02 11:06 UTC (permalink / raw)
To: Paolo Bonzini
Cc: KVM, linux-s390, Cornelia Huck, Jens Freimann, Alexander Graf
From: Janosch Frank <frankja@linux.vnet.ibm.com>
KVM creates debugfs files to export VM statistics to userland. To be
able to remove them on kvm exit it tracks the files' dentries.
Since their parent directory is also tracked and since each parent
direntry knows its children we can easily remove them by using
debugfs_remove_recursive(kvm_debugfs_dir). Therefore we don't
need the extra tracking in the kvm_stats_debugfs_item anymore.
Signed-off-by: Janosch Frank <frankja@linux.vnet.ibm.com>
Reviewed-By: Sascha Silbe <silbe@linux.vnet.ibm.com>
Acked-by: Christian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
---
include/linux/kvm_host.h | 1 -
virt/kvm/kvm_main.c | 18 ++++--------------
2 files changed, 4 insertions(+), 15 deletions(-)
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
index a754fc0..590c46e 100644
--- a/include/linux/kvm_host.h
+++ b/include/linux/kvm_host.h
@@ -1016,7 +1016,6 @@ struct kvm_stats_debugfs_item {
const char *name;
int offset;
enum kvm_stat_kind kind;
- struct dentry *dentry;
};
extern struct kvm_stats_debugfs_item debugfs_entries[];
extern struct dentry *kvm_debugfs_dir;
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index 9649a42..be3cef1 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -3447,10 +3447,9 @@ static int kvm_init_debug(void)
goto out;
for (p = debugfs_entries; p->name; ++p) {
- p->dentry = debugfs_create_file(p->name, 0444, kvm_debugfs_dir,
- (void *)(long)p->offset,
- stat_fops[p->kind]);
- if (p->dentry == NULL)
+ if (!debugfs_create_file(p->name, 0444, kvm_debugfs_dir,
+ (void *)(long)p->offset,
+ stat_fops[p->kind]))
goto out_dir;
}
@@ -3462,15 +3461,6 @@ out:
return r;
}
-static void kvm_exit_debug(void)
-{
- struct kvm_stats_debugfs_item *p;
-
- for (p = debugfs_entries; p->name; ++p)
- debugfs_remove(p->dentry);
- debugfs_remove(kvm_debugfs_dir);
-}
-
static int kvm_suspend(void)
{
if (kvm_usage_count)
@@ -3628,7 +3618,7 @@ EXPORT_SYMBOL_GPL(kvm_init);
void kvm_exit(void)
{
- kvm_exit_debug();
+ debugfs_remove_recursive(kvm_debugfs_dir);
misc_deregister(&kvm_dev);
kmem_cache_destroy(kvm_vcpu_cache);
kvm_async_pf_deinit();
--
2.3.0
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [GIT PULL 04/23] KVM: s390: rewrite vcpu_post_run and drop out early
2015-12-02 11:06 [GIT PULL 00/23] KVM: s390 features, kvm_get_vcpu_by_id and stat for 4.5 Christian Borntraeger
` (2 preceding siblings ...)
2015-12-02 11:06 ` [GIT PULL 03/23] KVM: Remove unnecessary debugfs dentry references Christian Borntraeger
@ 2015-12-02 11:06 ` Christian Borntraeger
2015-12-02 12:20 ` Paolo Bonzini
2015-12-02 11:06 ` [GIT PULL 05/23] s390/sclp: introduce checks for ESCA and HVS Christian Borntraeger
` (19 subsequent siblings)
23 siblings, 1 reply; 29+ messages in thread
From: Christian Borntraeger @ 2015-12-02 11:06 UTC (permalink / raw)
To: Paolo Bonzini
Cc: KVM, linux-s390, Cornelia Huck, Jens Freimann, Alexander Graf
From: David Hildenbrand <dahi@linux.vnet.ibm.com>
Let's rewrite this function to better reflect how we actually handle
exit_code. By dropping out early we can save a few cycles. This
especially speeds up sie exits caused by host irqs.
Also, let's move the special -EOPNOTSUPP for intercepts to
the place where it belongs and convert it to -EREMOTE.
Reviewed-by: Dominik Dingel <dingel@linux.vnet.ibm.com>
Reviewed-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Signed-off-by: David Hildenbrand <dahi@linux.vnet.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
---
arch/s390/kvm/intercept.c | 7 +++---
arch/s390/kvm/kvm-s390.c | 59 +++++++++++++++++------------------------------
2 files changed, 24 insertions(+), 42 deletions(-)
diff --git a/arch/s390/kvm/intercept.c b/arch/s390/kvm/intercept.c
index b4a5aa1..d53c107 100644
--- a/arch/s390/kvm/intercept.c
+++ b/arch/s390/kvm/intercept.c
@@ -54,9 +54,6 @@ void kvm_s390_rewind_psw(struct kvm_vcpu *vcpu, int ilc)
static int handle_noop(struct kvm_vcpu *vcpu)
{
switch (vcpu->arch.sie_block->icptcode) {
- case 0x0:
- vcpu->stat.exit_null++;
- break;
case 0x10:
vcpu->stat.exit_external_request++;
break;
@@ -338,8 +335,10 @@ static int handle_partial_execution(struct kvm_vcpu *vcpu)
int kvm_handle_sie_intercept(struct kvm_vcpu *vcpu)
{
+ if (kvm_is_ucontrol(vcpu->kvm))
+ return -EOPNOTSUPP;
+
switch (vcpu->arch.sie_block->icptcode) {
- case 0x00:
case 0x10:
case 0x18:
return handle_noop(vcpu);
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c
index 8465892..5c36c8e 100644
--- a/arch/s390/kvm/kvm-s390.c
+++ b/arch/s390/kvm/kvm-s390.c
@@ -2071,8 +2071,6 @@ static int vcpu_post_run_fault_in_sie(struct kvm_vcpu *vcpu)
static int vcpu_post_run(struct kvm_vcpu *vcpu, int exit_reason)
{
- int rc = -1;
-
VCPU_EVENT(vcpu, 6, "exit sie icptcode %d",
vcpu->arch.sie_block->icptcode);
trace_kvm_s390_sie_exit(vcpu, vcpu->arch.sie_block->icptcode);
@@ -2080,40 +2078,35 @@ static int vcpu_post_run(struct kvm_vcpu *vcpu, int exit_reason)
if (guestdbg_enabled(vcpu))
kvm_s390_restore_guest_per_regs(vcpu);
- if (exit_reason >= 0) {
- rc = 0;
+ memcpy(&vcpu->run->s.regs.gprs[14], &vcpu->arch.sie_block->gg14, 16);
+
+ if (vcpu->arch.sie_block->icptcode > 0) {
+ int rc = kvm_handle_sie_intercept(vcpu);
+
+ if (rc != -EOPNOTSUPP)
+ return rc;
+ vcpu->run->exit_reason = KVM_EXIT_S390_SIEIC;
+ vcpu->run->s390_sieic.icptcode = vcpu->arch.sie_block->icptcode;
+ vcpu->run->s390_sieic.ipa = vcpu->arch.sie_block->ipa;
+ vcpu->run->s390_sieic.ipb = vcpu->arch.sie_block->ipb;
+ return -EREMOTE;
+ } else if (exit_reason != -EFAULT) {
+ vcpu->stat.exit_null++;
+ return 0;
} else if (kvm_is_ucontrol(vcpu->kvm)) {
vcpu->run->exit_reason = KVM_EXIT_S390_UCONTROL;
vcpu->run->s390_ucontrol.trans_exc_code =
current->thread.gmap_addr;
vcpu->run->s390_ucontrol.pgm_code = 0x10;
- rc = -EREMOTE;
-
+ return -EREMOTE;
} else if (current->thread.gmap_pfault) {
trace_kvm_s390_major_guest_pfault(vcpu);
current->thread.gmap_pfault = 0;
- if (kvm_arch_setup_async_pf(vcpu)) {
- rc = 0;
- } else {
- gpa_t gpa = current->thread.gmap_addr;
- rc = kvm_arch_fault_in_page(vcpu, gpa, 1);
- }
+ if (kvm_arch_setup_async_pf(vcpu))
+ return 0;
+ return kvm_arch_fault_in_page(vcpu, current->thread.gmap_addr, 1);
}
-
- if (rc == -1)
- rc = vcpu_post_run_fault_in_sie(vcpu);
-
- memcpy(&vcpu->run->s.regs.gprs[14], &vcpu->arch.sie_block->gg14, 16);
-
- if (rc == 0) {
- if (kvm_is_ucontrol(vcpu->kvm))
- /* Don't exit for host interrupts. */
- rc = vcpu->arch.sie_block->icptcode ? -EOPNOTSUPP : 0;
- else
- rc = kvm_handle_sie_intercept(vcpu);
- }
-
- return rc;
+ return vcpu_post_run_fault_in_sie(vcpu);
}
static int __vcpu_run(struct kvm_vcpu *vcpu)
@@ -2233,18 +2226,8 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
rc = 0;
}
- if (rc == -EOPNOTSUPP) {
- /* intercept cannot be handled in-kernel, prepare kvm-run */
- kvm_run->exit_reason = KVM_EXIT_S390_SIEIC;
- kvm_run->s390_sieic.icptcode = vcpu->arch.sie_block->icptcode;
- kvm_run->s390_sieic.ipa = vcpu->arch.sie_block->ipa;
- kvm_run->s390_sieic.ipb = vcpu->arch.sie_block->ipb;
- rc = 0;
- }
-
if (rc == -EREMOTE) {
- /* intercept was handled, but userspace support is needed
- * kvm_run has been prepared by the handler */
+ /* userspace support is needed, kvm_run has been prepared */
rc = 0;
}
--
2.3.0
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [GIT PULL 05/23] s390/sclp: introduce checks for ESCA and HVS
2015-12-02 11:06 [GIT PULL 00/23] KVM: s390 features, kvm_get_vcpu_by_id and stat for 4.5 Christian Borntraeger
` (3 preceding siblings ...)
2015-12-02 11:06 ` [GIT PULL 04/23] KVM: s390: rewrite vcpu_post_run and drop out early Christian Borntraeger
@ 2015-12-02 11:06 ` Christian Borntraeger
2015-12-02 11:06 ` [GIT PULL 06/23] KVM: s390: Generalize access to IPTE controls Christian Borntraeger
` (18 subsequent siblings)
23 siblings, 0 replies; 29+ messages in thread
From: Christian Borntraeger @ 2015-12-02 11:06 UTC (permalink / raw)
To: Paolo Bonzini
Cc: KVM, linux-s390, Cornelia Huck, Jens Freimann, Alexander Graf
From: "Eugene (jno) Dvurechenski" <jno@linux.vnet.ibm.com>
Introduce sclp.has_hvs and sclp.has_esca to provide a way for kvm to check
whether the extended-SCA and the home-virtual-SCA facilities are available.
Signed-off-by: Eugene (jno) Dvurechenski <jno@linux.vnet.ibm.com>
Reviewed-by: David Hildenbrand <dahi@linux.vnet.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
---
arch/s390/include/asm/sclp.h | 2 ++
drivers/s390/char/sclp_early.c | 7 ++++++-
2 files changed, 8 insertions(+), 1 deletion(-)
diff --git a/arch/s390/include/asm/sclp.h b/arch/s390/include/asm/sclp.h
index 821dde5..8324abb 100644
--- a/arch/s390/include/asm/sclp.h
+++ b/arch/s390/include/asm/sclp.h
@@ -53,6 +53,8 @@ struct sclp_info {
unsigned char has_sigpif : 1;
unsigned char has_core_type : 1;
unsigned char has_sprp : 1;
+ unsigned char has_hvs : 1;
+ unsigned char has_esca : 1;
unsigned int ibc;
unsigned int mtid;
unsigned int mtid_cp;
diff --git a/drivers/s390/char/sclp_early.c b/drivers/s390/char/sclp_early.c
index 7bc6df3..ff1e1bb 100644
--- a/drivers/s390/char/sclp_early.c
+++ b/drivers/s390/char/sclp_early.c
@@ -43,7 +43,10 @@ struct read_info_sccb {
u8 _pad_92[100 - 92]; /* 92-99 */
u32 rnsize2; /* 100-103 */
u64 rnmax2; /* 104-111 */
- u8 _pad_112[120 - 112]; /* 112-119 */
+ u8 _pad_112[116 - 112]; /* 112-115 */
+ u8 fac116; /* 116 */
+ u8 _pad_117[119 - 117]; /* 117-118 */
+ u8 fac119; /* 119 */
u16 hcpua; /* 120-121 */
u8 _pad_122[4096 - 122]; /* 122-4095 */
} __packed __aligned(PAGE_SIZE);
@@ -108,6 +111,8 @@ static void __init sclp_facilities_detect(struct read_info_sccb *sccb)
sclp.facilities = sccb->facilities;
sclp.has_sprp = !!(sccb->fac84 & 0x02);
sclp.has_core_type = !!(sccb->fac84 & 0x01);
+ sclp.has_esca = !!(sccb->fac116 & 0x08);
+ sclp.has_hvs = !!(sccb->fac119 & 0x80);
if (sccb->fac85 & 0x02)
S390_lowcore.machine_flags |= MACHINE_FLAG_ESOP;
sclp.rnmax = sccb->rnmax ? sccb->rnmax : sccb->rnmax2;
--
2.3.0
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [GIT PULL 06/23] KVM: s390: Generalize access to IPTE controls
2015-12-02 11:06 [GIT PULL 00/23] KVM: s390 features, kvm_get_vcpu_by_id and stat for 4.5 Christian Borntraeger
` (4 preceding siblings ...)
2015-12-02 11:06 ` [GIT PULL 05/23] s390/sclp: introduce checks for ESCA and HVS Christian Borntraeger
@ 2015-12-02 11:06 ` Christian Borntraeger
2015-12-02 11:06 ` [GIT PULL 07/23] KVM: s390: Generalize access to SIGP controls Christian Borntraeger
` (17 subsequent siblings)
23 siblings, 0 replies; 29+ messages in thread
From: Christian Borntraeger @ 2015-12-02 11:06 UTC (permalink / raw)
To: Paolo Bonzini
Cc: KVM, linux-s390, Cornelia Huck, Jens Freimann, Alexander Graf
From: "Eugene (jno) Dvurechenski" <jno@linux.vnet.ibm.com>
This patch generalizes access to the IPTE controls, which is a part of SCA.
This is to prepare for upcoming introduction of Extended SCA support.
Signed-off-by: Eugene (jno) Dvurechenski <jno@linux.vnet.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
---
arch/s390/kvm/gaccess.c | 10 +++++-----
arch/s390/kvm/kvm-s390.h | 5 +++++
2 files changed, 10 insertions(+), 5 deletions(-)
diff --git a/arch/s390/kvm/gaccess.c b/arch/s390/kvm/gaccess.c
index a7559f7..06f7edb 100644
--- a/arch/s390/kvm/gaccess.c
+++ b/arch/s390/kvm/gaccess.c
@@ -259,7 +259,7 @@ struct aste {
int ipte_lock_held(struct kvm_vcpu *vcpu)
{
- union ipte_control *ic = &vcpu->kvm->arch.sca->ipte_control;
+ union ipte_control *ic = kvm_s390_get_ipte_control(vcpu->kvm);
if (vcpu->arch.sie_block->eca & 1)
return ic->kh != 0;
@@ -274,7 +274,7 @@ static void ipte_lock_simple(struct kvm_vcpu *vcpu)
vcpu->kvm->arch.ipte_lock_count++;
if (vcpu->kvm->arch.ipte_lock_count > 1)
goto out;
- ic = &vcpu->kvm->arch.sca->ipte_control;
+ ic = kvm_s390_get_ipte_control(vcpu->kvm);
do {
old = READ_ONCE(*ic);
while (old.k) {
@@ -296,7 +296,7 @@ static void ipte_unlock_simple(struct kvm_vcpu *vcpu)
vcpu->kvm->arch.ipte_lock_count--;
if (vcpu->kvm->arch.ipte_lock_count)
goto out;
- ic = &vcpu->kvm->arch.sca->ipte_control;
+ ic = kvm_s390_get_ipte_control(vcpu->kvm);
do {
old = READ_ONCE(*ic);
new = old;
@@ -311,7 +311,7 @@ static void ipte_lock_siif(struct kvm_vcpu *vcpu)
{
union ipte_control old, new, *ic;
- ic = &vcpu->kvm->arch.sca->ipte_control;
+ ic = kvm_s390_get_ipte_control(vcpu->kvm);
do {
old = READ_ONCE(*ic);
while (old.kg) {
@@ -328,7 +328,7 @@ static void ipte_unlock_siif(struct kvm_vcpu *vcpu)
{
union ipte_control old, new, *ic;
- ic = &vcpu->kvm->arch.sca->ipte_control;
+ ic = kvm_s390_get_ipte_control(vcpu->kvm);
do {
old = READ_ONCE(*ic);
new = old;
diff --git a/arch/s390/kvm/kvm-s390.h b/arch/s390/kvm/kvm-s390.h
index 1e70e00..844f711 100644
--- a/arch/s390/kvm/kvm-s390.h
+++ b/arch/s390/kvm/kvm-s390.h
@@ -340,4 +340,9 @@ void kvm_s390_clear_bp_data(struct kvm_vcpu *vcpu);
void kvm_s390_prepare_debug_exit(struct kvm_vcpu *vcpu);
void kvm_s390_handle_per_event(struct kvm_vcpu *vcpu);
+/* support for Basic/Extended SCA handling */
+static inline union ipte_control *kvm_s390_get_ipte_control(struct kvm *kvm)
+{
+ return &kvm->arch.sca->ipte_control;
+}
#endif
--
2.3.0
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [GIT PULL 07/23] KVM: s390: Generalize access to SIGP controls
2015-12-02 11:06 [GIT PULL 00/23] KVM: s390 features, kvm_get_vcpu_by_id and stat for 4.5 Christian Borntraeger
` (5 preceding siblings ...)
2015-12-02 11:06 ` [GIT PULL 06/23] KVM: s390: Generalize access to IPTE controls Christian Borntraeger
@ 2015-12-02 11:06 ` Christian Borntraeger
2015-12-02 11:06 ` [GIT PULL 08/23] KVM: s390: Provide SCA-aware helpers for VCPU add/del Christian Borntraeger
` (16 subsequent siblings)
23 siblings, 0 replies; 29+ messages in thread
From: Christian Borntraeger @ 2015-12-02 11:06 UTC (permalink / raw)
To: Paolo Bonzini
Cc: KVM, linux-s390, Cornelia Huck, Jens Freimann, Alexander Graf
From: "Eugene (jno) Dvurechenski" <jno@linux.vnet.ibm.com>
This patch generalizes access to the SIGP controls, which is a part of SCA.
This is to prepare for upcoming introduction of Extended SCA support.
Signed-off-by: Eugene (jno) Dvurechenski <jno@linux.vnet.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
---
arch/s390/kvm/interrupt.c | 72 +++++++++++++++++++++++++++++------------------
1 file changed, 45 insertions(+), 27 deletions(-)
diff --git a/arch/s390/kvm/interrupt.c b/arch/s390/kvm/interrupt.c
index 6a75352..2a4718a 100644
--- a/arch/s390/kvm/interrupt.c
+++ b/arch/s390/kvm/interrupt.c
@@ -34,6 +34,45 @@
#define PFAULT_DONE 0x0680
#define VIRTIO_PARAM 0x0d00
+/* handle external calls via sigp interpretation facility */
+static int sca_ext_call_pending(struct kvm_vcpu *vcpu, int *src_id)
+{
+ struct sca_block *sca = vcpu->kvm->arch.sca;
+ uint8_t sigp_ctrl = sca->cpu[vcpu->vcpu_id].sigp_ctrl;
+
+ if (src_id)
+ *src_id = sigp_ctrl & SIGP_CTRL_SCN_MASK;
+
+ return sigp_ctrl & SIGP_CTRL_C &&
+ atomic_read(&vcpu->arch.sie_block->cpuflags) &
+ CPUSTAT_ECALL_PEND;
+}
+
+static int sca_inject_ext_call(struct kvm_vcpu *vcpu, int src_id)
+{
+ struct sca_block *sca = vcpu->kvm->arch.sca;
+ uint8_t *sigp_ctrl = &(sca->cpu[vcpu->vcpu_id].sigp_ctrl);
+ uint8_t new_val = SIGP_CTRL_C | (src_id & SIGP_CTRL_SCN_MASK);
+ uint8_t old_val = *sigp_ctrl & ~SIGP_CTRL_C;
+
+ if (cmpxchg(sigp_ctrl, old_val, new_val) != old_val) {
+ /* another external call is pending */
+ return -EBUSY;
+ }
+ atomic_or(CPUSTAT_ECALL_PEND, &vcpu->arch.sie_block->cpuflags);
+ return 0;
+}
+
+static void sca_clear_ext_call(struct kvm_vcpu *vcpu)
+{
+ struct sca_block *sca = vcpu->kvm->arch.sca;
+ struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int;
+ uint8_t *sigp_ctrl = &(sca->cpu[vcpu->vcpu_id].sigp_ctrl);
+
+ atomic_andnot(CPUSTAT_ECALL_PEND, li->cpuflags);
+ *sigp_ctrl = 0;
+}
+
int psw_extint_disabled(struct kvm_vcpu *vcpu)
{
return !(vcpu->arch.sie_block->gpsw.mask & PSW_MASK_EXT);
@@ -792,13 +831,11 @@ static const deliver_irq_t deliver_irq_funcs[] = {
int kvm_s390_ext_call_pending(struct kvm_vcpu *vcpu)
{
struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int;
- uint8_t sigp_ctrl = vcpu->kvm->arch.sca->cpu[vcpu->vcpu_id].sigp_ctrl;
if (!sclp.has_sigpif)
return test_bit(IRQ_PEND_EXT_EXTERNAL, &li->pending_irqs);
- return (sigp_ctrl & SIGP_CTRL_C) &&
- (atomic_read(&vcpu->arch.sie_block->cpuflags) & CPUSTAT_ECALL_PEND);
+ return sca_ext_call_pending(vcpu, NULL);
}
int kvm_s390_vcpu_has_irq(struct kvm_vcpu *vcpu, int exclude_stop)
@@ -909,9 +946,7 @@ void kvm_s390_clear_local_irqs(struct kvm_vcpu *vcpu)
memset(&li->irq, 0, sizeof(li->irq));
spin_unlock(&li->lock);
- /* clear pending external calls set by sigp interpretation facility */
- atomic_andnot(CPUSTAT_ECALL_PEND, li->cpuflags);
- vcpu->kvm->arch.sca->cpu[vcpu->vcpu_id].sigp_ctrl = 0;
+ sca_clear_ext_call(vcpu);
}
int __must_check kvm_s390_deliver_pending_interrupts(struct kvm_vcpu *vcpu)
@@ -1003,21 +1038,6 @@ static int __inject_pfault_init(struct kvm_vcpu *vcpu, struct kvm_s390_irq *irq)
return 0;
}
-static int __inject_extcall_sigpif(struct kvm_vcpu *vcpu, uint16_t src_id)
-{
- unsigned char new_val, old_val;
- uint8_t *sigp_ctrl = &vcpu->kvm->arch.sca->cpu[vcpu->vcpu_id].sigp_ctrl;
-
- new_val = SIGP_CTRL_C | (src_id & SIGP_CTRL_SCN_MASK);
- old_val = *sigp_ctrl & ~SIGP_CTRL_C;
- if (cmpxchg(sigp_ctrl, old_val, new_val) != old_val) {
- /* another external call is pending */
- return -EBUSY;
- }
- atomic_or(CPUSTAT_ECALL_PEND, &vcpu->arch.sie_block->cpuflags);
- return 0;
-}
-
static int __inject_extcall(struct kvm_vcpu *vcpu, struct kvm_s390_irq *irq)
{
struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int;
@@ -1034,7 +1054,7 @@ static int __inject_extcall(struct kvm_vcpu *vcpu, struct kvm_s390_irq *irq)
return -EINVAL;
if (sclp.has_sigpif)
- return __inject_extcall_sigpif(vcpu, src_id);
+ return sca_inject_ext_call(vcpu, src_id);
if (test_and_set_bit(IRQ_PEND_EXT_EXTERNAL, &li->pending_irqs))
return -EBUSY;
@@ -2203,7 +2223,7 @@ static void store_local_irq(struct kvm_s390_local_interrupt *li,
int kvm_s390_get_irq_state(struct kvm_vcpu *vcpu, __u8 __user *buf, int len)
{
- uint8_t sigp_ctrl = vcpu->kvm->arch.sca->cpu[vcpu->vcpu_id].sigp_ctrl;
+ int scn;
unsigned long sigp_emerg_pending[BITS_TO_LONGS(KVM_MAX_VCPUS)];
struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int;
unsigned long pending_irqs;
@@ -2243,14 +2263,12 @@ int kvm_s390_get_irq_state(struct kvm_vcpu *vcpu, __u8 __user *buf, int len)
}
}
- if ((sigp_ctrl & SIGP_CTRL_C) &&
- (atomic_read(&vcpu->arch.sie_block->cpuflags) &
- CPUSTAT_ECALL_PEND)) {
+ if (sca_ext_call_pending(vcpu, &scn)) {
if (n + sizeof(irq) > len)
return -ENOBUFS;
memset(&irq, 0, sizeof(irq));
irq.type = KVM_S390_INT_EXTERNAL_CALL;
- irq.u.extcall.code = sigp_ctrl & SIGP_CTRL_SCN_MASK;
+ irq.u.extcall.code = scn;
if (copy_to_user(&buf[n], &irq, sizeof(irq)))
return -EFAULT;
n += sizeof(irq);
--
2.3.0
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [GIT PULL 08/23] KVM: s390: Provide SCA-aware helpers for VCPU add/del
2015-12-02 11:06 [GIT PULL 00/23] KVM: s390 features, kvm_get_vcpu_by_id and stat for 4.5 Christian Borntraeger
` (6 preceding siblings ...)
2015-12-02 11:06 ` [GIT PULL 07/23] KVM: s390: Generalize access to SIGP controls Christian Borntraeger
@ 2015-12-02 11:06 ` Christian Borntraeger
2015-12-02 11:06 ` [GIT PULL 09/23] KVM: s390: Introduce new structures Christian Borntraeger
` (15 subsequent siblings)
23 siblings, 0 replies; 29+ messages in thread
From: Christian Borntraeger @ 2015-12-02 11:06 UTC (permalink / raw)
To: Paolo Bonzini
Cc: KVM, linux-s390, Cornelia Huck, Jens Freimann, Alexander Graf
From: "Eugene (jno) Dvurechenski" <jno@linux.vnet.ibm.com>
This patch provides SCA-aware helpers to create/delete a VCPU.
This is to prepare for upcoming introduction of Extended SCA support.
Signed-off-by: Eugene (jno) Dvurechenski <jno@linux.vnet.ibm.com>
Reviewed-by: David Hildenbrand <dahi@linux.vnet.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
---
arch/s390/kvm/kvm-s390.c | 44 +++++++++++++++++++++++++++++++-------------
1 file changed, 31 insertions(+), 13 deletions(-)
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c
index 5c36c8e..8ddd488 100644
--- a/arch/s390/kvm/kvm-s390.c
+++ b/arch/s390/kvm/kvm-s390.c
@@ -283,6 +283,8 @@ static void kvm_s390_sync_dirty_log(struct kvm *kvm,
}
/* Section: vm related */
+static void sca_del_vcpu(struct kvm_vcpu *vcpu);
+
/*
* Get (and clear) the dirty memory log for a memory slot.
*/
@@ -1189,11 +1191,7 @@ void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu)
kvm_s390_clear_local_irqs(vcpu);
kvm_clear_async_pf_completion_queue(vcpu);
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;
+ sca_del_vcpu(vcpu);
}
smp_mb();
@@ -1249,6 +1247,32 @@ static int __kvm_ucontrol_vcpu_init(struct kvm_vcpu *vcpu)
return 0;
}
+static void sca_del_vcpu(struct kvm_vcpu *vcpu)
+{
+ struct sca_block *sca = vcpu->kvm->arch.sca;
+
+ clear_bit_inv(vcpu->vcpu_id, (unsigned long *) &sca->mcn);
+ if (sca->cpu[vcpu->vcpu_id].sda == (__u64) vcpu->arch.sie_block)
+ sca->cpu[vcpu->vcpu_id].sda = 0;
+}
+
+static void sca_add_vcpu(struct kvm_vcpu *vcpu, struct kvm *kvm,
+ unsigned int id)
+{
+ struct sca_block *sca = kvm->arch.sca;
+
+ if (!sca->cpu[id].sda)
+ sca->cpu[id].sda = (__u64) vcpu->arch.sie_block;
+ vcpu->arch.sie_block->scaoh = (__u32)(((__u64)sca) >> 32);
+ vcpu->arch.sie_block->scaol = (__u32)(__u64)sca;
+ set_bit_inv(id, (unsigned long *) &sca->mcn);
+}
+
+static int sca_can_add_vcpu(struct kvm *kvm, unsigned int id)
+{
+ return id < KVM_MAX_VCPUS;
+}
+
int kvm_arch_vcpu_init(struct kvm_vcpu *vcpu)
{
vcpu->arch.pfault_token = KVM_S390_PFAULT_TOKEN_INVALID;
@@ -1465,7 +1489,7 @@ struct kvm_vcpu *kvm_arch_vcpu_create(struct kvm *kvm,
struct sie_page *sie_page;
int rc = -EINVAL;
- if (id >= KVM_MAX_VCPUS)
+ if (!sca_can_add_vcpu(kvm, id))
goto out;
rc = -ENOMEM;
@@ -1487,13 +1511,7 @@ struct kvm_vcpu *kvm_arch_vcpu_create(struct kvm *kvm,
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);
+ sca_add_vcpu(vcpu, kvm, id);
}
spin_lock_init(&vcpu->arch.local_int.lock);
--
2.3.0
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [GIT PULL 09/23] KVM: s390: Introduce new structures
2015-12-02 11:06 [GIT PULL 00/23] KVM: s390 features, kvm_get_vcpu_by_id and stat for 4.5 Christian Borntraeger
` (7 preceding siblings ...)
2015-12-02 11:06 ` [GIT PULL 08/23] KVM: s390: Provide SCA-aware helpers for VCPU add/del Christian Borntraeger
@ 2015-12-02 11:06 ` Christian Borntraeger
2015-12-02 11:06 ` [GIT PULL 10/23] KVM: s390: Make provisions for ESCA utilization Christian Borntraeger
` (14 subsequent siblings)
23 siblings, 0 replies; 29+ messages in thread
From: Christian Borntraeger @ 2015-12-02 11:06 UTC (permalink / raw)
To: Paolo Bonzini
Cc: KVM, linux-s390, Cornelia Huck, Jens Freimann, Alexander Graf
From: "Eugene (jno) Dvurechenski" <jno@linux.vnet.ibm.com>
This patch adds new structures and updates some existing ones to
provide the base for Extended SCA functionality.
The old sca_* structures were renamed to bsca_* to keep things uniform.
The access to fields of SIGP controls were turned into bitfields instead
of hardcoded bitmasks.
Signed-off-by: Eugene (jno) Dvurechenski <jno@linux.vnet.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
---
arch/s390/include/asm/kvm_host.h | 47 +++++++++++++++++++++++++++++++++++-----
arch/s390/kvm/interrupt.c | 31 ++++++++++++++++----------
arch/s390/kvm/kvm-s390.c | 14 ++++++------
arch/s390/kvm/kvm-s390.h | 4 +++-
4 files changed, 70 insertions(+), 26 deletions(-)
diff --git a/arch/s390/include/asm/kvm_host.h b/arch/s390/include/asm/kvm_host.h
index efaac2c..923b13d 100644
--- a/arch/s390/include/asm/kvm_host.h
+++ b/arch/s390/include/asm/kvm_host.h
@@ -25,7 +25,9 @@
#include <asm/fpu/api.h>
#include <asm/isc.h>
-#define KVM_MAX_VCPUS 64
+#define KVM_S390_BSCA_CPU_SLOTS 64
+#define KVM_S390_ESCA_CPU_SLOTS 248
+#define KVM_MAX_VCPUS KVM_S390_BSCA_CPU_SLOTS
#define KVM_USER_MEM_SLOTS 32
/*
@@ -40,9 +42,34 @@
#define SIGP_CTRL_C 0x80
#define SIGP_CTRL_SCN_MASK 0x3f
-struct sca_entry {
+union bsca_sigp_ctrl {
+ __u8 value;
+ struct {
+ __u8 c : 1;
+ __u8 r : 1;
+ __u8 scn : 6;
+ };
+} __packed;
+
+union esca_sigp_ctrl {
+ __u16 value;
+ struct {
+ __u8 c : 1;
+ __u8 reserved: 7;
+ __u8 scn;
+ };
+} __packed;
+
+struct esca_entry {
+ union esca_sigp_ctrl sigp_ctrl;
+ __u16 reserved1[3];
+ __u64 sda;
+ __u64 reserved2[6];
+} __packed;
+
+struct bsca_entry {
__u8 reserved0;
- __u8 sigp_ctrl;
+ union bsca_sigp_ctrl sigp_ctrl;
__u16 reserved[3];
__u64 sda;
__u64 reserved2[2];
@@ -57,14 +84,22 @@ union ipte_control {
};
};
-struct sca_block {
+struct bsca_block {
union ipte_control ipte_control;
__u64 reserved[5];
__u64 mcn;
__u64 reserved2;
- struct sca_entry cpu[64];
+ struct bsca_entry cpu[KVM_S390_BSCA_CPU_SLOTS];
} __attribute__((packed));
+struct esca_block {
+ union ipte_control ipte_control;
+ __u64 reserved1[7];
+ __u64 mcn[4];
+ __u64 reserved2[20];
+ struct esca_entry cpu[KVM_S390_ESCA_CPU_SLOTS];
+} __packed;
+
#define CPUSTAT_STOPPED 0x80000000
#define CPUSTAT_WAIT 0x10000000
#define CPUSTAT_ECALL_PEND 0x08000000
@@ -585,7 +620,7 @@ struct kvm_s390_crypto_cb {
};
struct kvm_arch{
- struct sca_block *sca;
+ struct bsca_block *sca;
debug_info_t *dbf;
struct kvm_s390_float_interrupt float_int;
struct kvm_device *flic;
diff --git a/arch/s390/kvm/interrupt.c b/arch/s390/kvm/interrupt.c
index 2a4718a..aa221a4 100644
--- a/arch/s390/kvm/interrupt.c
+++ b/arch/s390/kvm/interrupt.c
@@ -37,25 +37,32 @@
/* handle external calls via sigp interpretation facility */
static int sca_ext_call_pending(struct kvm_vcpu *vcpu, int *src_id)
{
- struct sca_block *sca = vcpu->kvm->arch.sca;
- uint8_t sigp_ctrl = sca->cpu[vcpu->vcpu_id].sigp_ctrl;
+ struct bsca_block *sca = vcpu->kvm->arch.sca;
+ union bsca_sigp_ctrl sigp_ctrl = sca->cpu[vcpu->vcpu_id].sigp_ctrl;
if (src_id)
- *src_id = sigp_ctrl & SIGP_CTRL_SCN_MASK;
+ *src_id = sigp_ctrl.scn;
- return sigp_ctrl & SIGP_CTRL_C &&
+ return sigp_ctrl.c &&
atomic_read(&vcpu->arch.sie_block->cpuflags) &
CPUSTAT_ECALL_PEND;
}
static int sca_inject_ext_call(struct kvm_vcpu *vcpu, int src_id)
{
- struct sca_block *sca = vcpu->kvm->arch.sca;
- uint8_t *sigp_ctrl = &(sca->cpu[vcpu->vcpu_id].sigp_ctrl);
- uint8_t new_val = SIGP_CTRL_C | (src_id & SIGP_CTRL_SCN_MASK);
- uint8_t old_val = *sigp_ctrl & ~SIGP_CTRL_C;
+ int expect, rc;
+ struct bsca_block *sca = vcpu->kvm->arch.sca;
+ union bsca_sigp_ctrl *sigp_ctrl = &(sca->cpu[vcpu->vcpu_id].sigp_ctrl);
+ union bsca_sigp_ctrl new_val = {0}, old_val = *sigp_ctrl;
- if (cmpxchg(sigp_ctrl, old_val, new_val) != old_val) {
+ new_val.scn = src_id;
+ new_val.c = 1;
+ old_val.c = 0;
+
+ expect = old_val.value;
+ rc = cmpxchg(&sigp_ctrl->value, old_val.value, new_val.value);
+
+ if (rc != expect) {
/* another external call is pending */
return -EBUSY;
}
@@ -65,12 +72,12 @@ static int sca_inject_ext_call(struct kvm_vcpu *vcpu, int src_id)
static void sca_clear_ext_call(struct kvm_vcpu *vcpu)
{
- struct sca_block *sca = vcpu->kvm->arch.sca;
+ struct bsca_block *sca = vcpu->kvm->arch.sca;
struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int;
- uint8_t *sigp_ctrl = &(sca->cpu[vcpu->vcpu_id].sigp_ctrl);
+ union bsca_sigp_ctrl *sigp_ctrl = &(sca->cpu[vcpu->vcpu_id].sigp_ctrl);
atomic_andnot(CPUSTAT_ECALL_PEND, li->cpuflags);
- *sigp_ctrl = 0;
+ sigp_ctrl->value = 0;
}
int psw_extint_disabled(struct kvm_vcpu *vcpu)
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c
index 8ddd488..c268352 100644
--- a/arch/s390/kvm/kvm-s390.c
+++ b/arch/s390/kvm/kvm-s390.c
@@ -1100,14 +1100,15 @@ int kvm_arch_init_vm(struct kvm *kvm, unsigned long type)
rc = -ENOMEM;
- kvm->arch.sca = (struct sca_block *) get_zeroed_page(GFP_KERNEL);
+ kvm->arch.sca = (struct bsca_block *) get_zeroed_page(GFP_KERNEL);
if (!kvm->arch.sca)
goto out_err;
spin_lock(&kvm_lock);
sca_offset += 16;
- if (sca_offset + sizeof(struct sca_block) > PAGE_SIZE)
+ if (sca_offset + sizeof(struct bsca_block) > PAGE_SIZE)
sca_offset = 0;
- kvm->arch.sca = (struct sca_block *) ((char *) kvm->arch.sca + sca_offset);
+ kvm->arch.sca = (struct bsca_block *)
+ ((char *) kvm->arch.sca + sca_offset);
spin_unlock(&kvm_lock);
sprintf(debug_name, "kvm-%u", current->pid);
@@ -1190,9 +1191,8 @@ void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu)
trace_kvm_s390_destroy_vcpu(vcpu->vcpu_id);
kvm_s390_clear_local_irqs(vcpu);
kvm_clear_async_pf_completion_queue(vcpu);
- if (!kvm_is_ucontrol(vcpu->kvm)) {
+ if (!kvm_is_ucontrol(vcpu->kvm))
sca_del_vcpu(vcpu);
- }
smp_mb();
if (kvm_is_ucontrol(vcpu->kvm))
@@ -1249,7 +1249,7 @@ static int __kvm_ucontrol_vcpu_init(struct kvm_vcpu *vcpu)
static void sca_del_vcpu(struct kvm_vcpu *vcpu)
{
- struct sca_block *sca = vcpu->kvm->arch.sca;
+ struct bsca_block *sca = vcpu->kvm->arch.sca;
clear_bit_inv(vcpu->vcpu_id, (unsigned long *) &sca->mcn);
if (sca->cpu[vcpu->vcpu_id].sda == (__u64) vcpu->arch.sie_block)
@@ -1259,7 +1259,7 @@ static void sca_del_vcpu(struct kvm_vcpu *vcpu)
static void sca_add_vcpu(struct kvm_vcpu *vcpu, struct kvm *kvm,
unsigned int id)
{
- struct sca_block *sca = kvm->arch.sca;
+ struct bsca_block *sca = kvm->arch.sca;
if (!sca->cpu[id].sda)
sca->cpu[id].sda = (__u64) vcpu->arch.sie_block;
diff --git a/arch/s390/kvm/kvm-s390.h b/arch/s390/kvm/kvm-s390.h
index 844f711..df1abad 100644
--- a/arch/s390/kvm/kvm-s390.h
+++ b/arch/s390/kvm/kvm-s390.h
@@ -343,6 +343,8 @@ void kvm_s390_handle_per_event(struct kvm_vcpu *vcpu);
/* support for Basic/Extended SCA handling */
static inline union ipte_control *kvm_s390_get_ipte_control(struct kvm *kvm)
{
- return &kvm->arch.sca->ipte_control;
+ struct bsca_block *sca = kvm->arch.sca; /* SCA version doesn't matter */
+
+ return &sca->ipte_control;
}
#endif
--
2.3.0
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [GIT PULL 10/23] KVM: s390: Make provisions for ESCA utilization
2015-12-02 11:06 [GIT PULL 00/23] KVM: s390 features, kvm_get_vcpu_by_id and stat for 4.5 Christian Borntraeger
` (8 preceding siblings ...)
2015-12-02 11:06 ` [GIT PULL 09/23] KVM: s390: Introduce new structures Christian Borntraeger
@ 2015-12-02 11:06 ` Christian Borntraeger
2015-12-02 11:06 ` [GIT PULL 11/23] KVM: s390: Introduce switching code Christian Borntraeger
` (13 subsequent siblings)
23 siblings, 0 replies; 29+ messages in thread
From: Christian Borntraeger @ 2015-12-02 11:06 UTC (permalink / raw)
To: Paolo Bonzini
Cc: KVM, linux-s390, Cornelia Huck, Jens Freimann, Alexander Graf
From: "Eugene (jno) Dvurechenski" <jno@linux.vnet.ibm.com>
This patch updates the routines (sca_*) to provide transparent access
to and manipulation on the data for both Basic and Extended SCA in use.
The kvm.arch.sca is generalized to (void *) to handle BSCA/ESCA cases.
Also the kvm.arch.use_esca flag is provided.
The actual functionality is kept the same.
Signed-off-by: Eugene (jno) Dvurechenski <jno@linux.vnet.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
---
arch/s390/include/asm/kvm_host.h | 3 +-
arch/s390/kvm/interrupt.c | 78 +++++++++++++++++++++++++++++++---------
arch/s390/kvm/kvm-s390.c | 54 +++++++++++++++++++++-------
3 files changed, 106 insertions(+), 29 deletions(-)
diff --git a/arch/s390/include/asm/kvm_host.h b/arch/s390/include/asm/kvm_host.h
index 923b13d..25fdbf8 100644
--- a/arch/s390/include/asm/kvm_host.h
+++ b/arch/s390/include/asm/kvm_host.h
@@ -620,7 +620,8 @@ struct kvm_s390_crypto_cb {
};
struct kvm_arch{
- struct bsca_block *sca;
+ void *sca;
+ int use_esca;
debug_info_t *dbf;
struct kvm_s390_float_interrupt float_int;
struct kvm_device *flic;
diff --git a/arch/s390/kvm/interrupt.c b/arch/s390/kvm/interrupt.c
index aa221a4..60b36b0 100644
--- a/arch/s390/kvm/interrupt.c
+++ b/arch/s390/kvm/interrupt.c
@@ -37,30 +37,60 @@
/* handle external calls via sigp interpretation facility */
static int sca_ext_call_pending(struct kvm_vcpu *vcpu, int *src_id)
{
- struct bsca_block *sca = vcpu->kvm->arch.sca;
- union bsca_sigp_ctrl sigp_ctrl = sca->cpu[vcpu->vcpu_id].sigp_ctrl;
+ int c, scn;
+
+ if (vcpu->kvm->arch.use_esca) {
+ struct esca_block *sca = vcpu->kvm->arch.sca;
+ union esca_sigp_ctrl sigp_ctrl =
+ sca->cpu[vcpu->vcpu_id].sigp_ctrl;
+
+ c = sigp_ctrl.c;
+ scn = sigp_ctrl.scn;
+ } else {
+ struct bsca_block *sca = vcpu->kvm->arch.sca;
+ union bsca_sigp_ctrl sigp_ctrl =
+ sca->cpu[vcpu->vcpu_id].sigp_ctrl;
+
+ c = sigp_ctrl.c;
+ scn = sigp_ctrl.scn;
+ }
if (src_id)
- *src_id = sigp_ctrl.scn;
+ *src_id = scn;
- return sigp_ctrl.c &&
- atomic_read(&vcpu->arch.sie_block->cpuflags) &
+ return c && atomic_read(&vcpu->arch.sie_block->cpuflags) &
CPUSTAT_ECALL_PEND;
}
static int sca_inject_ext_call(struct kvm_vcpu *vcpu, int src_id)
{
int expect, rc;
- struct bsca_block *sca = vcpu->kvm->arch.sca;
- union bsca_sigp_ctrl *sigp_ctrl = &(sca->cpu[vcpu->vcpu_id].sigp_ctrl);
- union bsca_sigp_ctrl new_val = {0}, old_val = *sigp_ctrl;
- new_val.scn = src_id;
- new_val.c = 1;
- old_val.c = 0;
+ if (vcpu->kvm->arch.use_esca) {
+ struct esca_block *sca = vcpu->kvm->arch.sca;
+ union esca_sigp_ctrl *sigp_ctrl =
+ &(sca->cpu[vcpu->vcpu_id].sigp_ctrl);
+ union esca_sigp_ctrl new_val = {0}, old_val = *sigp_ctrl;
- expect = old_val.value;
- rc = cmpxchg(&sigp_ctrl->value, old_val.value, new_val.value);
+ new_val.scn = src_id;
+ new_val.c = 1;
+ old_val.c = 0;
+
+ expect = old_val.value;
+ rc = cmpxchg(&sigp_ctrl->value, old_val.value, new_val.value);
+ } else {
+ struct bsca_block *sca = vcpu->kvm->arch.sca;
+ union bsca_sigp_ctrl *sigp_ctrl =
+ &(sca->cpu[vcpu->vcpu_id].sigp_ctrl);
+ union bsca_sigp_ctrl new_val = {0}, old_val = *sigp_ctrl;
+
+ new_val.scn = src_id;
+ new_val.c = 1;
+ old_val.c = 0;
+
+ expect = old_val.value;
+ rc = cmpxchg(&sigp_ctrl->value, old_val.value, new_val.value);
+ }
if (rc != expect) {
/* another external call is pending */
@@ -72,12 +102,28 @@ static int sca_inject_ext_call(struct kvm_vcpu *vcpu, int src_id)
static void sca_clear_ext_call(struct kvm_vcpu *vcpu)
{
- struct bsca_block *sca = vcpu->kvm->arch.sca;
struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int;
- union bsca_sigp_ctrl *sigp_ctrl = &(sca->cpu[vcpu->vcpu_id].sigp_ctrl);
+ int rc, expect;
atomic_andnot(CPUSTAT_ECALL_PEND, li->cpuflags);
- sigp_ctrl->value = 0;
+ if (vcpu->kvm->arch.use_esca) {
+ struct esca_block *sca = vcpu->kvm->arch.sca;
+ union esca_sigp_ctrl *sigp_ctrl =
+ &(sca->cpu[vcpu->vcpu_id].sigp_ctrl);
+ union esca_sigp_ctrl old = *sigp_ctrl;
+
+ expect = old.value;
+ rc = cmpxchg(&sigp_ctrl->value, old.value, 0);
+ } else {
+ struct bsca_block *sca = vcpu->kvm->arch.sca;
+ union bsca_sigp_ctrl *sigp_ctrl =
+ &(sca->cpu[vcpu->vcpu_id].sigp_ctrl);
+ union bsca_sigp_ctrl old = *sigp_ctrl;
+
+ expect = old.value;
+ rc = cmpxchg(&sigp_ctrl->value, old.value, 0);
+ }
+ WARN_ON(rc != expect); /* cannot clear? */
}
int psw_extint_disabled(struct kvm_vcpu *vcpu)
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c
index c268352..41b3fed 100644
--- a/arch/s390/kvm/kvm-s390.c
+++ b/arch/s390/kvm/kvm-s390.c
@@ -1077,6 +1077,15 @@ static int kvm_s390_crypto_init(struct kvm *kvm)
return 0;
}
+static void sca_dispose(struct kvm *kvm)
+{
+ if (kvm->arch.use_esca)
+ BUG(); /* not implemented yet */
+ else
+ free_page((unsigned long)(kvm->arch.sca));
+ kvm->arch.sca = NULL;
+}
+
int kvm_arch_init_vm(struct kvm *kvm, unsigned long type)
{
int i, rc;
@@ -1100,6 +1109,7 @@ int kvm_arch_init_vm(struct kvm *kvm, unsigned long type)
rc = -ENOMEM;
+ kvm->arch.use_esca = 0; /* start with basic SCA */
kvm->arch.sca = (struct bsca_block *) get_zeroed_page(GFP_KERNEL);
if (!kvm->arch.sca)
goto out_err;
@@ -1180,7 +1190,7 @@ out_err:
kfree(kvm->arch.crypto.crycb);
free_page((unsigned long)kvm->arch.model.fac);
debug_unregister(kvm->arch.dbf);
- free_page((unsigned long)(kvm->arch.sca));
+ sca_dispose(kvm);
KVM_EVENT(3, "creation of vm failed: %d", rc);
return rc;
}
@@ -1226,7 +1236,7 @@ void kvm_arch_destroy_vm(struct kvm *kvm)
{
kvm_free_vcpus(kvm);
free_page((unsigned long)kvm->arch.model.fac);
- free_page((unsigned long)(kvm->arch.sca));
+ sca_dispose(kvm);
debug_unregister(kvm->arch.dbf);
kfree(kvm->arch.crypto.crycb);
if (!kvm_is_ucontrol(kvm))
@@ -1249,23 +1259,41 @@ static int __kvm_ucontrol_vcpu_init(struct kvm_vcpu *vcpu)
static void sca_del_vcpu(struct kvm_vcpu *vcpu)
{
- struct bsca_block *sca = vcpu->kvm->arch.sca;
+ if (vcpu->kvm->arch.use_esca) {
+ struct esca_block *sca = vcpu->kvm->arch.sca;
- clear_bit_inv(vcpu->vcpu_id, (unsigned long *) &sca->mcn);
- if (sca->cpu[vcpu->vcpu_id].sda == (__u64) vcpu->arch.sie_block)
- sca->cpu[vcpu->vcpu_id].sda = 0;
+ clear_bit_inv(vcpu->vcpu_id, (unsigned long *) sca->mcn);
+ if (sca->cpu[vcpu->vcpu_id].sda == (__u64) vcpu->arch.sie_block)
+ sca->cpu[vcpu->vcpu_id].sda = 0;
+ } else {
+ struct bsca_block *sca = vcpu->kvm->arch.sca;
+
+ clear_bit_inv(vcpu->vcpu_id, (unsigned long *) &sca->mcn);
+ if (sca->cpu[vcpu->vcpu_id].sda == (__u64) vcpu->arch.sie_block)
+ sca->cpu[vcpu->vcpu_id].sda = 0;
+ }
}
static void sca_add_vcpu(struct kvm_vcpu *vcpu, struct kvm *kvm,
unsigned int id)
{
- struct bsca_block *sca = kvm->arch.sca;
+ if (kvm->arch.use_esca) {
+ struct esca_block *sca = kvm->arch.sca;
- if (!sca->cpu[id].sda)
- sca->cpu[id].sda = (__u64) vcpu->arch.sie_block;
- vcpu->arch.sie_block->scaoh = (__u32)(((__u64)sca) >> 32);
- vcpu->arch.sie_block->scaol = (__u32)(__u64)sca;
- set_bit_inv(id, (unsigned long *) &sca->mcn);
+ if (!sca->cpu[id].sda)
+ sca->cpu[id].sda = (__u64) vcpu->arch.sie_block;
+ vcpu->arch.sie_block->scaoh = (__u32)(((__u64)sca) >> 32);
+ vcpu->arch.sie_block->scaol = (__u32)(__u64)sca & ~0x3fU;
+ set_bit_inv(id, (unsigned long *) sca->mcn);
+ } else {
+ struct bsca_block *sca = kvm->arch.sca;
+
+ if (!sca->cpu[id].sda)
+ sca->cpu[id].sda = (__u64) vcpu->arch.sie_block;
+ vcpu->arch.sie_block->scaoh = (__u32)(((__u64)sca) >> 32);
+ vcpu->arch.sie_block->scaol = (__u32)(__u64)sca;
+ set_bit_inv(id, (unsigned long *) &sca->mcn);
+ }
}
static int sca_can_add_vcpu(struct kvm *kvm, unsigned int id)
@@ -1458,6 +1486,8 @@ int kvm_arch_vcpu_setup(struct kvm_vcpu *vcpu)
vcpu->arch.sie_block->ecb |= 0x10;
vcpu->arch.sie_block->ecb2 = 8;
+ if (vcpu->kvm->arch.use_esca)
+ vcpu->arch.sie_block->ecb2 |= 4;
vcpu->arch.sie_block->eca = 0xC1002000U;
if (sclp.has_siif)
vcpu->arch.sie_block->eca |= 1;
--
2.3.0
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [GIT PULL 11/23] KVM: s390: Introduce switching code
2015-12-02 11:06 [GIT PULL 00/23] KVM: s390 features, kvm_get_vcpu_by_id and stat for 4.5 Christian Borntraeger
` (9 preceding siblings ...)
2015-12-02 11:06 ` [GIT PULL 10/23] KVM: s390: Make provisions for ESCA utilization Christian Borntraeger
@ 2015-12-02 11:06 ` Christian Borntraeger
2015-12-02 11:06 ` [GIT PULL 12/23] KVM: s390: Enable up to 248 VCPUs per VM Christian Borntraeger
` (12 subsequent siblings)
23 siblings, 0 replies; 29+ messages in thread
From: Christian Borntraeger @ 2015-12-02 11:06 UTC (permalink / raw)
To: Paolo Bonzini
Cc: KVM, linux-s390, Cornelia Huck, Jens Freimann, Alexander Graf
From: "Eugene (jno) Dvurechenski" <jno@linux.vnet.ibm.com>
This patch adds code that performs transparent switch to Extended
SCA on addition of 65th VCPU in a VM. Disposal of ESCA is added too.
The entier ESCA functionality, however, is still not enabled.
The enablement will be provided in a separate patch.
This patch also uses read/write lock protection of SCA and its subfields for
possible disposal at the BSCA-to-ESCA transition. While only Basic SCA needs such
a protection (for the swap), any SCA access is now guarded.
Signed-off-by: Eugene (jno) Dvurechenski <jno@linux.vnet.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
---
arch/s390/include/asm/kvm_host.h | 1 +
arch/s390/kvm/gaccess.c | 30 ++++++++++++----
arch/s390/kvm/interrupt.c | 6 ++++
arch/s390/kvm/kvm-s390.c | 75 ++++++++++++++++++++++++++++++++++++++--
4 files changed, 103 insertions(+), 9 deletions(-)
diff --git a/arch/s390/include/asm/kvm_host.h b/arch/s390/include/asm/kvm_host.h
index 25fdbf8..86c3386 100644
--- a/arch/s390/include/asm/kvm_host.h
+++ b/arch/s390/include/asm/kvm_host.h
@@ -622,6 +622,7 @@ struct kvm_s390_crypto_cb {
struct kvm_arch{
void *sca;
int use_esca;
+ rwlock_t sca_lock;
debug_info_t *dbf;
struct kvm_s390_float_interrupt float_int;
struct kvm_device *flic;
diff --git a/arch/s390/kvm/gaccess.c b/arch/s390/kvm/gaccess.c
index 06f7edb..d30db40 100644
--- a/arch/s390/kvm/gaccess.c
+++ b/arch/s390/kvm/gaccess.c
@@ -259,10 +259,14 @@ struct aste {
int ipte_lock_held(struct kvm_vcpu *vcpu)
{
- union ipte_control *ic = kvm_s390_get_ipte_control(vcpu->kvm);
+ if (vcpu->arch.sie_block->eca & 1) {
+ int rc;
- if (vcpu->arch.sie_block->eca & 1)
- return ic->kh != 0;
+ read_lock(&vcpu->kvm->arch.sca_lock);
+ rc = kvm_s390_get_ipte_control(vcpu->kvm)->kh != 0;
+ read_unlock(&vcpu->kvm->arch.sca_lock);
+ return rc;
+ }
return vcpu->kvm->arch.ipte_lock_count != 0;
}
@@ -274,16 +278,20 @@ static void ipte_lock_simple(struct kvm_vcpu *vcpu)
vcpu->kvm->arch.ipte_lock_count++;
if (vcpu->kvm->arch.ipte_lock_count > 1)
goto out;
+retry:
+ read_lock(&vcpu->kvm->arch.sca_lock);
ic = kvm_s390_get_ipte_control(vcpu->kvm);
do {
old = READ_ONCE(*ic);
- while (old.k) {
+ if (old.k) {
+ read_unlock(&vcpu->kvm->arch.sca_lock);
cond_resched();
- old = READ_ONCE(*ic);
+ goto retry;
}
new = old;
new.k = 1;
} while (cmpxchg(&ic->val, old.val, new.val) != old.val);
+ read_unlock(&vcpu->kvm->arch.sca_lock);
out:
mutex_unlock(&vcpu->kvm->arch.ipte_mutex);
}
@@ -296,12 +304,14 @@ static void ipte_unlock_simple(struct kvm_vcpu *vcpu)
vcpu->kvm->arch.ipte_lock_count--;
if (vcpu->kvm->arch.ipte_lock_count)
goto out;
+ read_lock(&vcpu->kvm->arch.sca_lock);
ic = kvm_s390_get_ipte_control(vcpu->kvm);
do {
old = READ_ONCE(*ic);
new = old;
new.k = 0;
} while (cmpxchg(&ic->val, old.val, new.val) != old.val);
+ read_unlock(&vcpu->kvm->arch.sca_lock);
wake_up(&vcpu->kvm->arch.ipte_wq);
out:
mutex_unlock(&vcpu->kvm->arch.ipte_mutex);
@@ -311,23 +321,28 @@ static void ipte_lock_siif(struct kvm_vcpu *vcpu)
{
union ipte_control old, new, *ic;
+retry:
+ read_lock(&vcpu->kvm->arch.sca_lock);
ic = kvm_s390_get_ipte_control(vcpu->kvm);
do {
old = READ_ONCE(*ic);
- while (old.kg) {
+ if (old.kg) {
+ read_unlock(&vcpu->kvm->arch.sca_lock);
cond_resched();
- old = READ_ONCE(*ic);
+ goto retry;
}
new = old;
new.k = 1;
new.kh++;
} while (cmpxchg(&ic->val, old.val, new.val) != old.val);
+ read_unlock(&vcpu->kvm->arch.sca_lock);
}
static void ipte_unlock_siif(struct kvm_vcpu *vcpu)
{
union ipte_control old, new, *ic;
+ read_lock(&vcpu->kvm->arch.sca_lock);
ic = kvm_s390_get_ipte_control(vcpu->kvm);
do {
old = READ_ONCE(*ic);
@@ -336,6 +351,7 @@ static void ipte_unlock_siif(struct kvm_vcpu *vcpu)
if (!new.kh)
new.k = 0;
} while (cmpxchg(&ic->val, old.val, new.val) != old.val);
+ read_unlock(&vcpu->kvm->arch.sca_lock);
if (!new.kh)
wake_up(&vcpu->kvm->arch.ipte_wq);
}
diff --git a/arch/s390/kvm/interrupt.c b/arch/s390/kvm/interrupt.c
index 60b36b0..831c9ac 100644
--- a/arch/s390/kvm/interrupt.c
+++ b/arch/s390/kvm/interrupt.c
@@ -39,6 +39,7 @@ static int sca_ext_call_pending(struct kvm_vcpu *vcpu, int *src_id)
{
int c, scn;
+ read_lock(&vcpu->kvm->arch.sca_lock);
if (vcpu->kvm->arch.use_esca) {
struct esca_block *sca = vcpu->kvm->arch.sca;
union esca_sigp_ctrl sigp_ctrl =
@@ -54,6 +55,7 @@ static int sca_ext_call_pending(struct kvm_vcpu *vcpu, int *src_id)
c = sigp_ctrl.c;
scn = sigp_ctrl.scn;
}
+ read_unlock(&vcpu->kvm->arch.sca_lock);
if (src_id)
*src_id = scn;
@@ -66,6 +68,7 @@ static int sca_inject_ext_call(struct kvm_vcpu *vcpu, int src_id)
{
int expect, rc;
+ read_lock(&vcpu->kvm->arch.sca_lock);
if (vcpu->kvm->arch.use_esca) {
struct esca_block *sca = vcpu->kvm->arch.sca;
union esca_sigp_ctrl *sigp_ctrl =
@@ -91,6 +94,7 @@ static int sca_inject_ext_call(struct kvm_vcpu *vcpu, int src_id)
expect = old_val.value;
rc = cmpxchg(&sigp_ctrl->value, old_val.value, new_val.value);
}
+ read_unlock(&vcpu->kvm->arch.sca_lock);
if (rc != expect) {
/* another external call is pending */
@@ -106,6 +110,7 @@ static void sca_clear_ext_call(struct kvm_vcpu *vcpu)
int rc, expect;
atomic_andnot(CPUSTAT_ECALL_PEND, li->cpuflags);
+ read_lock(&vcpu->kvm->arch.sca_lock);
if (vcpu->kvm->arch.use_esca) {
struct esca_block *sca = vcpu->kvm->arch.sca;
union esca_sigp_ctrl *sigp_ctrl =
@@ -123,6 +128,7 @@ static void sca_clear_ext_call(struct kvm_vcpu *vcpu)
expect = old.value;
rc = cmpxchg(&sigp_ctrl->value, old.value, 0);
}
+ read_unlock(&vcpu->kvm->arch.sca_lock);
WARN_ON(rc != expect); /* cannot clear? */
}
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c
index 41b3fed..5e884aa 100644
--- a/arch/s390/kvm/kvm-s390.c
+++ b/arch/s390/kvm/kvm-s390.c
@@ -1080,7 +1080,7 @@ static int kvm_s390_crypto_init(struct kvm *kvm)
static void sca_dispose(struct kvm *kvm)
{
if (kvm->arch.use_esca)
- BUG(); /* not implemented yet */
+ free_pages_exact(kvm->arch.sca, sizeof(struct esca_block));
else
free_page((unsigned long)(kvm->arch.sca));
kvm->arch.sca = NULL;
@@ -1110,6 +1110,7 @@ int kvm_arch_init_vm(struct kvm *kvm, unsigned long type)
rc = -ENOMEM;
kvm->arch.use_esca = 0; /* start with basic SCA */
+ rwlock_init(&kvm->arch.sca_lock);
kvm->arch.sca = (struct bsca_block *) get_zeroed_page(GFP_KERNEL);
if (!kvm->arch.sca)
goto out_err;
@@ -1259,6 +1260,7 @@ static int __kvm_ucontrol_vcpu_init(struct kvm_vcpu *vcpu)
static void sca_del_vcpu(struct kvm_vcpu *vcpu)
{
+ read_lock(&vcpu->kvm->arch.sca_lock);
if (vcpu->kvm->arch.use_esca) {
struct esca_block *sca = vcpu->kvm->arch.sca;
@@ -1272,11 +1274,13 @@ static void sca_del_vcpu(struct kvm_vcpu *vcpu)
if (sca->cpu[vcpu->vcpu_id].sda == (__u64) vcpu->arch.sie_block)
sca->cpu[vcpu->vcpu_id].sda = 0;
}
+ read_unlock(&vcpu->kvm->arch.sca_lock);
}
static void sca_add_vcpu(struct kvm_vcpu *vcpu, struct kvm *kvm,
unsigned int id)
{
+ read_lock(&kvm->arch.sca_lock);
if (kvm->arch.use_esca) {
struct esca_block *sca = kvm->arch.sca;
@@ -1294,11 +1298,78 @@ static void sca_add_vcpu(struct kvm_vcpu *vcpu, struct kvm *kvm,
vcpu->arch.sie_block->scaol = (__u32)(__u64)sca;
set_bit_inv(id, (unsigned long *) &sca->mcn);
}
+ read_unlock(&kvm->arch.sca_lock);
+}
+
+/* Basic SCA to Extended SCA data copy routines */
+static inline void sca_copy_entry(struct esca_entry *d, struct bsca_entry *s)
+{
+ d->sda = s->sda;
+ d->sigp_ctrl.c = s->sigp_ctrl.c;
+ d->sigp_ctrl.scn = s->sigp_ctrl.scn;
+}
+
+static void sca_copy_b_to_e(struct esca_block *d, struct bsca_block *s)
+{
+ int i;
+
+ d->ipte_control = s->ipte_control;
+ d->mcn[0] = s->mcn;
+ for (i = 0; i < KVM_S390_BSCA_CPU_SLOTS; i++)
+ sca_copy_entry(&d->cpu[i], &s->cpu[i]);
+}
+
+static int sca_switch_to_extended(struct kvm *kvm)
+{
+ struct bsca_block *old_sca = kvm->arch.sca;
+ struct esca_block *new_sca;
+ struct kvm_vcpu *vcpu;
+ unsigned int vcpu_idx;
+ u32 scaol, scaoh;
+
+ new_sca = alloc_pages_exact(sizeof(*new_sca), GFP_KERNEL|__GFP_ZERO);
+ if (!new_sca)
+ return -ENOMEM;
+
+ scaoh = (u32)((u64)(new_sca) >> 32);
+ scaol = (u32)(u64)(new_sca) & ~0x3fU;
+
+ kvm_s390_vcpu_block_all(kvm);
+ write_lock(&kvm->arch.sca_lock);
+
+ sca_copy_b_to_e(new_sca, old_sca);
+
+ kvm_for_each_vcpu(vcpu_idx, vcpu, kvm) {
+ vcpu->arch.sie_block->scaoh = scaoh;
+ vcpu->arch.sie_block->scaol = scaol;
+ vcpu->arch.sie_block->ecb2 |= 0x04U;
+ }
+ kvm->arch.sca = new_sca;
+ kvm->arch.use_esca = 1;
+
+ write_unlock(&kvm->arch.sca_lock);
+ kvm_s390_vcpu_unblock_all(kvm);
+
+ free_page((unsigned long)old_sca);
+
+ VM_EVENT(kvm, 2, "Switched to ESCA (%p -> %p)", old_sca, kvm->arch.sca);
+ return 0;
}
static int sca_can_add_vcpu(struct kvm *kvm, unsigned int id)
{
- return id < KVM_MAX_VCPUS;
+ int rc;
+
+ if (id < KVM_S390_BSCA_CPU_SLOTS)
+ return true;
+ if (!sclp.has_esca)
+ return false;
+
+ mutex_lock(&kvm->lock);
+ rc = kvm->arch.use_esca ? 0 : sca_switch_to_extended(kvm);
+ mutex_unlock(&kvm->lock);
+
+ return rc == 0 && id < KVM_S390_ESCA_CPU_SLOTS;
}
int kvm_arch_vcpu_init(struct kvm_vcpu *vcpu)
--
2.3.0
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [GIT PULL 12/23] KVM: s390: Enable up to 248 VCPUs per VM
2015-12-02 11:06 [GIT PULL 00/23] KVM: s390 features, kvm_get_vcpu_by_id and stat for 4.5 Christian Borntraeger
` (10 preceding siblings ...)
2015-12-02 11:06 ` [GIT PULL 11/23] KVM: s390: Introduce switching code Christian Borntraeger
@ 2015-12-02 11:06 ` Christian Borntraeger
2015-12-02 11:06 ` [GIT PULL 13/23] KVM: s390: fast path for sca_ext_call_pending Christian Borntraeger
` (11 subsequent siblings)
23 siblings, 0 replies; 29+ messages in thread
From: Christian Borntraeger @ 2015-12-02 11:06 UTC (permalink / raw)
To: Paolo Bonzini
Cc: KVM, linux-s390, Cornelia Huck, Jens Freimann, Alexander Graf
From: "Eugene (jno) Dvurechenski" <jno@linux.vnet.ibm.com>
This patch allows s390 to have more than 64 VCPUs for a guest (up to
248 for memory usage considerations), if supported by the underlaying
hardware (sclp.has_esca).
Signed-off-by: Eugene (jno) Dvurechenski <jno@linux.vnet.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
---
arch/s390/include/asm/kvm_host.h | 2 +-
arch/s390/kvm/kvm-s390.c | 3 ++-
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/arch/s390/include/asm/kvm_host.h b/arch/s390/include/asm/kvm_host.h
index 86c3386..12e9291 100644
--- a/arch/s390/include/asm/kvm_host.h
+++ b/arch/s390/include/asm/kvm_host.h
@@ -27,7 +27,7 @@
#define KVM_S390_BSCA_CPU_SLOTS 64
#define KVM_S390_ESCA_CPU_SLOTS 248
-#define KVM_MAX_VCPUS KVM_S390_BSCA_CPU_SLOTS
+#define KVM_MAX_VCPUS KVM_S390_ESCA_CPU_SLOTS
#define KVM_USER_MEM_SLOTS 32
/*
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c
index 5e884aa..16c19fb 100644
--- a/arch/s390/kvm/kvm-s390.c
+++ b/arch/s390/kvm/kvm-s390.c
@@ -246,7 +246,8 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext)
break;
case KVM_CAP_NR_VCPUS:
case KVM_CAP_MAX_VCPUS:
- r = KVM_MAX_VCPUS;
+ r = sclp.has_esca ? KVM_S390_ESCA_CPU_SLOTS
+ : KVM_S390_BSCA_CPU_SLOTS;
break;
case KVM_CAP_NR_MEMSLOTS:
r = KVM_USER_MEM_SLOTS;
--
2.3.0
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [GIT PULL 13/23] KVM: s390: fast path for sca_ext_call_pending
2015-12-02 11:06 [GIT PULL 00/23] KVM: s390 features, kvm_get_vcpu_by_id and stat for 4.5 Christian Borntraeger
` (11 preceding siblings ...)
2015-12-02 11:06 ` [GIT PULL 12/23] KVM: s390: Enable up to 248 VCPUs per VM Christian Borntraeger
@ 2015-12-02 11:06 ` Christian Borntraeger
2015-12-02 11:06 ` [GIT PULL 14/23] KVM: s390: we always have a SCA Christian Borntraeger
` (10 subsequent siblings)
23 siblings, 0 replies; 29+ messages in thread
From: Christian Borntraeger @ 2015-12-02 11:06 UTC (permalink / raw)
To: Paolo Bonzini
Cc: KVM, linux-s390, Cornelia Huck, Jens Freimann, Alexander Graf
From: David Hildenbrand <dahi@linux.vnet.ibm.com>
If CPUSTAT_ECALL_PEND isn't set, we can't have an external call pending,
so we can directly avoid taking the lock.
Acked-by: Christian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: David Hildenbrand <dahi@linux.vnet.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
---
arch/s390/kvm/interrupt.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/arch/s390/kvm/interrupt.c b/arch/s390/kvm/interrupt.c
index 831c9ac..62ec925 100644
--- a/arch/s390/kvm/interrupt.c
+++ b/arch/s390/kvm/interrupt.c
@@ -39,6 +39,9 @@ static int sca_ext_call_pending(struct kvm_vcpu *vcpu, int *src_id)
{
int c, scn;
+ if (!(atomic_read(&vcpu->arch.sie_block->cpuflags) & CPUSTAT_ECALL_PEND))
+ return 0;
+
read_lock(&vcpu->kvm->arch.sca_lock);
if (vcpu->kvm->arch.use_esca) {
struct esca_block *sca = vcpu->kvm->arch.sca;
@@ -60,8 +63,7 @@ static int sca_ext_call_pending(struct kvm_vcpu *vcpu, int *src_id)
if (src_id)
*src_id = scn;
- return c && atomic_read(&vcpu->arch.sie_block->cpuflags) &
- CPUSTAT_ECALL_PEND;
+ return c;
}
static int sca_inject_ext_call(struct kvm_vcpu *vcpu, int src_id)
--
2.3.0
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [GIT PULL 14/23] KVM: s390: we always have a SCA
2015-12-02 11:06 [GIT PULL 00/23] KVM: s390 features, kvm_get_vcpu_by_id and stat for 4.5 Christian Borntraeger
` (12 preceding siblings ...)
2015-12-02 11:06 ` [GIT PULL 13/23] KVM: s390: fast path for sca_ext_call_pending Christian Borntraeger
@ 2015-12-02 11:06 ` Christian Borntraeger
2015-12-02 11:06 ` [GIT PULL 15/23] KVM: s390: fix SCA related races and double use Christian Borntraeger
` (9 subsequent siblings)
23 siblings, 0 replies; 29+ messages in thread
From: Christian Borntraeger @ 2015-12-02 11:06 UTC (permalink / raw)
To: Paolo Bonzini
Cc: KVM, linux-s390, Cornelia Huck, Jens Freimann, Alexander Graf
From: David Hildenbrand <dahi@linux.vnet.ibm.com>
Having no sca can never happen, even when something goes wrong when
switching to ESCA. Otherwise we would have a serious bug.
Let's remove this superfluous check.
Acked-by: Dominik Dingel <dingel@linux.vnet.ibm.com>
Signed-off-by: David Hildenbrand <dahi@linux.vnet.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
---
arch/s390/kvm/kvm-s390.c | 7 +------
1 file changed, 1 insertion(+), 6 deletions(-)
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c
index 16c19fb..5c58127 100644
--- a/arch/s390/kvm/kvm-s390.c
+++ b/arch/s390/kvm/kvm-s390.c
@@ -1608,13 +1608,8 @@ struct kvm_vcpu *kvm_arch_vcpu_create(struct kvm *kvm,
vcpu->arch.sie_block->itdba = (unsigned long) &sie_page->itdb;
vcpu->arch.sie_block->icpua = id;
- if (!kvm_is_ucontrol(kvm)) {
- if (!kvm->arch.sca) {
- WARN_ON_ONCE(1);
- goto out_free_cpu;
- }
+ if (!kvm_is_ucontrol(kvm))
sca_add_vcpu(vcpu, kvm, id);
- }
spin_lock_init(&vcpu->arch.local_int.lock);
vcpu->arch.local_int.float_int = &kvm->arch.float_int;
--
2.3.0
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [GIT PULL 15/23] KVM: s390: fix SCA related races and double use
2015-12-02 11:06 [GIT PULL 00/23] KVM: s390 features, kvm_get_vcpu_by_id and stat for 4.5 Christian Borntraeger
` (13 preceding siblings ...)
2015-12-02 11:06 ` [GIT PULL 14/23] KVM: s390: we always have a SCA Christian Borntraeger
@ 2015-12-02 11:06 ` Christian Borntraeger
2015-12-02 11:06 ` [GIT PULL 16/23] KVM: s390: always set/clear the SCA sda field Christian Borntraeger
` (8 subsequent siblings)
23 siblings, 0 replies; 29+ messages in thread
From: Christian Borntraeger @ 2015-12-02 11:06 UTC (permalink / raw)
To: Paolo Bonzini
Cc: KVM, linux-s390, Cornelia Huck, Jens Freimann, Alexander Graf
From: David Hildenbrand <dahi@linux.vnet.ibm.com>
If something goes wrong in kvm_arch_vcpu_create, the VCPU has already
been added to the sca but will never be removed. Trying to create VCPUs
with duplicate ids (e.g. after a failed attempt) is problematic.
Also, when creating multiple VCPUs in parallel, we could theoretically
forget to set the correct SCA when the switch to ESCA happens just
before the VCPU is registered.
Let's add the VCPU to the SCA in kvm_arch_vcpu_postcreate, where we can
be sure that no duplicate VCPU with the same id is around and the VCPU
has already been registered at the VM. We also have to make sure to update
ECB at that point.
Signed-off-by: David Hildenbrand <dahi@linux.vnet.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
---
arch/s390/kvm/kvm-s390.c | 11 +++++------
1 file changed, 5 insertions(+), 6 deletions(-)
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c
index 5c58127..2ba5978 100644
--- a/arch/s390/kvm/kvm-s390.c
+++ b/arch/s390/kvm/kvm-s390.c
@@ -1289,6 +1289,7 @@ static void sca_add_vcpu(struct kvm_vcpu *vcpu, struct kvm *kvm,
sca->cpu[id].sda = (__u64) vcpu->arch.sie_block;
vcpu->arch.sie_block->scaoh = (__u32)(((__u64)sca) >> 32);
vcpu->arch.sie_block->scaol = (__u32)(__u64)sca & ~0x3fU;
+ vcpu->arch.sie_block->ecb2 |= 0x04U;
set_bit_inv(id, (unsigned long *) sca->mcn);
} else {
struct bsca_block *sca = kvm->arch.sca;
@@ -1493,8 +1494,11 @@ void kvm_arch_vcpu_postcreate(struct kvm_vcpu *vcpu)
vcpu->arch.sie_block->epoch = vcpu->kvm->arch.epoch;
preempt_enable();
mutex_unlock(&vcpu->kvm->lock);
- if (!kvm_is_ucontrol(vcpu->kvm))
+ if (!kvm_is_ucontrol(vcpu->kvm)) {
vcpu->arch.gmap = vcpu->kvm->arch.gmap;
+ sca_add_vcpu(vcpu, vcpu->kvm, vcpu->vcpu_id);
+ }
+
}
static void kvm_s390_vcpu_crypto_setup(struct kvm_vcpu *vcpu)
@@ -1558,8 +1562,6 @@ int kvm_arch_vcpu_setup(struct kvm_vcpu *vcpu)
vcpu->arch.sie_block->ecb |= 0x10;
vcpu->arch.sie_block->ecb2 = 8;
- if (vcpu->kvm->arch.use_esca)
- vcpu->arch.sie_block->ecb2 |= 4;
vcpu->arch.sie_block->eca = 0xC1002000U;
if (sclp.has_siif)
vcpu->arch.sie_block->eca |= 1;
@@ -1608,9 +1610,6 @@ struct kvm_vcpu *kvm_arch_vcpu_create(struct kvm *kvm,
vcpu->arch.sie_block->itdba = (unsigned long) &sie_page->itdb;
vcpu->arch.sie_block->icpua = id;
- if (!kvm_is_ucontrol(kvm))
- sca_add_vcpu(vcpu, kvm, id);
-
spin_lock_init(&vcpu->arch.local_int.lock);
vcpu->arch.local_int.float_int = &kvm->arch.float_int;
vcpu->arch.local_int.wq = &vcpu->wq;
--
2.3.0
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [GIT PULL 16/23] KVM: s390: always set/clear the SCA sda field
2015-12-02 11:06 [GIT PULL 00/23] KVM: s390 features, kvm_get_vcpu_by_id and stat for 4.5 Christian Borntraeger
` (14 preceding siblings ...)
2015-12-02 11:06 ` [GIT PULL 15/23] KVM: s390: fix SCA related races and double use Christian Borntraeger
@ 2015-12-02 11:06 ` Christian Borntraeger
2015-12-02 11:06 ` [GIT PULL 17/23] KVM: s390: cleanup sca_add_vcpu Christian Borntraeger
` (7 subsequent siblings)
23 siblings, 0 replies; 29+ messages in thread
From: Christian Borntraeger @ 2015-12-02 11:06 UTC (permalink / raw)
To: Paolo Bonzini
Cc: KVM, linux-s390, Cornelia Huck, Jens Freimann, Alexander Graf
From: David Hildenbrand <dahi@linux.vnet.ibm.com>
Let's always set and clear the sda when enabling/disabling a VCPU.
Dealing with sda being set to something else makes no sense anymore
as we enable a VCPU in the SCA now after it has been registered at
the VM.
Signed-off-by: David Hildenbrand <dahi@linux.vnet.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
---
arch/s390/kvm/kvm-s390.c | 12 ++++--------
1 file changed, 4 insertions(+), 8 deletions(-)
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c
index 2ba5978..7e0092b 100644
--- a/arch/s390/kvm/kvm-s390.c
+++ b/arch/s390/kvm/kvm-s390.c
@@ -1266,14 +1266,12 @@ static void sca_del_vcpu(struct kvm_vcpu *vcpu)
struct esca_block *sca = vcpu->kvm->arch.sca;
clear_bit_inv(vcpu->vcpu_id, (unsigned long *) sca->mcn);
- if (sca->cpu[vcpu->vcpu_id].sda == (__u64) vcpu->arch.sie_block)
- sca->cpu[vcpu->vcpu_id].sda = 0;
+ sca->cpu[vcpu->vcpu_id].sda = 0;
} else {
struct bsca_block *sca = vcpu->kvm->arch.sca;
clear_bit_inv(vcpu->vcpu_id, (unsigned long *) &sca->mcn);
- if (sca->cpu[vcpu->vcpu_id].sda == (__u64) vcpu->arch.sie_block)
- sca->cpu[vcpu->vcpu_id].sda = 0;
+ sca->cpu[vcpu->vcpu_id].sda = 0;
}
read_unlock(&vcpu->kvm->arch.sca_lock);
}
@@ -1285,8 +1283,7 @@ static void sca_add_vcpu(struct kvm_vcpu *vcpu, struct kvm *kvm,
if (kvm->arch.use_esca) {
struct esca_block *sca = kvm->arch.sca;
- if (!sca->cpu[id].sda)
- sca->cpu[id].sda = (__u64) vcpu->arch.sie_block;
+ sca->cpu[id].sda = (__u64) vcpu->arch.sie_block;
vcpu->arch.sie_block->scaoh = (__u32)(((__u64)sca) >> 32);
vcpu->arch.sie_block->scaol = (__u32)(__u64)sca & ~0x3fU;
vcpu->arch.sie_block->ecb2 |= 0x04U;
@@ -1294,8 +1291,7 @@ static void sca_add_vcpu(struct kvm_vcpu *vcpu, struct kvm *kvm,
} else {
struct bsca_block *sca = kvm->arch.sca;
- if (!sca->cpu[id].sda)
- sca->cpu[id].sda = (__u64) vcpu->arch.sie_block;
+ sca->cpu[id].sda = (__u64) vcpu->arch.sie_block;
vcpu->arch.sie_block->scaoh = (__u32)(((__u64)sca) >> 32);
vcpu->arch.sie_block->scaol = (__u32)(__u64)sca;
set_bit_inv(id, (unsigned long *) &sca->mcn);
--
2.3.0
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [GIT PULL 17/23] KVM: s390: cleanup sca_add_vcpu
2015-12-02 11:06 [GIT PULL 00/23] KVM: s390 features, kvm_get_vcpu_by_id and stat for 4.5 Christian Borntraeger
` (15 preceding siblings ...)
2015-12-02 11:06 ` [GIT PULL 16/23] KVM: s390: always set/clear the SCA sda field Christian Borntraeger
@ 2015-12-02 11:06 ` Christian Borntraeger
2015-12-02 11:06 ` [GIT PULL 18/23] KVM: s390: don't switch to ESCA for ucontrol Christian Borntraeger
` (6 subsequent siblings)
23 siblings, 0 replies; 29+ messages in thread
From: Christian Borntraeger @ 2015-12-02 11:06 UTC (permalink / raw)
To: Paolo Bonzini
Cc: KVM, linux-s390, Cornelia Huck, Jens Freimann, Alexander Graf
From: David Hildenbrand <dahi@linux.vnet.ibm.com>
Now that we already have kvm and the VCPU id set for the VCPU, we can
convert sda_add_vcpu to look much more like sda_del_vcpu.
Signed-off-by: David Hildenbrand <dahi@linux.vnet.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
---
arch/s390/kvm/kvm-s390.c | 23 +++++++++++------------
1 file changed, 11 insertions(+), 12 deletions(-)
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c
index 7e0092b..d9d71bb 100644
--- a/arch/s390/kvm/kvm-s390.c
+++ b/arch/s390/kvm/kvm-s390.c
@@ -1276,27 +1276,26 @@ static void sca_del_vcpu(struct kvm_vcpu *vcpu)
read_unlock(&vcpu->kvm->arch.sca_lock);
}
-static void sca_add_vcpu(struct kvm_vcpu *vcpu, struct kvm *kvm,
- unsigned int id)
+static void sca_add_vcpu(struct kvm_vcpu *vcpu)
{
- read_lock(&kvm->arch.sca_lock);
- if (kvm->arch.use_esca) {
- struct esca_block *sca = kvm->arch.sca;
+ read_lock(&vcpu->kvm->arch.sca_lock);
+ if (vcpu->kvm->arch.use_esca) {
+ struct esca_block *sca = vcpu->kvm->arch.sca;
- sca->cpu[id].sda = (__u64) vcpu->arch.sie_block;
+ sca->cpu[vcpu->vcpu_id].sda = (__u64) vcpu->arch.sie_block;
vcpu->arch.sie_block->scaoh = (__u32)(((__u64)sca) >> 32);
vcpu->arch.sie_block->scaol = (__u32)(__u64)sca & ~0x3fU;
vcpu->arch.sie_block->ecb2 |= 0x04U;
- set_bit_inv(id, (unsigned long *) sca->mcn);
+ set_bit_inv(vcpu->vcpu_id, (unsigned long *) sca->mcn);
} else {
- struct bsca_block *sca = kvm->arch.sca;
+ struct bsca_block *sca = vcpu->kvm->arch.sca;
- sca->cpu[id].sda = (__u64) vcpu->arch.sie_block;
+ sca->cpu[vcpu->vcpu_id].sda = (__u64) vcpu->arch.sie_block;
vcpu->arch.sie_block->scaoh = (__u32)(((__u64)sca) >> 32);
vcpu->arch.sie_block->scaol = (__u32)(__u64)sca;
- set_bit_inv(id, (unsigned long *) &sca->mcn);
+ set_bit_inv(vcpu->vcpu_id, (unsigned long *) &sca->mcn);
}
- read_unlock(&kvm->arch.sca_lock);
+ read_unlock(&vcpu->kvm->arch.sca_lock);
}
/* Basic SCA to Extended SCA data copy routines */
@@ -1492,7 +1491,7 @@ void kvm_arch_vcpu_postcreate(struct kvm_vcpu *vcpu)
mutex_unlock(&vcpu->kvm->lock);
if (!kvm_is_ucontrol(vcpu->kvm)) {
vcpu->arch.gmap = vcpu->kvm->arch.gmap;
- sca_add_vcpu(vcpu, vcpu->kvm, vcpu->vcpu_id);
+ sca_add_vcpu(vcpu);
}
}
--
2.3.0
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [GIT PULL 18/23] KVM: s390: don't switch to ESCA for ucontrol
2015-12-02 11:06 [GIT PULL 00/23] KVM: s390 features, kvm_get_vcpu_by_id and stat for 4.5 Christian Borntraeger
` (16 preceding siblings ...)
2015-12-02 11:06 ` [GIT PULL 17/23] KVM: s390: cleanup sca_add_vcpu Christian Borntraeger
@ 2015-12-02 11:06 ` Christian Borntraeger
2015-12-02 11:06 ` [GIT PULL 19/23] s390/sclp: introduce check for SIE Christian Borntraeger
` (5 subsequent siblings)
23 siblings, 0 replies; 29+ messages in thread
From: Christian Borntraeger @ 2015-12-02 11:06 UTC (permalink / raw)
To: Paolo Bonzini
Cc: KVM, linux-s390, Cornelia Huck, Jens Freimann, Alexander Graf
From: David Hildenbrand <dahi@linux.vnet.ibm.com>
sca_add_vpcu is not called for ucontrol guests. We must also not
apply the sca checking for sca_can_add_vcpu as ucontrol guests
do not have to follow the sca limits.
As common code already checks that id < KVM_MAX_VCPUS all other
data structures are safe as well.
Signed-off-by: David Hildenbrand <dahi@linux.vnet.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
---
arch/s390/kvm/kvm-s390.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c
index d9d71bb..539d385 100644
--- a/arch/s390/kvm/kvm-s390.c
+++ b/arch/s390/kvm/kvm-s390.c
@@ -1588,7 +1588,7 @@ struct kvm_vcpu *kvm_arch_vcpu_create(struct kvm *kvm,
struct sie_page *sie_page;
int rc = -EINVAL;
- if (!sca_can_add_vcpu(kvm, id))
+ if (!kvm_is_ucontrol(kvm) && !sca_can_add_vcpu(kvm, id))
goto out;
rc = -ENOMEM;
--
2.3.0
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [GIT PULL 19/23] s390/sclp: introduce check for SIE
2015-12-02 11:06 [GIT PULL 00/23] KVM: s390 features, kvm_get_vcpu_by_id and stat for 4.5 Christian Borntraeger
` (17 preceding siblings ...)
2015-12-02 11:06 ` [GIT PULL 18/23] KVM: s390: don't switch to ESCA for ucontrol Christian Borntraeger
@ 2015-12-02 11:06 ` Christian Borntraeger
2015-12-02 11:06 ` [GIT PULL 20/23] s390: show virtualization support in /proc/cpuinfo Christian Borntraeger
` (4 subsequent siblings)
23 siblings, 0 replies; 29+ messages in thread
From: Christian Borntraeger @ 2015-12-02 11:06 UTC (permalink / raw)
To: Paolo Bonzini
Cc: KVM, linux-s390, Cornelia Huck, Jens Freimann, Alexander Graf
From: David Hildenbrand <dahi@linux.vnet.ibm.com>
This patch adds a way to check if the SIE with zArchitecture support is
available.
Acked-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Acked-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Signed-off-by: David Hildenbrand <dahi@linux.vnet.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
---
arch/s390/include/asm/sclp.h | 6 +++++-
drivers/s390/char/sclp_early.c | 1 +
2 files changed, 6 insertions(+), 1 deletion(-)
diff --git a/arch/s390/include/asm/sclp.h b/arch/s390/include/asm/sclp.h
index 8324abb..dea883f 100644
--- a/arch/s390/include/asm/sclp.h
+++ b/arch/s390/include/asm/sclp.h
@@ -29,7 +29,10 @@ struct sclp_ipl_info {
struct sclp_core_entry {
u8 core_id;
- u8 reserved0[2];
+ u8 reserved0;
+ u8 : 4;
+ u8 sief2 : 1;
+ u8 : 3;
u8 : 3;
u8 siif : 1;
u8 sigpif : 1;
@@ -55,6 +58,7 @@ struct sclp_info {
unsigned char has_sprp : 1;
unsigned char has_hvs : 1;
unsigned char has_esca : 1;
+ unsigned char has_sief2 : 1;
unsigned int ibc;
unsigned int mtid;
unsigned int mtid_cp;
diff --git a/drivers/s390/char/sclp_early.c b/drivers/s390/char/sclp_early.c
index ff1e1bb..e0a1f4e 100644
--- a/drivers/s390/char/sclp_early.c
+++ b/drivers/s390/char/sclp_early.c
@@ -136,6 +136,7 @@ static void __init sclp_facilities_detect(struct read_info_sccb *sccb)
continue;
sclp.has_siif = cpue->siif;
sclp.has_sigpif = cpue->sigpif;
+ sclp.has_sief2 = cpue->sief2;
break;
}
--
2.3.0
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [GIT PULL 20/23] s390: show virtualization support in /proc/cpuinfo
2015-12-02 11:06 [GIT PULL 00/23] KVM: s390 features, kvm_get_vcpu_by_id and stat for 4.5 Christian Borntraeger
` (18 preceding siblings ...)
2015-12-02 11:06 ` [GIT PULL 19/23] s390/sclp: introduce check for SIE Christian Borntraeger
@ 2015-12-02 11:06 ` Christian Borntraeger
2015-12-02 11:06 ` [GIT PULL 21/23] KVM: s390: don't load kvm without virtualization support Christian Borntraeger
` (3 subsequent siblings)
23 siblings, 0 replies; 29+ messages in thread
From: Christian Borntraeger @ 2015-12-02 11:06 UTC (permalink / raw)
To: Paolo Bonzini
Cc: KVM, linux-s390, Cornelia Huck, Jens Freimann, Alexander Graf
From: David Hildenbrand <dahi@linux.vnet.ibm.com>
This patch exposes the SIE capability (aka virtualization support) via
/proc/cpuinfo -> "features" as "sie".
As we don't want to expose this hwcap via elf, let's add a second,
"internal"/non-elf capability list. The content is simply concatenated
to the existing features when printing /proc/cpuinfo.
We also add the defines to elf.h to keep the hwcap stuff at a common
place.
Acked-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Signed-off-by: David Hildenbrand <dahi@linux.vnet.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
---
arch/s390/include/asm/elf.h | 7 +++++++
arch/s390/kernel/processor.c | 6 ++++++
arch/s390/kernel/setup.c | 9 +++++++++
3 files changed, 22 insertions(+)
diff --git a/arch/s390/include/asm/elf.h b/arch/s390/include/asm/elf.h
index bab6739..08e34a5 100644
--- a/arch/s390/include/asm/elf.h
+++ b/arch/s390/include/asm/elf.h
@@ -104,6 +104,9 @@
#define HWCAP_S390_TE 1024
#define HWCAP_S390_VXRS 2048
+/* Internal bits, not exposed via elf */
+#define HWCAP_INT_SIE 1UL
+
/*
* These are used to set parameters in the core dumps.
*/
@@ -169,6 +172,10 @@ extern unsigned int vdso_enabled;
extern unsigned long elf_hwcap;
#define ELF_HWCAP (elf_hwcap)
+/* Internal hardware capabilities, not exposed via elf */
+
+extern unsigned long int_hwcap;
+
/* This yields a string that ld.so will use to load implementation
specific libraries for optimization. This is more specific in
intent than poking at uname or /proc/cpuinfo.
diff --git a/arch/s390/kernel/processor.c b/arch/s390/kernel/processor.c
index 7ce00e7..647128d 100644
--- a/arch/s390/kernel/processor.c
+++ b/arch/s390/kernel/processor.c
@@ -61,6 +61,9 @@ static int show_cpuinfo(struct seq_file *m, void *v)
"esan3", "zarch", "stfle", "msa", "ldisp", "eimm", "dfp",
"edat", "etf3eh", "highgprs", "te", "vx"
};
+ static const char * const int_hwcap_str[] = {
+ "sie"
+ };
unsigned long n = (unsigned long) v - 1;
int i;
@@ -75,6 +78,9 @@ static int show_cpuinfo(struct seq_file *m, void *v)
for (i = 0; i < ARRAY_SIZE(hwcap_str); i++)
if (hwcap_str[i] && (elf_hwcap & (1UL << i)))
seq_printf(m, "%s ", hwcap_str[i]);
+ for (i = 0; i < ARRAY_SIZE(int_hwcap_str); i++)
+ if (int_hwcap_str[i] && (int_hwcap & (1UL << i)))
+ seq_printf(m, "%s ", int_hwcap_str[i]);
seq_puts(m, "\n");
show_cacheinfo(m);
}
diff --git a/arch/s390/kernel/setup.c b/arch/s390/kernel/setup.c
index c837bca..dc83ae6 100644
--- a/arch/s390/kernel/setup.c
+++ b/arch/s390/kernel/setup.c
@@ -80,6 +80,8 @@ EXPORT_SYMBOL(console_irq);
unsigned long elf_hwcap __read_mostly = 0;
char elf_platform[ELF_PLATFORM_SIZE];
+unsigned long int_hwcap = 0;
+
int __initdata memory_end_set;
unsigned long __initdata memory_end;
unsigned long __initdata max_physmem_end;
@@ -793,6 +795,13 @@ static int __init setup_hwcaps(void)
strcpy(elf_platform, "z13");
break;
}
+
+ /*
+ * Virtualization support HWCAP_INT_SIE is bit 0.
+ */
+ if (sclp.has_sief2)
+ int_hwcap |= HWCAP_INT_SIE;
+
return 0;
}
arch_initcall(setup_hwcaps);
--
2.3.0
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [GIT PULL 21/23] KVM: s390: don't load kvm without virtualization support
2015-12-02 11:06 [GIT PULL 00/23] KVM: s390 features, kvm_get_vcpu_by_id and stat for 4.5 Christian Borntraeger
` (19 preceding siblings ...)
2015-12-02 11:06 ` [GIT PULL 20/23] s390: show virtualization support in /proc/cpuinfo Christian Borntraeger
@ 2015-12-02 11:06 ` Christian Borntraeger
2015-12-02 11:06 ` [GIT PULL 22/23] KVM: s390: remove pointless test_facility(2) check Christian Borntraeger
` (2 subsequent siblings)
23 siblings, 0 replies; 29+ messages in thread
From: Christian Borntraeger @ 2015-12-02 11:06 UTC (permalink / raw)
To: Paolo Bonzini
Cc: KVM, linux-s390, Cornelia Huck, Jens Freimann, Alexander Graf
From: David Hildenbrand <dahi@linux.vnet.ibm.com>
If we don't have support for virtualization (SIE), e.g. when running under
a hypervisor not supporting execution of the SIE instruction, we should
immediately abort loading the kvm module, as the SIE instruction cannot
be enabled dynamically.
Currently, the SIE instructions fails with an exception on a non-SIE
host, resulting in the guest making no progress, instead of failing hard.
Reviewed-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Acked-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Signed-off-by: David Hildenbrand <dahi@linux.vnet.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
---
arch/s390/kvm/kvm-s390.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c
index 539d385..49d3319 100644
--- a/arch/s390/kvm/kvm-s390.c
+++ b/arch/s390/kvm/kvm-s390.c
@@ -2859,6 +2859,11 @@ void kvm_arch_commit_memory_region(struct kvm *kvm,
static int __init kvm_s390_init(void)
{
+ if (!sclp.has_sief2) {
+ pr_info("SIE not available\n");
+ return -ENODEV;
+ }
+
return kvm_init(NULL, sizeof(struct kvm_vcpu), 0, THIS_MODULE);
}
--
2.3.0
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [GIT PULL 22/23] KVM: s390: remove pointless test_facility(2) check
2015-12-02 11:06 [GIT PULL 00/23] KVM: s390 features, kvm_get_vcpu_by_id and stat for 4.5 Christian Borntraeger
` (20 preceding siblings ...)
2015-12-02 11:06 ` [GIT PULL 21/23] KVM: s390: don't load kvm without virtualization support Christian Borntraeger
@ 2015-12-02 11:06 ` Christian Borntraeger
2015-12-02 11:06 ` [GIT PULL 23/23] KVM: s390: remove redudant assigment of error code Christian Borntraeger
2015-12-02 12:50 ` [GIT PULL 00/23] KVM: s390 features, kvm_get_vcpu_by_id and stat for 4.5 Paolo Bonzini
23 siblings, 0 replies; 29+ messages in thread
From: Christian Borntraeger @ 2015-12-02 11:06 UTC (permalink / raw)
To: Paolo Bonzini
Cc: KVM, linux-s390, Cornelia Huck, Jens Freimann, Alexander Graf
From: Heiko Carstens <heiko.carstens@de.ibm.com>
This evaluates always to 'true'.
Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Reviewed-by: David Hildenbrand <dahi@linux.vnet.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
---
arch/s390/kvm/kvm-s390.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c
index 49d3319..77724ce 100644
--- a/arch/s390/kvm/kvm-s390.c
+++ b/arch/s390/kvm/kvm-s390.c
@@ -1027,7 +1027,7 @@ static int kvm_s390_apxa_installed(void)
u8 config[128];
int cc;
- if (test_facility(2) && test_facility(12)) {
+ if (test_facility(12)) {
cc = kvm_s390_query_ap_config(config);
if (cc)
--
2.3.0
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [GIT PULL 23/23] KVM: s390: remove redudant assigment of error code
2015-12-02 11:06 [GIT PULL 00/23] KVM: s390 features, kvm_get_vcpu_by_id and stat for 4.5 Christian Borntraeger
` (21 preceding siblings ...)
2015-12-02 11:06 ` [GIT PULL 22/23] KVM: s390: remove pointless test_facility(2) check Christian Borntraeger
@ 2015-12-02 11:06 ` Christian Borntraeger
2015-12-02 12:50 ` [GIT PULL 00/23] KVM: s390 features, kvm_get_vcpu_by_id and stat for 4.5 Paolo Bonzini
23 siblings, 0 replies; 29+ messages in thread
From: Christian Borntraeger @ 2015-12-02 11:06 UTC (permalink / raw)
To: Paolo Bonzini
Cc: KVM, linux-s390, Cornelia Huck, Jens Freimann, Alexander Graf
rc already contains -ENOMEM, no need to assign it twice.
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
Acked-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Reviewed-by: David Hildenbrand <dahi@linux.vnet.ibm.com>
---
arch/s390/kvm/kvm-s390.c | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c
index 77724ce..6857262 100644
--- a/arch/s390/kvm/kvm-s390.c
+++ b/arch/s390/kvm/kvm-s390.c
@@ -1618,10 +1618,8 @@ struct kvm_vcpu *kvm_arch_vcpu_create(struct kvm *kvm,
*/
vcpu->arch.guest_fpregs.fprs = kzalloc(sizeof(freg_t) * __NUM_FPRS,
GFP_KERNEL);
- if (!vcpu->arch.guest_fpregs.fprs) {
- rc = -ENOMEM;
+ if (!vcpu->arch.guest_fpregs.fprs)
goto out_free_sie_block;
- }
rc = kvm_vcpu_init(vcpu, kvm, id);
if (rc)
--
2.3.0
^ permalink raw reply related [flat|nested] 29+ messages in thread
* Re: [GIT PULL 04/23] KVM: s390: rewrite vcpu_post_run and drop out early
2015-12-02 11:06 ` [GIT PULL 04/23] KVM: s390: rewrite vcpu_post_run and drop out early Christian Borntraeger
@ 2015-12-02 12:20 ` Paolo Bonzini
2015-12-02 13:04 ` Christian Borntraeger
0 siblings, 1 reply; 29+ messages in thread
From: Paolo Bonzini @ 2015-12-02 12:20 UTC (permalink / raw)
To: Christian Borntraeger
Cc: KVM, linux-s390, Cornelia Huck, Jens Freimann, Alexander Graf
On 02/12/2015 12:06, Christian Borntraeger wrote:
> + memcpy(&vcpu->run->s.regs.gprs[14], &vcpu->arch.sie_block->gg14, 16);
This is preexisting but... boy it's ugly. :)
Do you gain much over the simpler
vcpu->run->s.regs.gprs[14] = vcpu->arch.sie_block->gg14;
vcpu->run->s.regs.gprs[15] = vcpu->arch.sie_block->gg15;
?
Paolo
^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [GIT PULL 00/23] KVM: s390 features, kvm_get_vcpu_by_id and stat for 4.5
2015-12-02 11:06 [GIT PULL 00/23] KVM: s390 features, kvm_get_vcpu_by_id and stat for 4.5 Christian Borntraeger
` (22 preceding siblings ...)
2015-12-02 11:06 ` [GIT PULL 23/23] KVM: s390: remove redudant assigment of error code Christian Borntraeger
@ 2015-12-02 12:50 ` Paolo Bonzini
23 siblings, 0 replies; 29+ messages in thread
From: Paolo Bonzini @ 2015-12-02 12:50 UTC (permalink / raw)
To: Christian Borntraeger
Cc: KVM, linux-s390, Cornelia Huck, Jens Freimann, Alexander Graf
On 02/12/2015 12:06, Christian Borntraeger wrote:
> Paolo,
>
> here is the first s390 pull request for 4.5. It also contains the
> remaining vcpu lookup changes and an improved cleanup of the kvm_stat
> exit path.
> I have deferred the kvm_stat per VM patches.
>
> The s390 changes are:
> - ESCA support (up to 248 CPUs)
> - detection if KVM works (e.g. for nested virtualization)
> - cleanups
>
> The following changes since commit bb11c6c96544737aede6a2eb92e5c6bc8b46534b:
>
> KVM: x86: MMU: Remove unused parameter parent_pte from kvm_mmu_get_page() (2015-11-26 15:31:36 +0100)
>
> are available in the git reposi at:
>
> git://git.kernel.org/pub/scm/linux/kernel/git/kvms390/linux.git tags/kvm-s390-next-4.5-1
>
> for you to fetch changes up to 2f8a43d45d14ad62b105ed99151b453c12df7149:
>
> KVM: s390: remove redudant assigment of error code (2015-11-30 12:47:13 +0100)
>
> ----------------------------------------------------------------
> KVM: s390 features, kvm_get_vcpu_by_id and stat
>
> Several features for s390
> 1. ESCA support (up to 248 vCPUs)
> 2. KVM detection: we can now detect if we support KVM (e.g. does KVM
> under KVM work?)
>
> kvm_stat:
> 1. cleanup
>
> kvm_get_vcpu_by_id:
> 1. Use kvm_get_vcpu_by_id where appropriate
> 2. Apply a heuristic to optimize for ID VCPU == No. VCPU
>
> ----------------------------------------------------------------
> Christian Borntraeger (1):
> KVM: s390: remove redudant assigment of error code
>
> David Hildenbrand (12):
> KVM: Use common function for VCPU lookup by id
> KVM: use heuristic for fast VCPU lookup by id
> KVM: s390: rewrite vcpu_post_run and drop out early
> KVM: s390: fast path for sca_ext_call_pending
> KVM: s390: we always have a SCA
> KVM: s390: fix SCA related races and double use
> KVM: s390: always set/clear the SCA sda field
> KVM: s390: cleanup sca_add_vcpu
> KVM: s390: don't switch to ESCA for ucontrol
> s390/sclp: introduce check for SIE
> s390: show virtualization support in /proc/cpuinfo
> KVM: s390: don't load kvm without virtualization support
>
> Eugene (jno) Dvurechenski (8):
> s390/sclp: introduce checks for ESCA and HVS
> KVM: s390: Generalize access to IPTE controls
> KVM: s390: Generalize access to SIGP controls
> KVM: s390: Provide SCA-aware helpers for VCPU add/del
> KVM: s390: Introduce new structures
> KVM: s390: Make provisions for ESCA utilization
> KVM: s390: Introduce switching code
> KVM: s390: Enable up to 248 VCPUs per VM
>
> Heiko Carstens (1):
> KVM: s390: remove pointless test_facility(2) check
>
> Janosch Frank (1):
> KVM: Remove unnecessary debugfs dentry references
>
> arch/powerpc/kvm/book3s_hv.c | 10 +-
> arch/s390/include/asm/elf.h | 7 ++
> arch/s390/include/asm/kvm_host.h | 49 +++++++-
> arch/s390/include/asm/sclp.h | 8 +-
> arch/s390/kernel/processor.c | 6 +
> arch/s390/kernel/setup.c | 9 ++
> arch/s390/kvm/diag.c | 11 +-
> arch/s390/kvm/gaccess.c | 38 +++++--
> arch/s390/kvm/intercept.c | 7 +-
> arch/s390/kvm/interrupt.c | 133 +++++++++++++++++-----
> arch/s390/kvm/kvm-s390.c | 237 +++++++++++++++++++++++++++------------
> arch/s390/kvm/kvm-s390.h | 7 ++
> drivers/s390/char/sclp_early.c | 8 +-
> include/linux/kvm_host.h | 6 +-
> virt/kvm/kvm_main.c | 30 ++---
> 15 files changed, 407 insertions(+), 159 deletions(-)
>
Pulled, thanks.
Paolo
^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [GIT PULL 04/23] KVM: s390: rewrite vcpu_post_run and drop out early
2015-12-02 12:20 ` Paolo Bonzini
@ 2015-12-02 13:04 ` Christian Borntraeger
2015-12-02 13:05 ` Paolo Bonzini
0 siblings, 1 reply; 29+ messages in thread
From: Christian Borntraeger @ 2015-12-02 13:04 UTC (permalink / raw)
To: Paolo Bonzini
Cc: KVM, linux-s390, Cornelia Huck, Jens Freimann, Alexander Graf
On 12/02/2015 01:20 PM, Paolo Bonzini wrote:
>
>
> On 02/12/2015 12:06, Christian Borntraeger wrote:
>> + memcpy(&vcpu->run->s.regs.gprs[14], &vcpu->arch.sie_block->gg14, 16);
>
> This is preexisting but... boy it's ugly. :)
>
> Do you gain much over the simpler
>
> vcpu->run->s.regs.gprs[14] = vcpu->arch.sie_block->gg14;
> vcpu->run->s.regs.gprs[15] = vcpu->arch.sie_block->gg15;
>
Its just legacy code from the old days.
There is a difference, but it seems to a missed opportunity from gcc
vcpu->arch.sie_block->gg14 = vcpu->run->s.regs.gprs[14];
839c: e3 30 f0 b8 00 04 lg %r3,184(%r15)
83a2: e3 10 32 40 00 04 lg %r1,576(%r3)
83a8: e3 20 30 80 00 04 lg %r2,128(%r3)
83ae: e3 20 21 b8 00 04 lg %r2,440(%r2)
83b4: e3 20 10 a0 00 24 stg %r2,160(%r1)
vcpu->arch.sie_block->gg15 = vcpu->run->s.regs.gprs[15];
83ba: e3 10 32 40 00 04 lg %r1,576(%r3)
83c0: e3 20 30 80 00 04 lg %r2,128(%r3)
83c6: e3 20 21 c0 00 04 lg %r2,448(%r2)
83cc: e3 20 10 a8 00 24 stg %r2,168(%r1)
gcc seems to reuse and reload %r2 and %r3, maybe register pressure.
the memcpy gives
memcpy(&vcpu->arch.sie_block->gg14, &vcpu->run->s.regs.gprs[14], 16);
839c: e3 30 f0 b8 00 04 lg %r3,184(%r15)
83a2: e3 10 32 40 00 04 lg %r1,576(%r3)
83a8: e3 20 30 80 00 04 lg %r2,128(%r3)
83ae: d2 0f 10 a0 21 b8 mvc 160(16,%r1),440(%r2)
I will prepare a patch and do my usual micro benchmark. Unless
things get much worse I will schedule this for the next pull.
Christian
^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [GIT PULL 04/23] KVM: s390: rewrite vcpu_post_run and drop out early
2015-12-02 13:04 ` Christian Borntraeger
@ 2015-12-02 13:05 ` Paolo Bonzini
2015-12-02 14:00 ` Christian Borntraeger
0 siblings, 1 reply; 29+ messages in thread
From: Paolo Bonzini @ 2015-12-02 13:05 UTC (permalink / raw)
To: Christian Borntraeger
Cc: KVM, linux-s390, Cornelia Huck, Jens Freimann, Alexander Graf
On 02/12/2015 14:04, Christian Borntraeger wrote:
>> > Do you gain much over the simpler
>> >
>> > vcpu->run->s.regs.gprs[14] = vcpu->arch.sie_block->gg14;
>> > vcpu->run->s.regs.gprs[15] = vcpu->arch.sie_block->gg15;
>> >
> Its just legacy code from the old days.
> There is a difference, but it seems to a missed opportunity from gcc
>
> vcpu->arch.sie_block->gg14 = vcpu->run->s.regs.gprs[14];
> 839c: e3 30 f0 b8 00 04 lg %r3,184(%r15)
> 83a2: e3 10 32 40 00 04 lg %r1,576(%r3)
> 83a8: e3 20 30 80 00 04 lg %r2,128(%r3)
> 83ae: e3 20 21 b8 00 04 lg %r2,440(%r2)
> 83b4: e3 20 10 a0 00 24 stg %r2,160(%r1)
> vcpu->arch.sie_block->gg15 = vcpu->run->s.regs.gprs[15];
> 83ba: e3 10 32 40 00 04 lg %r1,576(%r3)
> 83c0: e3 20 30 80 00 04 lg %r2,128(%r3)
> 83c6: e3 20 21 c0 00 04 lg %r2,448(%r2)
> 83cc: e3 20 10 a8 00 24 stg %r2,168(%r1)
>
> gcc seems to reuse and reload %r2 and %r3, maybe register pressure.
More likely to be -fno-strict-aliasing. :(
Paolo
^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [GIT PULL 04/23] KVM: s390: rewrite vcpu_post_run and drop out early
2015-12-02 13:05 ` Paolo Bonzini
@ 2015-12-02 14:00 ` Christian Borntraeger
0 siblings, 0 replies; 29+ messages in thread
From: Christian Borntraeger @ 2015-12-02 14:00 UTC (permalink / raw)
To: Paolo Bonzini
Cc: KVM, linux-s390, Cornelia Huck, Jens Freimann, Alexander Graf
On 12/02/2015 02:05 PM, Paolo Bonzini wrote:
>
>
> On 02/12/2015 14:04, Christian Borntraeger wrote:
>>>> Do you gain much over the simpler
>>>>
>>>> vcpu->run->s.regs.gprs[14] = vcpu->arch.sie_block->gg14;
>>>> vcpu->run->s.regs.gprs[15] = vcpu->arch.sie_block->gg15;
>>>>
>> Its just legacy code from the old days.
>> There is a difference, but it seems to a missed opportunity from gcc
>>
>> vcpu->arch.sie_block->gg14 = vcpu->run->s.regs.gprs[14];
>> 839c: e3 30 f0 b8 00 04 lg %r3,184(%r15)
>> 83a2: e3 10 32 40 00 04 lg %r1,576(%r3)
>> 83a8: e3 20 30 80 00 04 lg %r2,128(%r3)
>> 83ae: e3 20 21 b8 00 04 lg %r2,440(%r2)
>> 83b4: e3 20 10 a0 00 24 stg %r2,160(%r1)
>> vcpu->arch.sie_block->gg15 = vcpu->run->s.regs.gprs[15];
>> 83ba: e3 10 32 40 00 04 lg %r1,576(%r3)
>> 83c0: e3 20 30 80 00 04 lg %r2,128(%r3)
>> 83c6: e3 20 21 c0 00 04 lg %r2,448(%r2)
>> 83cc: e3 20 10 a8 00 24 stg %r2,168(%r1)
>>
>> gcc seems to reuse and reload %r2 and %r3, maybe register pressure.
>
> More likely to be -fno-strict-aliasing. :(
Yes its indeed the aliasing.
^ permalink raw reply [flat|nested] 29+ messages in thread
end of thread, other threads:[~2015-12-02 14:00 UTC | newest]
Thread overview: 29+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-12-02 11:06 [GIT PULL 00/23] KVM: s390 features, kvm_get_vcpu_by_id and stat for 4.5 Christian Borntraeger
2015-12-02 11:06 ` [GIT PULL 01/23] KVM: Use common function for VCPU lookup by id Christian Borntraeger
2015-12-02 11:06 ` [GIT PULL 02/23] KVM: use heuristic for fast " Christian Borntraeger
2015-12-02 11:06 ` [GIT PULL 03/23] KVM: Remove unnecessary debugfs dentry references Christian Borntraeger
2015-12-02 11:06 ` [GIT PULL 04/23] KVM: s390: rewrite vcpu_post_run and drop out early Christian Borntraeger
2015-12-02 12:20 ` Paolo Bonzini
2015-12-02 13:04 ` Christian Borntraeger
2015-12-02 13:05 ` Paolo Bonzini
2015-12-02 14:00 ` Christian Borntraeger
2015-12-02 11:06 ` [GIT PULL 05/23] s390/sclp: introduce checks for ESCA and HVS Christian Borntraeger
2015-12-02 11:06 ` [GIT PULL 06/23] KVM: s390: Generalize access to IPTE controls Christian Borntraeger
2015-12-02 11:06 ` [GIT PULL 07/23] KVM: s390: Generalize access to SIGP controls Christian Borntraeger
2015-12-02 11:06 ` [GIT PULL 08/23] KVM: s390: Provide SCA-aware helpers for VCPU add/del Christian Borntraeger
2015-12-02 11:06 ` [GIT PULL 09/23] KVM: s390: Introduce new structures Christian Borntraeger
2015-12-02 11:06 ` [GIT PULL 10/23] KVM: s390: Make provisions for ESCA utilization Christian Borntraeger
2015-12-02 11:06 ` [GIT PULL 11/23] KVM: s390: Introduce switching code Christian Borntraeger
2015-12-02 11:06 ` [GIT PULL 12/23] KVM: s390: Enable up to 248 VCPUs per VM Christian Borntraeger
2015-12-02 11:06 ` [GIT PULL 13/23] KVM: s390: fast path for sca_ext_call_pending Christian Borntraeger
2015-12-02 11:06 ` [GIT PULL 14/23] KVM: s390: we always have a SCA Christian Borntraeger
2015-12-02 11:06 ` [GIT PULL 15/23] KVM: s390: fix SCA related races and double use Christian Borntraeger
2015-12-02 11:06 ` [GIT PULL 16/23] KVM: s390: always set/clear the SCA sda field Christian Borntraeger
2015-12-02 11:06 ` [GIT PULL 17/23] KVM: s390: cleanup sca_add_vcpu Christian Borntraeger
2015-12-02 11:06 ` [GIT PULL 18/23] KVM: s390: don't switch to ESCA for ucontrol Christian Borntraeger
2015-12-02 11:06 ` [GIT PULL 19/23] s390/sclp: introduce check for SIE Christian Borntraeger
2015-12-02 11:06 ` [GIT PULL 20/23] s390: show virtualization support in /proc/cpuinfo Christian Borntraeger
2015-12-02 11:06 ` [GIT PULL 21/23] KVM: s390: don't load kvm without virtualization support Christian Borntraeger
2015-12-02 11:06 ` [GIT PULL 22/23] KVM: s390: remove pointless test_facility(2) check Christian Borntraeger
2015-12-02 11:06 ` [GIT PULL 23/23] KVM: s390: remove redudant assigment of error code Christian Borntraeger
2015-12-02 12:50 ` [GIT PULL 00/23] KVM: s390 features, kvm_get_vcpu_by_id and stat for 4.5 Paolo Bonzini
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).