diff options
Diffstat (limited to 'arch/s390')
-rw-r--r-- | arch/s390/include/asm/cputime.h | 1 | ||||
-rw-r--r-- | arch/s390/kernel/vtime.c | 13 | ||||
-rw-r--r-- | arch/s390/kvm/kvm-s390.c | 4 |
3 files changed, 13 insertions, 5 deletions
diff --git a/arch/s390/include/asm/cputime.h b/arch/s390/include/asm/cputime.h index 023d5ae24482..d2ff41370c0c 100644 --- a/arch/s390/include/asm/cputime.h +++ b/arch/s390/include/asm/cputime.h | |||
@@ -14,6 +14,7 @@ | |||
14 | 14 | ||
15 | 15 | ||
16 | #define __ARCH_HAS_VTIME_ACCOUNT | 16 | #define __ARCH_HAS_VTIME_ACCOUNT |
17 | #define __ARCH_HAS_VTIME_TASK_SWITCH | ||
17 | 18 | ||
18 | /* We want to use full resolution of the CPU timer: 2**-12 micro-seconds. */ | 19 | /* We want to use full resolution of the CPU timer: 2**-12 micro-seconds. */ |
19 | 20 | ||
diff --git a/arch/s390/kernel/vtime.c b/arch/s390/kernel/vtime.c index 790334427895..e84b8b68444a 100644 --- a/arch/s390/kernel/vtime.c +++ b/arch/s390/kernel/vtime.c | |||
@@ -112,7 +112,12 @@ void vtime_task_switch(struct task_struct *prev) | |||
112 | S390_lowcore.system_timer = ti->system_timer; | 112 | S390_lowcore.system_timer = ti->system_timer; |
113 | } | 113 | } |
114 | 114 | ||
115 | void account_process_tick(struct task_struct *tsk, int user_tick) | 115 | /* |
116 | * In s390, accounting pending user time also implies | ||
117 | * accounting system time in order to correctly compute | ||
118 | * the stolen time accounting. | ||
119 | */ | ||
120 | void vtime_account_user(struct task_struct *tsk) | ||
116 | { | 121 | { |
117 | if (do_account_vtime(tsk, HARDIRQ_OFFSET)) | 122 | if (do_account_vtime(tsk, HARDIRQ_OFFSET)) |
118 | virt_timer_expire(); | 123 | virt_timer_expire(); |
@@ -127,6 +132,8 @@ void vtime_account(struct task_struct *tsk) | |||
127 | struct thread_info *ti = task_thread_info(tsk); | 132 | struct thread_info *ti = task_thread_info(tsk); |
128 | u64 timer, system; | 133 | u64 timer, system; |
129 | 134 | ||
135 | WARN_ON_ONCE(!irqs_disabled()); | ||
136 | |||
130 | timer = S390_lowcore.last_update_timer; | 137 | timer = S390_lowcore.last_update_timer; |
131 | S390_lowcore.last_update_timer = get_vtimer(); | 138 | S390_lowcore.last_update_timer = get_vtimer(); |
132 | S390_lowcore.system_timer += timer - S390_lowcore.last_update_timer; | 139 | S390_lowcore.system_timer += timer - S390_lowcore.last_update_timer; |
@@ -140,6 +147,10 @@ void vtime_account(struct task_struct *tsk) | |||
140 | } | 147 | } |
141 | EXPORT_SYMBOL_GPL(vtime_account); | 148 | EXPORT_SYMBOL_GPL(vtime_account); |
142 | 149 | ||
150 | void vtime_account_system(struct task_struct *tsk) | ||
151 | __attribute__((alias("vtime_account"))); | ||
152 | EXPORT_SYMBOL_GPL(vtime_account_system); | ||
153 | |||
143 | void __kprobes vtime_stop_cpu(void) | 154 | void __kprobes vtime_stop_cpu(void) |
144 | { | 155 | { |
145 | struct s390_idle_data *idle = &__get_cpu_var(s390_idle); | 156 | struct s390_idle_data *idle = &__get_cpu_var(s390_idle); |
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c index ecced9d18986..d91a95568002 100644 --- a/arch/s390/kvm/kvm-s390.c +++ b/arch/s390/kvm/kvm-s390.c | |||
@@ -608,9 +608,7 @@ static int __vcpu_run(struct kvm_vcpu *vcpu) | |||
608 | kvm_s390_deliver_pending_interrupts(vcpu); | 608 | kvm_s390_deliver_pending_interrupts(vcpu); |
609 | 609 | ||
610 | vcpu->arch.sie_block->icptcode = 0; | 610 | vcpu->arch.sie_block->icptcode = 0; |
611 | local_irq_disable(); | ||
612 | kvm_guest_enter(); | 611 | kvm_guest_enter(); |
613 | local_irq_enable(); | ||
614 | VCPU_EVENT(vcpu, 6, "entering sie flags %x", | 612 | VCPU_EVENT(vcpu, 6, "entering sie flags %x", |
615 | atomic_read(&vcpu->arch.sie_block->cpuflags)); | 613 | atomic_read(&vcpu->arch.sie_block->cpuflags)); |
616 | trace_kvm_s390_sie_enter(vcpu, | 614 | trace_kvm_s390_sie_enter(vcpu, |
@@ -629,9 +627,7 @@ static int __vcpu_run(struct kvm_vcpu *vcpu) | |||
629 | VCPU_EVENT(vcpu, 6, "exit sie icptcode %d", | 627 | VCPU_EVENT(vcpu, 6, "exit sie icptcode %d", |
630 | vcpu->arch.sie_block->icptcode); | 628 | vcpu->arch.sie_block->icptcode); |
631 | trace_kvm_s390_sie_exit(vcpu, vcpu->arch.sie_block->icptcode); | 629 | trace_kvm_s390_sie_exit(vcpu, vcpu->arch.sie_block->icptcode); |
632 | local_irq_disable(); | ||
633 | kvm_guest_exit(); | 630 | kvm_guest_exit(); |
634 | local_irq_enable(); | ||
635 | 631 | ||
636 | memcpy(&vcpu->run->s.regs.gprs[14], &vcpu->arch.sie_block->gg14, 16); | 632 | memcpy(&vcpu->run->s.regs.gprs[14], &vcpu->arch.sie_block->gg14, 16); |
637 | return rc; | 633 | return rc; |