aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Hildenbrand <dahi@linux.vnet.ibm.com>2016-02-22 07:52:27 -0500
committerChristian Borntraeger <borntraeger@de.ibm.com>2016-03-08 07:57:53 -0500
commit5ebda31686af6bb70affdcc5777ebc7ed81c0eac (patch)
treea7adb2bfe6e9ac7581969c37d512064dd3616d61
parent9c23a1318eb12fcf76d9f663d2c3d88598e62a55 (diff)
KVM: s390: step the VCPU timer while in enabled wait
The cpu timer is a mean to measure task execution time. We want to account everything for a VCPU for which it is responsible. Therefore, if the VCPU wants to sleep, it shall be accounted for it. We can easily get this done by not disabling cpu timer accounting when scheduled out while sleeping because of enabled wait. Signed-off-by: David Hildenbrand <dahi@linux.vnet.ibm.com> Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
-rw-r--r--arch/s390/kvm/kvm-s390.c4
-rw-r--r--arch/s390/kvm/kvm-s390.h5
2 files changed, 7 insertions, 2 deletions
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c
index 38223c4603c7..b54daed49c2c 100644
--- a/arch/s390/kvm/kvm-s390.c
+++ b/arch/s390/kvm/kvm-s390.c
@@ -1538,7 +1538,7 @@ void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
1538 restore_access_regs(vcpu->run->s.regs.acrs); 1538 restore_access_regs(vcpu->run->s.regs.acrs);
1539 gmap_enable(vcpu->arch.gmap); 1539 gmap_enable(vcpu->arch.gmap);
1540 atomic_or(CPUSTAT_RUNNING, &vcpu->arch.sie_block->cpuflags); 1540 atomic_or(CPUSTAT_RUNNING, &vcpu->arch.sie_block->cpuflags);
1541 if (vcpu->arch.cputm_enabled) 1541 if (vcpu->arch.cputm_enabled && !is_vcpu_idle(vcpu))
1542 __start_cpu_timer_accounting(vcpu); 1542 __start_cpu_timer_accounting(vcpu);
1543 vcpu->cpu = cpu; 1543 vcpu->cpu = cpu;
1544} 1544}
@@ -1546,7 +1546,7 @@ void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
1546void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu) 1546void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu)
1547{ 1547{
1548 vcpu->cpu = -1; 1548 vcpu->cpu = -1;
1549 if (vcpu->arch.cputm_enabled) 1549 if (vcpu->arch.cputm_enabled && !is_vcpu_idle(vcpu))
1550 __stop_cpu_timer_accounting(vcpu); 1550 __stop_cpu_timer_accounting(vcpu);
1551 atomic_andnot(CPUSTAT_RUNNING, &vcpu->arch.sie_block->cpuflags); 1551 atomic_andnot(CPUSTAT_RUNNING, &vcpu->arch.sie_block->cpuflags);
1552 gmap_disable(vcpu->arch.gmap); 1552 gmap_disable(vcpu->arch.gmap);
diff --git a/arch/s390/kvm/kvm-s390.h b/arch/s390/kvm/kvm-s390.h
index 9787299d9a29..b1f7ee3bd72d 100644
--- a/arch/s390/kvm/kvm-s390.h
+++ b/arch/s390/kvm/kvm-s390.h
@@ -54,6 +54,11 @@ static inline int is_vcpu_stopped(struct kvm_vcpu *vcpu)
54 return atomic_read(&vcpu->arch.sie_block->cpuflags) & CPUSTAT_STOPPED; 54 return atomic_read(&vcpu->arch.sie_block->cpuflags) & CPUSTAT_STOPPED;
55} 55}
56 56
57static inline int is_vcpu_idle(struct kvm_vcpu *vcpu)
58{
59 return atomic_read(&vcpu->arch.sie_block->cpuflags) & CPUSTAT_WAIT;
60}
61
57static inline int kvm_is_ucontrol(struct kvm *kvm) 62static inline int kvm_is_ucontrol(struct kvm *kvm)
58{ 63{
59#ifdef CONFIG_KVM_S390_UCONTROL 64#ifdef CONFIG_KVM_S390_UCONTROL