blob: 0796f938c4f0df3988bd1afbb30e5df8ce549f5e [file] [log] [blame]
Ingo Molnar325ea102018-03-03 12:20:47 +01001/*
2 * Simple CPU accounting cgroup controller
3 */
Frederic Weisbecker73fbec62012-06-16 15:57:37 +02004#include "sched.h"
Frederic Weisbecker73fbec62012-06-16 15:57:37 +02005
6#ifdef CONFIG_IRQ_TIME_ACCOUNTING
7
8/*
9 * There are no locks covering percpu hardirq/softirq time.
Frederic Weisbeckerbf9fae92012-09-08 15:23:11 +020010 * They are only modified in vtime_account, on corresponding CPU
Frederic Weisbecker73fbec62012-06-16 15:57:37 +020011 * with interrupts disabled. So, writes are safe.
12 * They are read and saved off onto struct rq in update_rq_clock().
13 * This may result in other CPU reading this CPU's irq time and can
Frederic Weisbeckerbf9fae92012-09-08 15:23:11 +020014 * race with irq/vtime_account on this CPU. We would either get old
Frederic Weisbecker73fbec62012-06-16 15:57:37 +020015 * or new value with a side effect of accounting a slice of irq time to wrong
16 * task when irq is in progress while we read rq->clock. That is a worthy
17 * compromise in place of having locks on each irq in account_system_time.
18 */
Frederic Weisbecker19d23dbf2016-09-26 02:29:20 +020019DEFINE_PER_CPU(struct irqtime, cpu_irqtime);
Frederic Weisbecker73fbec62012-06-16 15:57:37 +020020
Frederic Weisbecker73fbec62012-06-16 15:57:37 +020021static int sched_clock_irqtime;
22
23void enable_sched_clock_irqtime(void)
24{
25 sched_clock_irqtime = 1;
26}
27
28void disable_sched_clock_irqtime(void)
29{
30 sched_clock_irqtime = 0;
31}
32
Frederic Weisbecker25e2d8c2017-04-25 16:10:48 +020033static void irqtime_account_delta(struct irqtime *irqtime, u64 delta,
34 enum cpu_usage_stat idx)
35{
36 u64 *cpustat = kcpustat_this_cpu->cpustat;
37
38 u64_stats_update_begin(&irqtime->sync);
39 cpustat[idx] += delta;
40 irqtime->total += delta;
41 irqtime->tick_delta += delta;
42 u64_stats_update_end(&irqtime->sync);
43}
44
Frederic Weisbecker73fbec62012-06-16 15:57:37 +020045/*
46 * Called before incrementing preempt_count on {soft,}irq_enter
47 * and before decrementing preempt_count on {soft,}irq_exit.
48 */
Frederic Weisbecker3e1df4f52012-10-06 05:23:22 +020049void irqtime_account_irq(struct task_struct *curr)
Frederic Weisbecker73fbec62012-06-16 15:57:37 +020050{
Frederic Weisbecker19d23dbf2016-09-26 02:29:20 +020051 struct irqtime *irqtime = this_cpu_ptr(&cpu_irqtime);
Frederic Weisbecker73fbec62012-06-16 15:57:37 +020052 s64 delta;
53 int cpu;
54
55 if (!sched_clock_irqtime)
56 return;
57
Frederic Weisbecker73fbec62012-06-16 15:57:37 +020058 cpu = smp_processor_id();
Frederic Weisbecker19d23dbf2016-09-26 02:29:20 +020059 delta = sched_clock_cpu(cpu) - irqtime->irq_start_time;
60 irqtime->irq_start_time += delta;
Frederic Weisbecker73fbec62012-06-16 15:57:37 +020061
Frederic Weisbecker73fbec62012-06-16 15:57:37 +020062 /*
63 * We do not account for softirq time from ksoftirqd here.
64 * We want to continue accounting softirq time to ksoftirqd thread
65 * in that case, so as not to confuse scheduler with a special task
66 * that do not consume any time, but still wants to run.
67 */
Frederic Weisbecker25e2d8c2017-04-25 16:10:48 +020068 if (hardirq_count())
69 irqtime_account_delta(irqtime, delta, CPUTIME_IRQ);
70 else if (in_serving_softirq() && curr != this_cpu_ksoftirqd())
71 irqtime_account_delta(irqtime, delta, CPUTIME_SOFTIRQ);
Frederic Weisbecker73fbec62012-06-16 15:57:37 +020072}
Frederic Weisbecker3e1df4f52012-10-06 05:23:22 +020073EXPORT_SYMBOL_GPL(irqtime_account_irq);
Frederic Weisbecker73fbec62012-06-16 15:57:37 +020074
Frederic Weisbecker2b1f9672017-01-31 04:09:41 +010075static u64 irqtime_tick_accounted(u64 maxtime)
Frederic Weisbecker73fbec62012-06-16 15:57:37 +020076{
Frederic Weisbeckera499a5a2017-01-31 04:09:32 +010077 struct irqtime *irqtime = this_cpu_ptr(&cpu_irqtime);
Frederic Weisbecker2b1f9672017-01-31 04:09:41 +010078 u64 delta;
Frederic Weisbecker73fbec62012-06-16 15:57:37 +020079
Frederic Weisbecker2b1f9672017-01-31 04:09:41 +010080 delta = min(irqtime->tick_delta, maxtime);
81 irqtime->tick_delta -= delta;
Frederic Weisbecker2810f612016-09-26 02:29:18 +020082
Frederic Weisbeckera499a5a2017-01-31 04:09:32 +010083 return delta;
Frederic Weisbecker73fbec62012-06-16 15:57:37 +020084}
85
86#else /* CONFIG_IRQ_TIME_ACCOUNTING */
87
88#define sched_clock_irqtime (0)
89
Frederic Weisbecker2b1f9672017-01-31 04:09:41 +010090static u64 irqtime_tick_accounted(u64 dummy)
Rik van Riel57430212016-07-13 16:50:01 +020091{
92 return 0;
93}
94
Frederic Weisbecker73fbec62012-06-16 15:57:37 +020095#endif /* !CONFIG_IRQ_TIME_ACCOUNTING */
96
97static inline void task_group_account_field(struct task_struct *p, int index,
98 u64 tmp)
99{
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200100 /*
101 * Since all updates are sure to touch the root cgroup, we
102 * get ourselves ahead and touch it first. If the root cgroup
103 * is the only cgroup, then nothing else should be necessary.
104 *
105 */
Christoph Lametera4f61cc2013-08-07 15:38:24 +0000106 __this_cpu_add(kernel_cpustat.cpustat[index], tmp);
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200107
Tejun Heod2cc5ed2017-09-25 08:12:04 -0700108 cgroup_account_cputime_field(p, index, tmp);
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200109}
110
111/*
Ingo Molnar97fb7a02018-03-03 14:01:12 +0100112 * Account user CPU time to a process.
113 * @p: the process that the CPU time gets accounted to
114 * @cputime: the CPU time spent in user space since the last update
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200115 */
Frederic Weisbecker23244a52017-01-31 04:09:37 +0100116void account_user_time(struct task_struct *p, u64 cputime)
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200117{
118 int index;
119
120 /* Add user time to process. */
Frederic Weisbecker23244a52017-01-31 04:09:37 +0100121 p->utime += cputime;
122 account_group_user_time(p, cputime);
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200123
Dongsheng Yangd0ea0262014-01-27 22:00:45 -0500124 index = (task_nice(p) > 0) ? CPUTIME_NICE : CPUTIME_USER;
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200125
126 /* Add user time to cpustat. */
Frederic Weisbecker23244a52017-01-31 04:09:37 +0100127 task_group_account_field(p, index, cputime);
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200128
129 /* Account for user time used */
Frederic Weisbecker6fac4822012-11-13 14:20:55 +0100130 acct_account_cputime(p);
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200131}
132
133/*
Ingo Molnar97fb7a02018-03-03 14:01:12 +0100134 * Account guest CPU time to a process.
135 * @p: the process that the CPU time gets accounted to
136 * @cputime: the CPU time spent in virtual machine since the last update
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200137 */
Frederic Weisbeckerfb8b0492017-01-31 04:09:40 +0100138void account_guest_time(struct task_struct *p, u64 cputime)
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200139{
140 u64 *cpustat = kcpustat_this_cpu->cpustat;
141
142 /* Add guest time to process. */
Frederic Weisbeckerfb8b0492017-01-31 04:09:40 +0100143 p->utime += cputime;
144 account_group_user_time(p, cputime);
145 p->gtime += cputime;
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200146
147 /* Add guest time to cpustat. */
Dongsheng Yangd0ea0262014-01-27 22:00:45 -0500148 if (task_nice(p) > 0) {
Frederic Weisbeckerfb8b0492017-01-31 04:09:40 +0100149 cpustat[CPUTIME_NICE] += cputime;
150 cpustat[CPUTIME_GUEST_NICE] += cputime;
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200151 } else {
Frederic Weisbeckerfb8b0492017-01-31 04:09:40 +0100152 cpustat[CPUTIME_USER] += cputime;
153 cpustat[CPUTIME_GUEST] += cputime;
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200154 }
155}
156
157/*
Ingo Molnar97fb7a02018-03-03 14:01:12 +0100158 * Account system CPU time to a process and desired cpustat field
159 * @p: the process that the CPU time gets accounted to
160 * @cputime: the CPU time spent in kernel space since the last update
Stanislaw Gruszka40565b52016-11-15 03:06:51 +0100161 * @index: pointer to cpustat field that has to be updated
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200162 */
Frederic Weisbeckerc31cc6a2017-01-05 18:11:43 +0100163void account_system_index_time(struct task_struct *p,
Frederic Weisbeckerfb8b0492017-01-31 04:09:40 +0100164 u64 cputime, enum cpu_usage_stat index)
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200165{
166 /* Add system time to process. */
Frederic Weisbeckerfb8b0492017-01-31 04:09:40 +0100167 p->stime += cputime;
168 account_group_system_time(p, cputime);
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200169
170 /* Add system time to cpustat. */
Frederic Weisbeckerfb8b0492017-01-31 04:09:40 +0100171 task_group_account_field(p, index, cputime);
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200172
173 /* Account for system time used */
Frederic Weisbecker6fac4822012-11-13 14:20:55 +0100174 acct_account_cputime(p);
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200175}
176
177/*
Ingo Molnar97fb7a02018-03-03 14:01:12 +0100178 * Account system CPU time to a process.
179 * @p: the process that the CPU time gets accounted to
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200180 * @hardirq_offset: the offset to subtract from hardirq_count()
Ingo Molnar97fb7a02018-03-03 14:01:12 +0100181 * @cputime: the CPU time spent in kernel space since the last update
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200182 */
Frederic Weisbeckerfb8b0492017-01-31 04:09:40 +0100183void account_system_time(struct task_struct *p, int hardirq_offset, u64 cputime)
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200184{
185 int index;
186
187 if ((p->flags & PF_VCPU) && (irq_count() - hardirq_offset == 0)) {
Stanislaw Gruszka40565b52016-11-15 03:06:51 +0100188 account_guest_time(p, cputime);
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200189 return;
190 }
191
192 if (hardirq_count() - hardirq_offset)
193 index = CPUTIME_IRQ;
194 else if (in_serving_softirq())
195 index = CPUTIME_SOFTIRQ;
196 else
197 index = CPUTIME_SYSTEM;
198
Frederic Weisbeckerc31cc6a2017-01-05 18:11:43 +0100199 account_system_index_time(p, cputime, index);
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200200}
201
202/*
203 * Account for involuntary wait time.
Ingo Molnar97fb7a02018-03-03 14:01:12 +0100204 * @cputime: the CPU time spent in involuntary wait
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200205 */
Frederic Weisbeckerbe9095e2017-01-31 04:09:38 +0100206void account_steal_time(u64 cputime)
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200207{
208 u64 *cpustat = kcpustat_this_cpu->cpustat;
209
Frederic Weisbeckerbe9095e2017-01-31 04:09:38 +0100210 cpustat[CPUTIME_STEAL] += cputime;
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200211}
212
213/*
214 * Account for idle time.
Ingo Molnar97fb7a02018-03-03 14:01:12 +0100215 * @cputime: the CPU time spent in idle wait
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200216 */
Frederic Weisbecker18b43a92017-01-31 04:09:39 +0100217void account_idle_time(u64 cputime)
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200218{
219 u64 *cpustat = kcpustat_this_cpu->cpustat;
220 struct rq *rq = this_rq();
221
222 if (atomic_read(&rq->nr_iowait) > 0)
Frederic Weisbecker18b43a92017-01-31 04:09:39 +0100223 cpustat[CPUTIME_IOWAIT] += cputime;
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200224 else
Frederic Weisbecker18b43a92017-01-31 04:09:39 +0100225 cpustat[CPUTIME_IDLE] += cputime;
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200226}
227
Wanpeng Li03cbc732016-08-17 10:05:46 +0800228/*
229 * When a guest is interrupted for a longer amount of time, missed clock
230 * ticks are not redelivered later. Due to that, this function may on
231 * occasion account more time than the calling functions think elapsed.
232 */
Frederic Weisbecker2b1f9672017-01-31 04:09:41 +0100233static __always_inline u64 steal_account_process_time(u64 maxtime)
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200234{
235#ifdef CONFIG_PARAVIRT
236 if (static_key_false(&paravirt_steal_enabled)) {
Frederic Weisbecker2b1f9672017-01-31 04:09:41 +0100237 u64 steal;
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200238
239 steal = paravirt_steal_clock(smp_processor_id());
240 steal -= this_rq()->prev_steal_time;
Frederic Weisbecker2b1f9672017-01-31 04:09:41 +0100241 steal = min(steal, maxtime);
242 account_steal_time(steal);
243 this_rq()->prev_steal_time += steal;
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200244
Frederic Weisbecker2b1f9672017-01-31 04:09:41 +0100245 return steal;
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200246 }
247#endif
Wanpeng Li807e5b82016-06-13 18:32:46 +0800248 return 0;
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200249}
250
Frederic Weisbeckera634f932012-11-21 15:55:59 +0100251/*
Rik van Riel57430212016-07-13 16:50:01 +0200252 * Account how much elapsed time was spent in steal, irq, or softirq time.
253 */
Frederic Weisbecker2b1f9672017-01-31 04:09:41 +0100254static inline u64 account_other_time(u64 max)
Rik van Riel57430212016-07-13 16:50:01 +0200255{
Frederic Weisbecker2b1f9672017-01-31 04:09:41 +0100256 u64 accounted;
Rik van Riel57430212016-07-13 16:50:01 +0200257
Frederic Weisbecker2c11dba2017-11-06 16:01:27 +0100258 lockdep_assert_irqs_disabled();
Frederic Weisbecker2810f612016-09-26 02:29:18 +0200259
Rik van Riel57430212016-07-13 16:50:01 +0200260 accounted = steal_account_process_time(max);
261
262 if (accounted < max)
Frederic Weisbeckera499a5a2017-01-31 04:09:32 +0100263 accounted += irqtime_tick_accounted(max - accounted);
Rik van Riel57430212016-07-13 16:50:01 +0200264
265 return accounted;
266}
267
Stanislaw Gruszkaa1eb1412016-08-17 11:30:44 +0200268#ifdef CONFIG_64BIT
269static inline u64 read_sum_exec_runtime(struct task_struct *t)
270{
271 return t->se.sum_exec_runtime;
272}
273#else
274static u64 read_sum_exec_runtime(struct task_struct *t)
275{
276 u64 ns;
277 struct rq_flags rf;
278 struct rq *rq;
279
280 rq = task_rq_lock(t, &rf);
281 ns = t->se.sum_exec_runtime;
282 task_rq_unlock(rq, t, &rf);
283
284 return ns;
285}
286#endif
287
Rik van Riel57430212016-07-13 16:50:01 +0200288/*
Frederic Weisbeckera634f932012-11-21 15:55:59 +0100289 * Accumulate raw cputime values of dead tasks (sig->[us]time) and live
290 * tasks (sum on group iteration) belonging to @tsk's group.
291 */
292void thread_group_cputime(struct task_struct *tsk, struct task_cputime *times)
293{
294 struct signal_struct *sig = tsk->signal;
Frederic Weisbecker5613fda2017-01-31 04:09:23 +0100295 u64 utime, stime;
Frederic Weisbeckera634f932012-11-21 15:55:59 +0100296 struct task_struct *t;
Rik van Riele78c3492014-08-16 13:40:10 -0400297 unsigned int seq, nextseq;
Rik van Riel9c368b52014-09-12 09:12:15 -0400298 unsigned long flags;
Frederic Weisbeckera634f932012-11-21 15:55:59 +0100299
Stanislaw Gruszkaa1eb1412016-08-17 11:30:44 +0200300 /*
301 * Update current task runtime to account pending time since last
302 * scheduler action or thread_group_cputime() call. This thread group
303 * might have other running tasks on different CPUs, but updating
304 * their runtime can affect syscall performance, so we skip account
305 * those pending times and rely only on values updated on tick or
306 * other scheduler action.
307 */
308 if (same_thread_group(current, tsk))
309 (void) task_sched_runtime(current);
310
Frederic Weisbeckera634f932012-11-21 15:55:59 +0100311 rcu_read_lock();
Rik van Riele78c3492014-08-16 13:40:10 -0400312 /* Attempt a lockless read on the first round. */
313 nextseq = 0;
314 do {
315 seq = nextseq;
Rik van Riel9c368b52014-09-12 09:12:15 -0400316 flags = read_seqbegin_or_lock_irqsave(&sig->stats_lock, &seq);
Rik van Riele78c3492014-08-16 13:40:10 -0400317 times->utime = sig->utime;
318 times->stime = sig->stime;
319 times->sum_exec_runtime = sig->sum_sched_runtime;
320
321 for_each_thread(tsk, t) {
322 task_cputime(t, &utime, &stime);
323 times->utime += utime;
324 times->stime += stime;
Stanislaw Gruszkaa1eb1412016-08-17 11:30:44 +0200325 times->sum_exec_runtime += read_sum_exec_runtime(t);
Rik van Riele78c3492014-08-16 13:40:10 -0400326 }
327 /* If lockless access failed, take the lock. */
328 nextseq = 1;
329 } while (need_seqretry(&sig->stats_lock, seq));
Rik van Riel9c368b52014-09-12 09:12:15 -0400330 done_seqretry_irqrestore(&sig->stats_lock, seq, flags);
Frederic Weisbeckera634f932012-11-21 15:55:59 +0100331 rcu_read_unlock();
332}
333
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200334#ifdef CONFIG_IRQ_TIME_ACCOUNTING
335/*
336 * Account a tick to a process and cpustat
Ingo Molnar97fb7a02018-03-03 14:01:12 +0100337 * @p: the process that the CPU time gets accounted to
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200338 * @user_tick: is the tick from userspace
339 * @rq: the pointer to rq
340 *
341 * Tick demultiplexing follows the order
342 * - pending hardirq update
343 * - pending softirq update
344 * - user_time
345 * - idle_time
346 * - system time
347 * - check for guest_time
348 * - else account as system_time
349 *
350 * Check for hardirq is done both for system and user time as there is
351 * no timer going off while we are on hardirq and hence we may never get an
352 * opportunity to update it solely in system time.
353 * p->stime and friends are only updated on system time and not on irq
354 * softirq as those do not count in task exec_runtime any more.
355 */
356static void irqtime_account_process_tick(struct task_struct *p, int user_tick,
Thomas Gleixner2d513862014-05-02 23:26:24 +0200357 struct rq *rq, int ticks)
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200358{
Frederic Weisbecker2b1f9672017-01-31 04:09:41 +0100359 u64 other, cputime = TICK_NSEC * ticks;
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200360
Rik van Riel57430212016-07-13 16:50:01 +0200361 /*
362 * When returning from idle, many ticks can get accounted at
363 * once, including some ticks of steal, irq, and softirq time.
364 * Subtract those ticks from the amount of time accounted to
365 * idle, or potentially user or system time. Due to rounding,
366 * other time can exceed ticks occasionally.
367 */
Wanpeng Li03cbc732016-08-17 10:05:46 +0800368 other = account_other_time(ULONG_MAX);
Frederic Weisbecker2b1f9672017-01-31 04:09:41 +0100369 if (other >= cputime)
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200370 return;
Frederic Weisbecker23244a52017-01-31 04:09:37 +0100371
Frederic Weisbecker2b1f9672017-01-31 04:09:41 +0100372 cputime -= other;
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200373
Rik van Riel57430212016-07-13 16:50:01 +0200374 if (this_cpu_ksoftirqd() == p) {
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200375 /*
376 * ksoftirqd time do not get accounted in cpu_softirq_time.
377 * So, we have to handle it separately here.
378 * Also, p->stime needs to be updated for ksoftirqd.
379 */
Frederic Weisbeckerfb8b0492017-01-31 04:09:40 +0100380 account_system_index_time(p, cputime, CPUTIME_SOFTIRQ);
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200381 } else if (user_tick) {
Stanislaw Gruszka40565b52016-11-15 03:06:51 +0100382 account_user_time(p, cputime);
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200383 } else if (p == rq->idle) {
Frederic Weisbecker18b43a92017-01-31 04:09:39 +0100384 account_idle_time(cputime);
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200385 } else if (p->flags & PF_VCPU) { /* System time or guest time */
Frederic Weisbeckerfb8b0492017-01-31 04:09:40 +0100386 account_guest_time(p, cputime);
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200387 } else {
Frederic Weisbeckerfb8b0492017-01-31 04:09:40 +0100388 account_system_index_time(p, cputime, CPUTIME_SYSTEM);
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200389 }
390}
391
392static void irqtime_account_idle_ticks(int ticks)
393{
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200394 struct rq *rq = this_rq();
395
Thomas Gleixner2d513862014-05-02 23:26:24 +0200396 irqtime_account_process_tick(current, 0, rq, ticks);
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200397}
398#else /* CONFIG_IRQ_TIME_ACCOUNTING */
Ingo Molnar97fb7a02018-03-03 14:01:12 +0100399static inline void irqtime_account_idle_ticks(int ticks) { }
Frederic Weisbecker3f4724e2012-07-16 18:00:34 +0200400static inline void irqtime_account_process_tick(struct task_struct *p, int user_tick,
Ingo Molnar97fb7a02018-03-03 14:01:12 +0100401 struct rq *rq, int nr_ticks) { }
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200402#endif /* CONFIG_IRQ_TIME_ACCOUNTING */
403
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200404/*
405 * Use precise platform statistics if available:
406 */
407#ifdef CONFIG_VIRT_CPU_ACCOUNTING
Ingo Molnar97fb7a02018-03-03 14:01:12 +0100408# ifndef __ARCH_HAS_VTIME_TASK_SWITCH
Frederic Weisbeckerb0493402013-07-12 03:10:15 +0200409void vtime_common_task_switch(struct task_struct *prev)
Frederic Weisbeckere3942ba2012-11-14 00:24:25 +0100410{
411 if (is_idle_task(prev))
412 vtime_account_idle(prev);
413 else
414 vtime_account_system(prev);
415
Frederic Weisbeckerc8d7dab2017-01-05 18:11:50 +0100416 vtime_flush(prev);
Frederic Weisbeckere3942ba2012-11-14 00:24:25 +0100417 arch_vtime_task_switch(prev);
418}
Ingo Molnar97fb7a02018-03-03 14:01:12 +0100419# endif
Frederic Weisbecker0cfdf9a2016-07-13 16:50:03 +0200420#endif /* CONFIG_VIRT_CPU_ACCOUNTING */
421
422
423#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE
Frederic Weisbeckera7e1a9e2012-09-08 16:14:02 +0200424/*
425 * Archs that account the whole time spent in the idle task
426 * (outside irq) as idle time can rely on this and just implement
Frederic Weisbeckerfd25b4c2012-11-13 18:21:22 +0100427 * vtime_account_system() and vtime_account_idle(). Archs that
Frederic Weisbeckera7e1a9e2012-09-08 16:14:02 +0200428 * have other meaning of the idle time (s390 only includes the
429 * time spent by the CPU when it's in low power mode) must override
430 * vtime_account().
431 */
432#ifndef __ARCH_HAS_VTIME_ACCOUNT
Frederic Weisbecker0cfdf9a2016-07-13 16:50:03 +0200433void vtime_account_irq_enter(struct task_struct *tsk)
Frederic Weisbeckera7e1a9e2012-09-08 16:14:02 +0200434{
Frederic Weisbecker0cfdf9a2016-07-13 16:50:03 +0200435 if (!in_interrupt() && is_idle_task(tsk))
436 vtime_account_idle(tsk);
437 else
438 vtime_account_system(tsk);
Frederic Weisbeckera7e1a9e2012-09-08 16:14:02 +0200439}
Frederic Weisbecker0cfdf9a2016-07-13 16:50:03 +0200440EXPORT_SYMBOL_GPL(vtime_account_irq_enter);
Frederic Weisbeckera7e1a9e2012-09-08 16:14:02 +0200441#endif /* __ARCH_HAS_VTIME_ACCOUNT */
442
Tejun Heo8157a7f2017-09-25 14:27:54 -0700443void cputime_adjust(struct task_cputime *curr, struct prev_cputime *prev,
444 u64 *ut, u64 *st)
445{
446 *ut = curr->utime;
447 *st = curr->stime;
448}
449
Frederic Weisbecker5613fda2017-01-31 04:09:23 +0100450void task_cputime_adjusted(struct task_struct *p, u64 *ut, u64 *st)
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200451{
Frederic Weisbecker9fbc42e2013-02-25 17:25:39 +0100452 *ut = p->utime;
453 *st = p->stime;
454}
Andrey Smetanin9eec50b2015-09-16 12:29:50 +0300455EXPORT_SYMBOL_GPL(task_cputime_adjusted);
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200456
Frederic Weisbecker5613fda2017-01-31 04:09:23 +0100457void thread_group_cputime_adjusted(struct task_struct *p, u64 *ut, u64 *st)
Frederic Weisbecker9fbc42e2013-02-25 17:25:39 +0100458{
459 struct task_cputime cputime;
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200460
Frederic Weisbecker9fbc42e2013-02-25 17:25:39 +0100461 thread_group_cputime(p, &cputime);
462
463 *ut = cputime.utime;
464 *st = cputime.stime;
465}
Ingo Molnar97fb7a02018-03-03 14:01:12 +0100466
467#else /* !CONFIG_VIRT_CPU_ACCOUNTING_NATIVE: */
468
Frederic Weisbecker9fbc42e2013-02-25 17:25:39 +0100469/*
Ingo Molnar97fb7a02018-03-03 14:01:12 +0100470 * Account a single tick of CPU time.
471 * @p: the process that the CPU time gets accounted to
Frederic Weisbecker9fbc42e2013-02-25 17:25:39 +0100472 * @user_tick: indicates if the tick is a user or a system tick
473 */
474void account_process_tick(struct task_struct *p, int user_tick)
475{
Frederic Weisbecker2b1f9672017-01-31 04:09:41 +0100476 u64 cputime, steal;
Frederic Weisbecker9fbc42e2013-02-25 17:25:39 +0100477 struct rq *rq = this_rq();
478
Frederic Weisbecker55dbdcf2015-11-19 16:47:32 +0100479 if (vtime_accounting_cpu_enabled())
Frederic Weisbecker9fbc42e2013-02-25 17:25:39 +0100480 return;
481
482 if (sched_clock_irqtime) {
Thomas Gleixner2d513862014-05-02 23:26:24 +0200483 irqtime_account_process_tick(p, user_tick, rq, 1);
Frederic Weisbecker9fbc42e2013-02-25 17:25:39 +0100484 return;
485 }
486
Frederic Weisbecker2b1f9672017-01-31 04:09:41 +0100487 cputime = TICK_NSEC;
Wanpeng Li03cbc732016-08-17 10:05:46 +0800488 steal = steal_account_process_time(ULONG_MAX);
Rik van Riel57430212016-07-13 16:50:01 +0200489
Frederic Weisbecker2b1f9672017-01-31 04:09:41 +0100490 if (steal >= cputime)
Frederic Weisbecker9fbc42e2013-02-25 17:25:39 +0100491 return;
492
Frederic Weisbecker2b1f9672017-01-31 04:09:41 +0100493 cputime -= steal;
Rik van Riel57430212016-07-13 16:50:01 +0200494
Frederic Weisbecker9fbc42e2013-02-25 17:25:39 +0100495 if (user_tick)
Stanislaw Gruszka40565b52016-11-15 03:06:51 +0100496 account_user_time(p, cputime);
Frederic Weisbecker9fbc42e2013-02-25 17:25:39 +0100497 else if ((p != rq->idle) || (irq_count() != HARDIRQ_OFFSET))
Frederic Weisbeckerfb8b0492017-01-31 04:09:40 +0100498 account_system_time(p, HARDIRQ_OFFSET, cputime);
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200499 else
Frederic Weisbecker18b43a92017-01-31 04:09:39 +0100500 account_idle_time(cputime);
Frederic Weisbecker9fbc42e2013-02-25 17:25:39 +0100501}
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200502
Frederic Weisbecker9fbc42e2013-02-25 17:25:39 +0100503/*
Frederic Weisbecker9fbc42e2013-02-25 17:25:39 +0100504 * Account multiple ticks of idle time.
505 * @ticks: number of stolen ticks
506 */
507void account_idle_ticks(unsigned long ticks)
508{
Frederic Weisbecker18b43a92017-01-31 04:09:39 +0100509 u64 cputime, steal;
Frederic Weisbecker26f2c752016-08-11 14:58:24 +0200510
Frederic Weisbecker9fbc42e2013-02-25 17:25:39 +0100511 if (sched_clock_irqtime) {
512 irqtime_account_idle_ticks(ticks);
513 return;
514 }
515
Frederic Weisbecker18b43a92017-01-31 04:09:39 +0100516 cputime = ticks * TICK_NSEC;
Frederic Weisbecker2b1f9672017-01-31 04:09:41 +0100517 steal = steal_account_process_time(ULONG_MAX);
Wanpeng Lif9bcf1e2016-08-11 13:36:35 +0800518
519 if (steal >= cputime)
520 return;
521
522 cputime -= steal;
523 account_idle_time(cputime);
Frederic Weisbecker9fbc42e2013-02-25 17:25:39 +0100524}
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200525
Frederic Weisbeckerd9a3c982013-02-20 18:54:55 +0100526/*
Stanislaw Gruszka55eaa7c2013-04-30 17:14:42 +0200527 * Perform (stime * rtime) / total, but avoid multiplication overflow by
528 * loosing precision when the numbers are big.
Frederic Weisbeckerd9a3c982013-02-20 18:54:55 +0100529 */
Frederic Weisbecker5613fda2017-01-31 04:09:23 +0100530static u64 scale_stime(u64 stime, u64 rtime, u64 total)
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200531{
Stanislaw Gruszka55eaa7c2013-04-30 17:14:42 +0200532 u64 scaled;
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200533
Stanislaw Gruszka55eaa7c2013-04-30 17:14:42 +0200534 for (;;) {
535 /* Make sure "rtime" is the bigger of stime/rtime */
Stanislaw Gruszka84f9f3a2013-05-02 15:34:33 +0200536 if (stime > rtime)
537 swap(rtime, stime);
Stanislaw Gruszka55eaa7c2013-04-30 17:14:42 +0200538
539 /* Make sure 'total' fits in 32 bits */
540 if (total >> 32)
541 goto drop_precision;
542
543 /* Does rtime (and thus stime) fit in 32 bits? */
544 if (!(rtime >> 32))
545 break;
546
547 /* Can we just balance rtime/stime rather than dropping bits? */
548 if (stime >> 31)
549 goto drop_precision;
550
551 /* We can grow stime and shrink rtime and try to make them both fit */
552 stime <<= 1;
553 rtime >>= 1;
554 continue;
555
556drop_precision:
557 /* We drop from rtime, it has more bits than stime */
558 rtime >>= 1;
559 total >>= 1;
Frederic Weisbeckerd9a3c982013-02-20 18:54:55 +0100560 }
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200561
Stanislaw Gruszka55eaa7c2013-04-30 17:14:42 +0200562 /*
563 * Make sure gcc understands that this is a 32x32->64 multiply,
564 * followed by a 64/32->64 divide.
565 */
566 scaled = div_u64((u64) (u32) stime * (u64) (u32) rtime, (u32)total);
Frederic Weisbecker5613fda2017-01-31 04:09:23 +0100567 return scaled;
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200568}
569
Frederic Weisbeckerfa092052012-11-28 17:00:57 +0100570/*
Peter Zijlstra9d7fb042015-06-30 11:30:54 +0200571 * Adjust tick based cputime random precision against scheduler runtime
572 * accounting.
Rik van Riel347abad2014-09-30 15:59:47 -0400573 *
Peter Zijlstra9d7fb042015-06-30 11:30:54 +0200574 * Tick based cputime accounting depend on random scheduling timeslices of a
575 * task to be interrupted or not by the timer. Depending on these
576 * circumstances, the number of these interrupts may be over or
577 * under-optimistic, matching the real user and system cputime with a variable
578 * precision.
579 *
580 * Fix this by scaling these tick based values against the total runtime
581 * accounted by the CFS scheduler.
582 *
583 * This code provides the following guarantees:
584 *
585 * stime + utime == rtime
586 * stime_i+1 >= stime_i, utime_i+1 >= utime_i
587 *
588 * Assuming that rtime_i+1 >= rtime_i.
Frederic Weisbeckerfa092052012-11-28 17:00:57 +0100589 */
Tejun Heocfb766d2017-09-25 08:12:04 -0700590void cputime_adjust(struct task_cputime *curr, struct prev_cputime *prev,
591 u64 *ut, u64 *st)
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200592{
Frederic Weisbecker5613fda2017-01-31 04:09:23 +0100593 u64 rtime, stime, utime;
Peter Zijlstra9d7fb042015-06-30 11:30:54 +0200594 unsigned long flags;
Frederic Weisbeckerfa092052012-11-28 17:00:57 +0100595
Peter Zijlstra9d7fb042015-06-30 11:30:54 +0200596 /* Serialize concurrent callers such that we can honour our guarantees */
597 raw_spin_lock_irqsave(&prev->lock, flags);
Frederic Weisbecker5613fda2017-01-31 04:09:23 +0100598 rtime = curr->sum_exec_runtime;
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200599
Stanislaw Gruszka772c8082013-04-30 11:35:05 +0200600 /*
Peter Zijlstra9d7fb042015-06-30 11:30:54 +0200601 * This is possible under two circumstances:
602 * - rtime isn't monotonic after all (a bug);
603 * - we got reordered by the lock.
604 *
605 * In both cases this acts as a filter such that the rest of the code
606 * can assume it is monotonic regardless of anything else.
Stanislaw Gruszka772c8082013-04-30 11:35:05 +0200607 */
608 if (prev->stime + prev->utime >= rtime)
609 goto out;
610
Stanislaw Gruszka5a8e01f2013-09-04 15:16:03 +0200611 stime = curr->stime;
612 utime = curr->utime;
613
Peter Zijlstra173be9a2016-08-15 18:38:42 +0200614 /*
Ingo Molnar3b9c08a2017-07-04 11:53:40 +0200615 * If either stime or utime are 0, assume all runtime is userspace.
616 * Once a task gets some ticks, the monotonicy code at 'update:'
617 * will ensure things converge to the observed ratio.
Peter Zijlstra173be9a2016-08-15 18:38:42 +0200618 */
Ingo Molnar3b9c08a2017-07-04 11:53:40 +0200619 if (stime == 0) {
620 utime = rtime;
621 goto update;
Frederic Weisbeckerd9a3c982013-02-20 18:54:55 +0100622 }
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200623
Ingo Molnar3b9c08a2017-07-04 11:53:40 +0200624 if (utime == 0) {
625 stime = rtime;
626 goto update;
627 }
628
629 stime = scale_stime(stime, rtime, stime + utime);
630
631update:
Peter Zijlstra9d7fb042015-06-30 11:30:54 +0200632 /*
633 * Make sure stime doesn't go backwards; this preserves monotonicity
634 * for utime because rtime is monotonic.
635 *
636 * utime_i+1 = rtime_i+1 - stime_i
637 * = rtime_i+1 - (rtime_i - utime_i)
638 * = (rtime_i+1 - rtime_i) + utime_i
639 * >= utime_i
640 */
641 if (stime < prev->stime)
642 stime = prev->stime;
643 utime = rtime - stime;
644
645 /*
646 * Make sure utime doesn't go backwards; this still preserves
647 * monotonicity for stime, analogous argument to above.
648 */
649 if (utime < prev->utime) {
650 utime = prev->utime;
651 stime = rtime - utime;
652 }
653
Peter Zijlstra9d7fb042015-06-30 11:30:54 +0200654 prev->stime = stime;
655 prev->utime = utime;
Stanislaw Gruszka772c8082013-04-30 11:35:05 +0200656out:
Frederic Weisbeckerd37f761d2012-11-22 00:58:35 +0100657 *ut = prev->utime;
658 *st = prev->stime;
Peter Zijlstra9d7fb042015-06-30 11:30:54 +0200659 raw_spin_unlock_irqrestore(&prev->lock, flags);
Frederic Weisbeckerd37f761d2012-11-22 00:58:35 +0100660}
661
Frederic Weisbecker5613fda2017-01-31 04:09:23 +0100662void task_cputime_adjusted(struct task_struct *p, u64 *ut, u64 *st)
Frederic Weisbeckerd37f761d2012-11-22 00:58:35 +0100663{
664 struct task_cputime cputime = {
Frederic Weisbeckerd37f761d2012-11-22 00:58:35 +0100665 .sum_exec_runtime = p->se.sum_exec_runtime,
666 };
667
Frederic Weisbecker6fac4822012-11-13 14:20:55 +0100668 task_cputime(p, &cputime.utime, &cputime.stime);
Frederic Weisbeckerd37f761d2012-11-22 00:58:35 +0100669 cputime_adjust(&cputime, &p->prev_cputime, ut, st);
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200670}
Andrey Smetanin9eec50b2015-09-16 12:29:50 +0300671EXPORT_SYMBOL_GPL(task_cputime_adjusted);
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200672
Frederic Weisbecker5613fda2017-01-31 04:09:23 +0100673void thread_group_cputime_adjusted(struct task_struct *p, u64 *ut, u64 *st)
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200674{
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200675 struct task_cputime cputime;
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200676
677 thread_group_cputime(p, &cputime);
Frederic Weisbeckerd37f761d2012-11-22 00:58:35 +0100678 cputime_adjust(&cputime, &p->signal->prev_cputime, ut, st);
Frederic Weisbecker73fbec62012-06-16 15:57:37 +0200679}
Frederic Weisbecker9fbc42e2013-02-25 17:25:39 +0100680#endif /* !CONFIG_VIRT_CPU_ACCOUNTING_NATIVE */
Frederic Weisbeckerabf917c2012-07-25 07:56:04 +0200681
682#ifdef CONFIG_VIRT_CPU_ACCOUNTING_GEN
Frederic Weisbeckerbac5b6b2017-06-29 19:15:10 +0200683static u64 vtime_delta(struct vtime *vtime)
Frederic Weisbeckerabf917c2012-07-25 07:56:04 +0200684{
Wanpeng Li2a42eb92017-06-29 19:15:11 +0200685 unsigned long long clock;
Frederic Weisbeckerabf917c2012-07-25 07:56:04 +0200686
Wanpeng Li0e4097c2017-07-09 00:40:28 -0700687 clock = sched_clock();
Wanpeng Li2a42eb92017-06-29 19:15:11 +0200688 if (clock < vtime->starttime)
Frederic Weisbecker6a616712012-12-16 20:00:34 +0100689 return 0;
690
Wanpeng Li2a42eb92017-06-29 19:15:11 +0200691 return clock - vtime->starttime;
Frederic Weisbecker6a616712012-12-16 20:00:34 +0100692}
693
Frederic Weisbeckerbac5b6b2017-06-29 19:15:10 +0200694static u64 get_vtime_delta(struct vtime *vtime)
Frederic Weisbecker6a616712012-12-16 20:00:34 +0100695{
Wanpeng Li2a42eb92017-06-29 19:15:11 +0200696 u64 delta = vtime_delta(vtime);
697 u64 other;
Frederic Weisbecker6a616712012-12-16 20:00:34 +0100698
Wanpeng Li03cbc732016-08-17 10:05:46 +0800699 /*
700 * Unlike tick based timing, vtime based timing never has lost
701 * ticks, and no need for steal time accounting to make up for
702 * lost ticks. Vtime accounts a rounded version of actual
703 * elapsed time. Limit account_other_time to prevent rounding
704 * errors from causing elapsed vtime to go negative.
705 */
Rik van Rielb58c3582016-07-13 16:50:02 +0200706 other = account_other_time(delta);
Frederic Weisbeckerbac5b6b2017-06-29 19:15:10 +0200707 WARN_ON_ONCE(vtime->state == VTIME_INACTIVE);
Wanpeng Li2a42eb92017-06-29 19:15:11 +0200708 vtime->starttime += delta;
Frederic Weisbeckerabf917c2012-07-25 07:56:04 +0200709
Rik van Rielb58c3582016-07-13 16:50:02 +0200710 return delta - other;
Frederic Weisbeckerabf917c2012-07-25 07:56:04 +0200711}
712
Wanpeng Li2a42eb92017-06-29 19:15:11 +0200713static void __vtime_account_system(struct task_struct *tsk,
714 struct vtime *vtime)
Frederic Weisbecker6a616712012-12-16 20:00:34 +0100715{
Wanpeng Li2a42eb92017-06-29 19:15:11 +0200716 vtime->stime += get_vtime_delta(vtime);
717 if (vtime->stime >= TICK_NSEC) {
718 account_system_time(tsk, irq_count(), vtime->stime);
719 vtime->stime = 0;
720 }
721}
722
723static void vtime_account_guest(struct task_struct *tsk,
724 struct vtime *vtime)
725{
726 vtime->gtime += get_vtime_delta(vtime);
727 if (vtime->gtime >= TICK_NSEC) {
728 account_guest_time(tsk, vtime->gtime);
729 vtime->gtime = 0;
730 }
Frederic Weisbecker6a616712012-12-16 20:00:34 +0100731}
732
Frederic Weisbeckerabf917c2012-07-25 07:56:04 +0200733void vtime_account_system(struct task_struct *tsk)
734{
Frederic Weisbeckerbac5b6b2017-06-29 19:15:10 +0200735 struct vtime *vtime = &tsk->vtime;
736
737 if (!vtime_delta(vtime))
Rik van Rielff9a9b42016-02-10 20:08:27 -0500738 return;
739
Frederic Weisbeckerbac5b6b2017-06-29 19:15:10 +0200740 write_seqcount_begin(&vtime->seqcount);
Wanpeng Li2a42eb92017-06-29 19:15:11 +0200741 /* We might have scheduled out from guest path */
742 if (current->flags & PF_VCPU)
743 vtime_account_guest(tsk, vtime);
744 else
745 __vtime_account_system(tsk, vtime);
Frederic Weisbeckerbac5b6b2017-06-29 19:15:10 +0200746 write_seqcount_end(&vtime->seqcount);
Frederic Weisbecker6a616712012-12-16 20:00:34 +0100747}
748
Frederic Weisbecker6a616712012-12-16 20:00:34 +0100749void vtime_user_enter(struct task_struct *tsk)
750{
Frederic Weisbeckerbac5b6b2017-06-29 19:15:10 +0200751 struct vtime *vtime = &tsk->vtime;
752
753 write_seqcount_begin(&vtime->seqcount);
Wanpeng Li2a42eb92017-06-29 19:15:11 +0200754 __vtime_account_system(tsk, vtime);
Frederic Weisbeckerbac5b6b2017-06-29 19:15:10 +0200755 vtime->state = VTIME_USER;
756 write_seqcount_end(&vtime->seqcount);
Frederic Weisbecker6a616712012-12-16 20:00:34 +0100757}
758
Frederic Weisbecker1c3eda02017-06-29 19:15:07 +0200759void vtime_user_exit(struct task_struct *tsk)
760{
Frederic Weisbeckerbac5b6b2017-06-29 19:15:10 +0200761 struct vtime *vtime = &tsk->vtime;
762
763 write_seqcount_begin(&vtime->seqcount);
Wanpeng Li2a42eb92017-06-29 19:15:11 +0200764 vtime->utime += get_vtime_delta(vtime);
765 if (vtime->utime >= TICK_NSEC) {
766 account_user_time(tsk, vtime->utime);
767 vtime->utime = 0;
768 }
Frederic Weisbeckerbac5b6b2017-06-29 19:15:10 +0200769 vtime->state = VTIME_SYS;
770 write_seqcount_end(&vtime->seqcount);
Frederic Weisbecker1c3eda02017-06-29 19:15:07 +0200771}
772
Frederic Weisbecker6a616712012-12-16 20:00:34 +0100773void vtime_guest_enter(struct task_struct *tsk)
774{
Frederic Weisbeckerbac5b6b2017-06-29 19:15:10 +0200775 struct vtime *vtime = &tsk->vtime;
Frederic Weisbecker5b206d42013-07-12 19:05:14 +0200776 /*
777 * The flags must be updated under the lock with
Frederic Weisbecker60a9ce52017-06-29 19:15:09 +0200778 * the vtime_starttime flush and update.
Frederic Weisbecker5b206d42013-07-12 19:05:14 +0200779 * That enforces a right ordering and update sequence
780 * synchronization against the reader (task_gtime())
781 * that can thus safely catch up with a tickless delta.
782 */
Frederic Weisbeckerbac5b6b2017-06-29 19:15:10 +0200783 write_seqcount_begin(&vtime->seqcount);
Wanpeng Li2a42eb92017-06-29 19:15:11 +0200784 __vtime_account_system(tsk, vtime);
Frederic Weisbecker6a616712012-12-16 20:00:34 +0100785 current->flags |= PF_VCPU;
Frederic Weisbeckerbac5b6b2017-06-29 19:15:10 +0200786 write_seqcount_end(&vtime->seqcount);
Frederic Weisbecker6a616712012-12-16 20:00:34 +0100787}
Frederic Weisbecker48d6a812013-07-10 02:44:35 +0200788EXPORT_SYMBOL_GPL(vtime_guest_enter);
Frederic Weisbecker6a616712012-12-16 20:00:34 +0100789
790void vtime_guest_exit(struct task_struct *tsk)
791{
Frederic Weisbeckerbac5b6b2017-06-29 19:15:10 +0200792 struct vtime *vtime = &tsk->vtime;
793
794 write_seqcount_begin(&vtime->seqcount);
Wanpeng Li2a42eb92017-06-29 19:15:11 +0200795 vtime_account_guest(tsk, vtime);
Frederic Weisbecker6a616712012-12-16 20:00:34 +0100796 current->flags &= ~PF_VCPU;
Frederic Weisbeckerbac5b6b2017-06-29 19:15:10 +0200797 write_seqcount_end(&vtime->seqcount);
Frederic Weisbeckerabf917c2012-07-25 07:56:04 +0200798}
Frederic Weisbecker48d6a812013-07-10 02:44:35 +0200799EXPORT_SYMBOL_GPL(vtime_guest_exit);
Frederic Weisbeckerabf917c2012-07-25 07:56:04 +0200800
801void vtime_account_idle(struct task_struct *tsk)
802{
Frederic Weisbeckerbac5b6b2017-06-29 19:15:10 +0200803 account_idle_time(get_vtime_delta(&tsk->vtime));
Frederic Weisbeckerabf917c2012-07-25 07:56:04 +0200804}
Frederic Weisbecker3f4724e2012-07-16 18:00:34 +0200805
Frederic Weisbecker6a616712012-12-16 20:00:34 +0100806void arch_vtime_task_switch(struct task_struct *prev)
807{
Frederic Weisbeckerbac5b6b2017-06-29 19:15:10 +0200808 struct vtime *vtime = &prev->vtime;
Frederic Weisbecker6a616712012-12-16 20:00:34 +0100809
Frederic Weisbeckerbac5b6b2017-06-29 19:15:10 +0200810 write_seqcount_begin(&vtime->seqcount);
811 vtime->state = VTIME_INACTIVE;
812 write_seqcount_end(&vtime->seqcount);
813
814 vtime = &current->vtime;
815
816 write_seqcount_begin(&vtime->seqcount);
817 vtime->state = VTIME_SYS;
Wanpeng Li0e4097c2017-07-09 00:40:28 -0700818 vtime->starttime = sched_clock();
Frederic Weisbeckerbac5b6b2017-06-29 19:15:10 +0200819 write_seqcount_end(&vtime->seqcount);
Frederic Weisbecker6a616712012-12-16 20:00:34 +0100820}
821
Frederic Weisbecker45eacc62013-05-15 22:16:32 +0200822void vtime_init_idle(struct task_struct *t, int cpu)
Frederic Weisbecker6a616712012-12-16 20:00:34 +0100823{
Frederic Weisbeckerbac5b6b2017-06-29 19:15:10 +0200824 struct vtime *vtime = &t->vtime;
Frederic Weisbecker6a616712012-12-16 20:00:34 +0100825 unsigned long flags;
826
Frederic Weisbeckerb7ce2272015-11-19 16:47:34 +0100827 local_irq_save(flags);
Frederic Weisbeckerbac5b6b2017-06-29 19:15:10 +0200828 write_seqcount_begin(&vtime->seqcount);
829 vtime->state = VTIME_SYS;
Wanpeng Li0e4097c2017-07-09 00:40:28 -0700830 vtime->starttime = sched_clock();
Frederic Weisbeckerbac5b6b2017-06-29 19:15:10 +0200831 write_seqcount_end(&vtime->seqcount);
Frederic Weisbeckerb7ce2272015-11-19 16:47:34 +0100832 local_irq_restore(flags);
Frederic Weisbecker6a616712012-12-16 20:00:34 +0100833}
834
Frederic Weisbecker16a6d9b2017-01-31 04:09:21 +0100835u64 task_gtime(struct task_struct *t)
Frederic Weisbecker6a616712012-12-16 20:00:34 +0100836{
Frederic Weisbeckerbac5b6b2017-06-29 19:15:10 +0200837 struct vtime *vtime = &t->vtime;
Frederic Weisbecker6a616712012-12-16 20:00:34 +0100838 unsigned int seq;
Frederic Weisbecker16a6d9b2017-01-31 04:09:21 +0100839 u64 gtime;
Frederic Weisbecker6a616712012-12-16 20:00:34 +0100840
Frederic Weisbeckere5925392015-11-19 16:47:33 +0100841 if (!vtime_accounting_enabled())
Hiroshi Shimamoto25411172015-11-19 16:47:28 +0100842 return t->gtime;
843
Frederic Weisbecker6a616712012-12-16 20:00:34 +0100844 do {
Frederic Weisbeckerbac5b6b2017-06-29 19:15:10 +0200845 seq = read_seqcount_begin(&vtime->seqcount);
Frederic Weisbecker6a616712012-12-16 20:00:34 +0100846
847 gtime = t->gtime;
Frederic Weisbeckerbac5b6b2017-06-29 19:15:10 +0200848 if (vtime->state == VTIME_SYS && t->flags & PF_VCPU)
Wanpeng Li2a42eb92017-06-29 19:15:11 +0200849 gtime += vtime->gtime + vtime_delta(vtime);
Frederic Weisbecker6a616712012-12-16 20:00:34 +0100850
Frederic Weisbeckerbac5b6b2017-06-29 19:15:10 +0200851 } while (read_seqcount_retry(&vtime->seqcount, seq));
Frederic Weisbecker6a616712012-12-16 20:00:34 +0100852
853 return gtime;
854}
855
856/*
857 * Fetch cputime raw values from fields of task_struct and
858 * add up the pending nohz execution time since the last
859 * cputime snapshot.
860 */
Frederic Weisbecker5613fda2017-01-31 04:09:23 +0100861void task_cputime(struct task_struct *t, u64 *utime, u64 *stime)
Frederic Weisbecker6a616712012-12-16 20:00:34 +0100862{
Frederic Weisbeckerbac5b6b2017-06-29 19:15:10 +0200863 struct vtime *vtime = &t->vtime;
Frederic Weisbecker6a616712012-12-16 20:00:34 +0100864 unsigned int seq;
Frederic Weisbeckerbac5b6b2017-06-29 19:15:10 +0200865 u64 delta;
Stanislaw Gruszka353c50e2016-11-15 03:06:52 +0100866
867 if (!vtime_accounting_enabled()) {
868 *utime = t->utime;
869 *stime = t->stime;
870 return;
871 }
Frederic Weisbecker6a616712012-12-16 20:00:34 +0100872
873 do {
Frederic Weisbeckerbac5b6b2017-06-29 19:15:10 +0200874 seq = read_seqcount_begin(&vtime->seqcount);
Frederic Weisbecker6a616712012-12-16 20:00:34 +0100875
Stanislaw Gruszka353c50e2016-11-15 03:06:52 +0100876 *utime = t->utime;
877 *stime = t->stime;
Frederic Weisbecker6a616712012-12-16 20:00:34 +0100878
879 /* Task is sleeping, nothing to add */
Frederic Weisbeckerbac5b6b2017-06-29 19:15:10 +0200880 if (vtime->state == VTIME_INACTIVE || is_idle_task(t))
Frederic Weisbecker6a616712012-12-16 20:00:34 +0100881 continue;
882
Frederic Weisbeckerbac5b6b2017-06-29 19:15:10 +0200883 delta = vtime_delta(vtime);
Frederic Weisbecker6a616712012-12-16 20:00:34 +0100884
885 /*
886 * Task runs either in user or kernel space, add pending nohz time to
887 * the right place.
888 */
Frederic Weisbeckerbac5b6b2017-06-29 19:15:10 +0200889 if (vtime->state == VTIME_USER || t->flags & PF_VCPU)
Wanpeng Li2a42eb92017-06-29 19:15:11 +0200890 *utime += vtime->utime + delta;
Frederic Weisbeckerbac5b6b2017-06-29 19:15:10 +0200891 else if (vtime->state == VTIME_SYS)
Wanpeng Li2a42eb92017-06-29 19:15:11 +0200892 *stime += vtime->stime + delta;
Frederic Weisbeckerbac5b6b2017-06-29 19:15:10 +0200893 } while (read_seqcount_retry(&vtime->seqcount, seq));
Frederic Weisbecker6a616712012-12-16 20:00:34 +0100894}
Frederic Weisbeckerabf917c2012-07-25 07:56:04 +0200895#endif /* CONFIG_VIRT_CPU_ACCOUNTING_GEN */