.. | .. |
---|
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 |
---|