diff options
author | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2016-12-20 01:27:59 -0500 |
---|---|---|
committer | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2016-12-20 09:22:56 -0500 |
commit | 8f2b468aadc81ca0fc78e41696b648e30d91ba5c (patch) | |
tree | 6908c5d1c11e29847a371567ed5ec09d08707bd4 | |
parent | e93b1cc8a8965da137ffea0b88e5f62fa1d2a9e6 (diff) |
s390/vtime: correct system time accounting
There is a slight misaccounting of system time in vtime_account_user.
This function is called once per HZ tick in interrupt context.
The irq_enter function already accounted the system time up to the
point of the irq_enter call. The system time from irq_enter until
vtime_account_user/do_account_vtime is reached is irq time but it
is accounted to the previous context.
Just drop the hardirq offset from arch/s390/kernel/vtime.c.
Reported-by: Frederic Weisbecker <fweisbec@gmail.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
-rw-r--r-- | arch/s390/kernel/vtime.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/arch/s390/kernel/vtime.c b/arch/s390/kernel/vtime.c index 6b246aadf311..1b5c5ee9fc1b 100644 --- a/arch/s390/kernel/vtime.c +++ b/arch/s390/kernel/vtime.c | |||
@@ -94,7 +94,7 @@ static void update_mt_scaling(void) | |||
94 | * Update process times based on virtual cpu times stored by entry.S | 94 | * Update process times based on virtual cpu times stored by entry.S |
95 | * to the lowcore fields user_timer, system_timer & steal_clock. | 95 | * to the lowcore fields user_timer, system_timer & steal_clock. |
96 | */ | 96 | */ |
97 | static int do_account_vtime(struct task_struct *tsk, int hardirq_offset) | 97 | static int do_account_vtime(struct task_struct *tsk) |
98 | { | 98 | { |
99 | u64 timer, clock, user, system, steal; | 99 | u64 timer, clock, user, system, steal; |
100 | u64 user_scaled, system_scaled; | 100 | u64 user_scaled, system_scaled; |
@@ -138,7 +138,7 @@ static int do_account_vtime(struct task_struct *tsk, int hardirq_offset) | |||
138 | } | 138 | } |
139 | account_user_time(tsk, user); | 139 | account_user_time(tsk, user); |
140 | tsk->utimescaled += user_scaled; | 140 | tsk->utimescaled += user_scaled; |
141 | account_system_time(tsk, hardirq_offset, system); | 141 | account_system_time(tsk, 0, system); |
142 | tsk->stimescaled += system_scaled; | 142 | tsk->stimescaled += system_scaled; |
143 | 143 | ||
144 | steal = S390_lowcore.steal_timer; | 144 | steal = S390_lowcore.steal_timer; |
@@ -152,7 +152,7 @@ static int do_account_vtime(struct task_struct *tsk, int hardirq_offset) | |||
152 | 152 | ||
153 | void vtime_task_switch(struct task_struct *prev) | 153 | void vtime_task_switch(struct task_struct *prev) |
154 | { | 154 | { |
155 | do_account_vtime(prev, 0); | 155 | do_account_vtime(prev); |
156 | prev->thread.user_timer = S390_lowcore.user_timer; | 156 | prev->thread.user_timer = S390_lowcore.user_timer; |
157 | prev->thread.system_timer = S390_lowcore.system_timer; | 157 | prev->thread.system_timer = S390_lowcore.system_timer; |
158 | S390_lowcore.user_timer = current->thread.user_timer; | 158 | S390_lowcore.user_timer = current->thread.user_timer; |
@@ -166,7 +166,7 @@ void vtime_task_switch(struct task_struct *prev) | |||
166 | */ | 166 | */ |
167 | void vtime_account_user(struct task_struct *tsk) | 167 | void vtime_account_user(struct task_struct *tsk) |
168 | { | 168 | { |
169 | if (do_account_vtime(tsk, HARDIRQ_OFFSET)) | 169 | if (do_account_vtime(tsk)) |
170 | virt_timer_expire(); | 170 | virt_timer_expire(); |
171 | } | 171 | } |
172 | 172 | ||