diff options
author | David Hildenbrand <dahi@linux.vnet.ibm.com> | 2014-03-14 05:59:29 -0400 |
---|---|---|
committer | Christian Borntraeger <borntraeger@de.ibm.com> | 2014-04-29 09:01:54 -0400 |
commit | 6852d7b69b4949234c3a8ae1f279f6a4c6563662 (patch) | |
tree | 1fc932ccffef93c90918d435b1269b4f2e76a053 /arch/s390/kvm | |
parent | e45efa28e578758d3c5ef0d7d3f88aadb9a61515 (diff) |
KVM: s390: introduce kvm_s390_vcpu_{start,stop}
This patch introduces two new functions to set/clear the CPUSTAT_STOPPED bit and
makes use of it at all applicable places. These functions prepare the additional
execution of code when starting/stopping a vcpu.
The CPUSTAT_STOPPED bit should not be touched outside of these functions.
Signed-off-by: David Hildenbrand <dahi@linux.vnet.ibm.com>
Reviewed-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
Diffstat (limited to 'arch/s390/kvm')
-rw-r--r-- | arch/s390/kvm/diag.c | 2 | ||||
-rw-r--r-- | arch/s390/kvm/intercept.c | 3 | ||||
-rw-r--r-- | arch/s390/kvm/interrupt.c | 2 | ||||
-rw-r--r-- | arch/s390/kvm/kvm-s390.c | 16 | ||||
-rw-r--r-- | arch/s390/kvm/kvm-s390.h | 2 | ||||
-rw-r--r-- | arch/s390/kvm/trace-s390.h | 21 |
6 files changed, 40 insertions, 6 deletions
diff --git a/arch/s390/kvm/diag.c b/arch/s390/kvm/diag.c index 5521ace8b60d..004d385d9519 100644 --- a/arch/s390/kvm/diag.c +++ b/arch/s390/kvm/diag.c | |||
@@ -176,7 +176,7 @@ static int __diag_ipl_functions(struct kvm_vcpu *vcpu) | |||
176 | return -EOPNOTSUPP; | 176 | return -EOPNOTSUPP; |
177 | } | 177 | } |
178 | 178 | ||
179 | atomic_set_mask(CPUSTAT_STOPPED, &vcpu->arch.sie_block->cpuflags); | 179 | kvm_s390_vcpu_stop(vcpu); |
180 | vcpu->run->s390_reset_flags |= KVM_S390_RESET_SUBSYSTEM; | 180 | vcpu->run->s390_reset_flags |= KVM_S390_RESET_SUBSYSTEM; |
181 | vcpu->run->s390_reset_flags |= KVM_S390_RESET_IPL; | 181 | vcpu->run->s390_reset_flags |= KVM_S390_RESET_IPL; |
182 | vcpu->run->s390_reset_flags |= KVM_S390_RESET_CPU_INIT; | 182 | vcpu->run->s390_reset_flags |= KVM_S390_RESET_CPU_INIT; |
diff --git a/arch/s390/kvm/intercept.c b/arch/s390/kvm/intercept.c index 54313fe6e8d4..99e4b76e3487 100644 --- a/arch/s390/kvm/intercept.c +++ b/arch/s390/kvm/intercept.c | |||
@@ -65,8 +65,7 @@ static int handle_stop(struct kvm_vcpu *vcpu) | |||
65 | trace_kvm_s390_stop_request(vcpu->arch.local_int.action_bits); | 65 | trace_kvm_s390_stop_request(vcpu->arch.local_int.action_bits); |
66 | 66 | ||
67 | if (vcpu->arch.local_int.action_bits & ACTION_STOP_ON_STOP) { | 67 | if (vcpu->arch.local_int.action_bits & ACTION_STOP_ON_STOP) { |
68 | atomic_set_mask(CPUSTAT_STOPPED, | 68 | kvm_s390_vcpu_stop(vcpu); |
69 | &vcpu->arch.sie_block->cpuflags); | ||
70 | vcpu->arch.local_int.action_bits &= ~ACTION_STOP_ON_STOP; | 69 | vcpu->arch.local_int.action_bits &= ~ACTION_STOP_ON_STOP; |
71 | VCPU_EVENT(vcpu, 3, "%s", "cpu stopped"); | 70 | VCPU_EVENT(vcpu, 3, "%s", "cpu stopped"); |
72 | rc = -EOPNOTSUPP; | 71 | rc = -EOPNOTSUPP; |
diff --git a/arch/s390/kvm/interrupt.c b/arch/s390/kvm/interrupt.c index 077e4738ebdc..d9526bb29194 100644 --- a/arch/s390/kvm/interrupt.c +++ b/arch/s390/kvm/interrupt.c | |||
@@ -413,7 +413,7 @@ static void __do_deliver_interrupt(struct kvm_vcpu *vcpu, | |||
413 | rc |= read_guest_lc(vcpu, offsetof(struct _lowcore, restart_psw), | 413 | rc |= read_guest_lc(vcpu, offsetof(struct _lowcore, restart_psw), |
414 | &vcpu->arch.sie_block->gpsw, | 414 | &vcpu->arch.sie_block->gpsw, |
415 | sizeof(psw_t)); | 415 | sizeof(psw_t)); |
416 | atomic_clear_mask(CPUSTAT_STOPPED, &vcpu->arch.sie_block->cpuflags); | 416 | kvm_s390_vcpu_start(vcpu); |
417 | break; | 417 | break; |
418 | case KVM_S390_PROGRAM_INT: | 418 | case KVM_S390_PROGRAM_INT: |
419 | VCPU_EVENT(vcpu, 4, "interrupt: pgm check code:%x, ilc:%x", | 419 | VCPU_EVENT(vcpu, 4, "interrupt: pgm check code:%x, ilc:%x", |
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c index b32c42cbc706..6c972d229ace 100644 --- a/arch/s390/kvm/kvm-s390.c +++ b/arch/s390/kvm/kvm-s390.c | |||
@@ -592,7 +592,7 @@ static void kvm_s390_vcpu_initial_reset(struct kvm_vcpu *vcpu) | |||
592 | vcpu->arch.sie_block->pp = 0; | 592 | vcpu->arch.sie_block->pp = 0; |
593 | vcpu->arch.pfault_token = KVM_S390_PFAULT_TOKEN_INVALID; | 593 | vcpu->arch.pfault_token = KVM_S390_PFAULT_TOKEN_INVALID; |
594 | kvm_clear_async_pf_completion_queue(vcpu); | 594 | kvm_clear_async_pf_completion_queue(vcpu); |
595 | atomic_set_mask(CPUSTAT_STOPPED, &vcpu->arch.sie_block->cpuflags); | 595 | kvm_s390_vcpu_stop(vcpu); |
596 | kvm_s390_clear_local_irqs(vcpu); | 596 | kvm_s390_clear_local_irqs(vcpu); |
597 | } | 597 | } |
598 | 598 | ||
@@ -1235,7 +1235,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) | |||
1235 | if (vcpu->sigset_active) | 1235 | if (vcpu->sigset_active) |
1236 | sigprocmask(SIG_SETMASK, &vcpu->sigset, &sigsaved); | 1236 | sigprocmask(SIG_SETMASK, &vcpu->sigset, &sigsaved); |
1237 | 1237 | ||
1238 | atomic_clear_mask(CPUSTAT_STOPPED, &vcpu->arch.sie_block->cpuflags); | 1238 | kvm_s390_vcpu_start(vcpu); |
1239 | 1239 | ||
1240 | switch (kvm_run->exit_reason) { | 1240 | switch (kvm_run->exit_reason) { |
1241 | case KVM_EXIT_S390_SIEIC: | 1241 | case KVM_EXIT_S390_SIEIC: |
@@ -1362,6 +1362,18 @@ int kvm_s390_vcpu_store_status(struct kvm_vcpu *vcpu, unsigned long addr) | |||
1362 | return kvm_s390_store_status_unloaded(vcpu, addr); | 1362 | return kvm_s390_store_status_unloaded(vcpu, addr); |
1363 | } | 1363 | } |
1364 | 1364 | ||
1365 | void kvm_s390_vcpu_start(struct kvm_vcpu *vcpu) | ||
1366 | { | ||
1367 | trace_kvm_s390_vcpu_start_stop(vcpu->vcpu_id, 1); | ||
1368 | atomic_clear_mask(CPUSTAT_STOPPED, &vcpu->arch.sie_block->cpuflags); | ||
1369 | } | ||
1370 | |||
1371 | void kvm_s390_vcpu_stop(struct kvm_vcpu *vcpu) | ||
1372 | { | ||
1373 | trace_kvm_s390_vcpu_start_stop(vcpu->vcpu_id, 0); | ||
1374 | atomic_set_mask(CPUSTAT_STOPPED, &vcpu->arch.sie_block->cpuflags); | ||
1375 | } | ||
1376 | |||
1365 | static int kvm_vcpu_ioctl_enable_cap(struct kvm_vcpu *vcpu, | 1377 | static int kvm_vcpu_ioctl_enable_cap(struct kvm_vcpu *vcpu, |
1366 | struct kvm_enable_cap *cap) | 1378 | struct kvm_enable_cap *cap) |
1367 | { | 1379 | { |
diff --git a/arch/s390/kvm/kvm-s390.h b/arch/s390/kvm/kvm-s390.h index 9b5680d1f6cc..c28423a3acc0 100644 --- a/arch/s390/kvm/kvm-s390.h +++ b/arch/s390/kvm/kvm-s390.h | |||
@@ -157,6 +157,8 @@ int kvm_s390_handle_sigp(struct kvm_vcpu *vcpu); | |||
157 | /* implemented in kvm-s390.c */ | 157 | /* implemented in kvm-s390.c */ |
158 | int kvm_s390_store_status_unloaded(struct kvm_vcpu *vcpu, unsigned long addr); | 158 | int kvm_s390_store_status_unloaded(struct kvm_vcpu *vcpu, unsigned long addr); |
159 | int kvm_s390_vcpu_store_status(struct kvm_vcpu *vcpu, unsigned long addr); | 159 | int kvm_s390_vcpu_store_status(struct kvm_vcpu *vcpu, unsigned long addr); |
160 | void kvm_s390_vcpu_start(struct kvm_vcpu *vcpu); | ||
161 | void kvm_s390_vcpu_stop(struct kvm_vcpu *vcpu); | ||
160 | void s390_vcpu_block(struct kvm_vcpu *vcpu); | 162 | void s390_vcpu_block(struct kvm_vcpu *vcpu); |
161 | void s390_vcpu_unblock(struct kvm_vcpu *vcpu); | 163 | void s390_vcpu_unblock(struct kvm_vcpu *vcpu); |
162 | void exit_sie(struct kvm_vcpu *vcpu); | 164 | void exit_sie(struct kvm_vcpu *vcpu); |
diff --git a/arch/s390/kvm/trace-s390.h b/arch/s390/kvm/trace-s390.h index 13f30f58a2df..34d4f8af3a1d 100644 --- a/arch/s390/kvm/trace-s390.h +++ b/arch/s390/kvm/trace-s390.h | |||
@@ -68,6 +68,27 @@ TRACE_EVENT(kvm_s390_destroy_vcpu, | |||
68 | ); | 68 | ); |
69 | 69 | ||
70 | /* | 70 | /* |
71 | * Trace point for start and stop of vpcus. | ||
72 | */ | ||
73 | TRACE_EVENT(kvm_s390_vcpu_start_stop, | ||
74 | TP_PROTO(unsigned int id, int state), | ||
75 | TP_ARGS(id, state), | ||
76 | |||
77 | TP_STRUCT__entry( | ||
78 | __field(unsigned int, id) | ||
79 | __field(int, state) | ||
80 | ), | ||
81 | |||
82 | TP_fast_assign( | ||
83 | __entry->id = id; | ||
84 | __entry->state = state; | ||
85 | ), | ||
86 | |||
87 | TP_printk("%s cpu %d", __entry->state ? "starting" : "stopping", | ||
88 | __entry->id) | ||
89 | ); | ||
90 | |||
91 | /* | ||
71 | * Trace points for injection of interrupts, either per machine or | 92 | * Trace points for injection of interrupts, either per machine or |
72 | * per vcpu. | 93 | * per vcpu. |
73 | */ | 94 | */ |