]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
KVM: s390: Don't exit SIE on SIGP sense running
authorChristian Borntraeger <borntraeger@de.ibm.com>
Thu, 17 Jun 2010 21:16:20 +0000 (23:16 +0200)
committerAvi Kivity <avi@redhat.com>
Mon, 21 Jun 2010 08:26:38 +0000 (11:26 +0300)
Newer (guest) kernels use sigp sense running in their spinlock
implementation to check if the other cpu is running before yielding
the processor. This revealed some wrong guest settings, causing
unnecessary exits for every sigp sense running.

Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
arch/s390/include/asm/kvm_host.h
arch/s390/kvm/kvm-s390.c

index 27605b62b980d1901067c40faa05b7c9f2102c78..b95710a1f5dd479044dda36e1aedf4070104728e 100644 (file)
@@ -26,7 +26,7 @@
 
 struct sca_entry {
        atomic_t scn;
-       __u64   reserved;
+       __u32   reserved;
        __u64   sda;
        __u64   reserved2[2];
 } __attribute__((packed));
index 0cb0da7822d5aaf989490f164214648f29b8f3aa..da1508d36c652e755ed9c2a7bb82a27592b8e86b 100644 (file)
@@ -207,6 +207,7 @@ out_nokvm:
 void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu)
 {
        VCPU_EVENT(vcpu, 3, "%s", "free cpu");
+       clear_bit(63 - vcpu->vcpu_id, (unsigned long *) &vcpu->kvm->arch.sca->mcn);
        if (vcpu->kvm->arch.sca->cpu[vcpu->vcpu_id].sda ==
                (__u64) vcpu->arch.sie_block)
                vcpu->kvm->arch.sca->cpu[vcpu->vcpu_id].sda = 0;
@@ -296,7 +297,7 @@ int kvm_arch_vcpu_setup(struct kvm_vcpu *vcpu)
 {
        atomic_set(&vcpu->arch.sie_block->cpuflags, CPUSTAT_ZARCH);
        set_bit(KVM_REQ_MMU_RELOAD, &vcpu->requests);
-       vcpu->arch.sie_block->ecb   = 2;
+       vcpu->arch.sie_block->ecb   = 6;
        vcpu->arch.sie_block->eca   = 0xC1002001U;
        vcpu->arch.sie_block->fac   = (int) (long) facilities;
        hrtimer_init(&vcpu->arch.ckc_timer, CLOCK_REALTIME, HRTIMER_MODE_ABS);
@@ -329,6 +330,7 @@ struct kvm_vcpu *kvm_arch_vcpu_create(struct kvm *kvm,
                kvm->arch.sca->cpu[id].sda = (__u64) vcpu->arch.sie_block;
        vcpu->arch.sie_block->scaoh = (__u32)(((__u64)kvm->arch.sca) >> 32);
        vcpu->arch.sie_block->scaol = (__u32)(__u64)kvm->arch.sca;
+       set_bit(63 - id, (unsigned long *) &kvm->arch.sca->mcn);
 
        spin_lock_init(&vcpu->arch.local_int.lock);
        INIT_LIST_HEAD(&vcpu->arch.local_int.list);