| .. | .. |
|---|
| 223 | 223 | S390_lowcore.avg_steal_timer = avg_steal; |
|---|
| 224 | 224 | } |
|---|
| 225 | 225 | |
|---|
| 226 | | -static u64 vtime_delta(void) |
|---|
| 227 | | -{ |
|---|
| 228 | | - u64 timer = S390_lowcore.last_update_timer; |
|---|
| 229 | | - |
|---|
| 230 | | - S390_lowcore.last_update_timer = get_vtimer(); |
|---|
| 231 | | - |
|---|
| 232 | | - return timer - S390_lowcore.last_update_timer; |
|---|
| 233 | | -} |
|---|
| 234 | | - |
|---|
| 235 | 226 | /* |
|---|
| 236 | 227 | * Update process times based on virtual cpu times stored by entry.S |
|---|
| 237 | 228 | * to the lowcore fields user_timer, system_timer & steal_clock. |
|---|
| 238 | 229 | */ |
|---|
| 239 | | -void vtime_account_kernel(struct task_struct *tsk) |
|---|
| 230 | +void vtime_account_irq_enter(struct task_struct *tsk) |
|---|
| 240 | 231 | { |
|---|
| 241 | | - u64 delta = vtime_delta(); |
|---|
| 232 | + u64 timer; |
|---|
| 242 | 233 | |
|---|
| 243 | | - if (tsk->flags & PF_VCPU) |
|---|
| 244 | | - S390_lowcore.guest_timer += delta; |
|---|
| 234 | + timer = S390_lowcore.last_update_timer; |
|---|
| 235 | + S390_lowcore.last_update_timer = get_vtimer(); |
|---|
| 236 | + timer -= S390_lowcore.last_update_timer; |
|---|
| 237 | + |
|---|
| 238 | + if ((tsk->flags & PF_VCPU) && (irq_count() == 0)) |
|---|
| 239 | + S390_lowcore.guest_timer += timer; |
|---|
| 240 | + else if (hardirq_count()) |
|---|
| 241 | + S390_lowcore.hardirq_timer += timer; |
|---|
| 242 | + else if (in_serving_softirq()) |
|---|
| 243 | + S390_lowcore.softirq_timer += timer; |
|---|
| 245 | 244 | else |
|---|
| 246 | | - S390_lowcore.system_timer += delta; |
|---|
| 245 | + S390_lowcore.system_timer += timer; |
|---|
| 247 | 246 | |
|---|
| 248 | | - virt_timer_forward(delta); |
|---|
| 247 | + virt_timer_forward(timer); |
|---|
| 249 | 248 | } |
|---|
| 249 | +EXPORT_SYMBOL_GPL(vtime_account_irq_enter); |
|---|
| 250 | + |
|---|
| 251 | +void vtime_account_kernel(struct task_struct *tsk) |
|---|
| 252 | +__attribute__((alias("vtime_account_irq_enter"))); |
|---|
| 250 | 253 | EXPORT_SYMBOL_GPL(vtime_account_kernel); |
|---|
| 251 | | - |
|---|
| 252 | | -void vtime_account_softirq(struct task_struct *tsk) |
|---|
| 253 | | -{ |
|---|
| 254 | | - u64 delta = vtime_delta(); |
|---|
| 255 | | - |
|---|
| 256 | | - S390_lowcore.softirq_timer += delta; |
|---|
| 257 | | - |
|---|
| 258 | | - virt_timer_forward(delta); |
|---|
| 259 | | -} |
|---|
| 260 | | - |
|---|
| 261 | | -void vtime_account_hardirq(struct task_struct *tsk) |
|---|
| 262 | | -{ |
|---|
| 263 | | - u64 delta = vtime_delta(); |
|---|
| 264 | | - |
|---|
| 265 | | - S390_lowcore.hardirq_timer += delta; |
|---|
| 266 | | - |
|---|
| 267 | | - virt_timer_forward(delta); |
|---|
| 268 | | -} |
|---|
| 269 | 254 | |
|---|
| 270 | 255 | /* |
|---|
| 271 | 256 | * Sorted add to a list. List is linear searched until first bigger |
|---|