Commit 8f2b468a authored by Martin Schwidefsky's avatar Martin Schwidefsky

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: default avatarFrederic Weisbecker <fweisbec@gmail.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent e93b1cc8
...@@ -94,7 +94,7 @@ static void update_mt_scaling(void) ...@@ -94,7 +94,7 @@ static void update_mt_scaling(void)
* Update process times based on virtual cpu times stored by entry.S * Update process times based on virtual cpu times stored by entry.S
* to the lowcore fields user_timer, system_timer & steal_clock. * to the lowcore fields user_timer, system_timer & steal_clock.
*/ */
static int do_account_vtime(struct task_struct *tsk, int hardirq_offset) static int do_account_vtime(struct task_struct *tsk)
{ {
u64 timer, clock, user, system, steal; u64 timer, clock, user, system, steal;
u64 user_scaled, system_scaled; u64 user_scaled, system_scaled;
...@@ -138,7 +138,7 @@ static int do_account_vtime(struct task_struct *tsk, int hardirq_offset) ...@@ -138,7 +138,7 @@ static int do_account_vtime(struct task_struct *tsk, int hardirq_offset)
} }
account_user_time(tsk, user); account_user_time(tsk, user);
tsk->utimescaled += user_scaled; tsk->utimescaled += user_scaled;
account_system_time(tsk, hardirq_offset, system); account_system_time(tsk, 0, system);
tsk->stimescaled += system_scaled; tsk->stimescaled += system_scaled;
steal = S390_lowcore.steal_timer; steal = S390_lowcore.steal_timer;
...@@ -152,7 +152,7 @@ static int do_account_vtime(struct task_struct *tsk, int hardirq_offset) ...@@ -152,7 +152,7 @@ static int do_account_vtime(struct task_struct *tsk, int hardirq_offset)
void vtime_task_switch(struct task_struct *prev) void vtime_task_switch(struct task_struct *prev)
{ {
do_account_vtime(prev, 0); do_account_vtime(prev);
prev->thread.user_timer = S390_lowcore.user_timer; prev->thread.user_timer = S390_lowcore.user_timer;
prev->thread.system_timer = S390_lowcore.system_timer; prev->thread.system_timer = S390_lowcore.system_timer;
S390_lowcore.user_timer = current->thread.user_timer; S390_lowcore.user_timer = current->thread.user_timer;
...@@ -166,7 +166,7 @@ void vtime_task_switch(struct task_struct *prev) ...@@ -166,7 +166,7 @@ void vtime_task_switch(struct task_struct *prev)
*/ */
void vtime_account_user(struct task_struct *tsk) void vtime_account_user(struct task_struct *tsk)
{ {
if (do_account_vtime(tsk, HARDIRQ_OFFSET)) if (do_account_vtime(tsk))
virt_timer_expire(); virt_timer_expire();
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment