linux-s390.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [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).