[S390] cputime: add sparse checking and cleanup
Make cputime_t and cputime64_t nocast to enable sparse checking to detect incorrect use of cputime. Drop the cputime macros for simple scalar operations. The conversion macros are still needed. Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:
+2
-2
@@ -613,8 +613,8 @@ void acct_collect(long exitcode, int group_dead)
|
||||
pacct->ac_flag |= ACORE;
|
||||
if (current->flags & PF_SIGNALED)
|
||||
pacct->ac_flag |= AXSIG;
|
||||
pacct->ac_utime = cputime_add(pacct->ac_utime, current->utime);
|
||||
pacct->ac_stime = cputime_add(pacct->ac_stime, current->stime);
|
||||
pacct->ac_utime += current->utime;
|
||||
pacct->ac_stime += current->stime;
|
||||
pacct->ac_minflt += current->min_flt;
|
||||
pacct->ac_majflt += current->maj_flt;
|
||||
spin_unlock_irq(¤t->sighand->siglock);
|
||||
|
||||
+1
-2
@@ -178,8 +178,7 @@ static inline void check_for_tasks(int cpu)
|
||||
write_lock_irq(&tasklist_lock);
|
||||
for_each_process(p) {
|
||||
if (task_cpu(p) == cpu && p->state == TASK_RUNNING &&
|
||||
(!cputime_eq(p->utime, cputime_zero) ||
|
||||
!cputime_eq(p->stime, cputime_zero)))
|
||||
(p->utime || p->stime))
|
||||
printk(KERN_WARNING "Task %s (pid = %d) is on cpu %d "
|
||||
"(state = %ld, flags = %x)\n",
|
||||
p->comm, task_pid_nr(p), cpu,
|
||||
|
||||
+6
-16
@@ -121,9 +121,9 @@ static void __exit_signal(struct task_struct *tsk)
|
||||
* We won't ever get here for the group leader, since it
|
||||
* will have been the last reference on the signal_struct.
|
||||
*/
|
||||
sig->utime = cputime_add(sig->utime, tsk->utime);
|
||||
sig->stime = cputime_add(sig->stime, tsk->stime);
|
||||
sig->gtime = cputime_add(sig->gtime, tsk->gtime);
|
||||
sig->utime += tsk->utime;
|
||||
sig->stime += tsk->stime;
|
||||
sig->gtime += tsk->gtime;
|
||||
sig->min_flt += tsk->min_flt;
|
||||
sig->maj_flt += tsk->maj_flt;
|
||||
sig->nvcsw += tsk->nvcsw;
|
||||
@@ -1255,19 +1255,9 @@ static int wait_task_zombie(struct wait_opts *wo, struct task_struct *p)
|
||||
spin_lock_irq(&p->real_parent->sighand->siglock);
|
||||
psig = p->real_parent->signal;
|
||||
sig = p->signal;
|
||||
psig->cutime =
|
||||
cputime_add(psig->cutime,
|
||||
cputime_add(tgutime,
|
||||
sig->cutime));
|
||||
psig->cstime =
|
||||
cputime_add(psig->cstime,
|
||||
cputime_add(tgstime,
|
||||
sig->cstime));
|
||||
psig->cgtime =
|
||||
cputime_add(psig->cgtime,
|
||||
cputime_add(p->gtime,
|
||||
cputime_add(sig->gtime,
|
||||
sig->cgtime)));
|
||||
psig->cutime += tgutime + sig->cutime;
|
||||
psig->cstime += tgstime + sig->cstime;
|
||||
psig->cgtime += p->gtime + sig->gtime + sig->cgtime;
|
||||
psig->cmin_flt +=
|
||||
p->min_flt + sig->min_flt + sig->cmin_flt;
|
||||
psig->cmaj_flt +=
|
||||
|
||||
+5
-9
@@ -1023,8 +1023,8 @@ void mm_init_owner(struct mm_struct *mm, struct task_struct *p)
|
||||
*/
|
||||
static void posix_cpu_timers_init(struct task_struct *tsk)
|
||||
{
|
||||
tsk->cputime_expires.prof_exp = cputime_zero;
|
||||
tsk->cputime_expires.virt_exp = cputime_zero;
|
||||
tsk->cputime_expires.prof_exp = 0;
|
||||
tsk->cputime_expires.virt_exp = 0;
|
||||
tsk->cputime_expires.sched_exp = 0;
|
||||
INIT_LIST_HEAD(&tsk->cpu_timers[0]);
|
||||
INIT_LIST_HEAD(&tsk->cpu_timers[1]);
|
||||
@@ -1132,14 +1132,10 @@ static struct task_struct *copy_process(unsigned long clone_flags,
|
||||
|
||||
init_sigpending(&p->pending);
|
||||
|
||||
p->utime = cputime_zero;
|
||||
p->stime = cputime_zero;
|
||||
p->gtime = cputime_zero;
|
||||
p->utimescaled = cputime_zero;
|
||||
p->stimescaled = cputime_zero;
|
||||
p->utime = p->stime = p->gtime = 0;
|
||||
p->utimescaled = p->stimescaled = 0;
|
||||
#ifndef CONFIG_VIRT_CPU_ACCOUNTING
|
||||
p->prev_utime = cputime_zero;
|
||||
p->prev_stime = cputime_zero;
|
||||
p->prev_utime = p->prev_stime = 0;
|
||||
#endif
|
||||
#if defined(SPLIT_RSS_COUNTING)
|
||||
memset(&p->rss_stat, 0, sizeof(p->rss_stat));
|
||||
|
||||
+7
-8
@@ -52,22 +52,22 @@ static void get_cpu_itimer(struct task_struct *tsk, unsigned int clock_id,
|
||||
|
||||
cval = it->expires;
|
||||
cinterval = it->incr;
|
||||
if (!cputime_eq(cval, cputime_zero)) {
|
||||
if (cval) {
|
||||
struct task_cputime cputime;
|
||||
cputime_t t;
|
||||
|
||||
thread_group_cputimer(tsk, &cputime);
|
||||
if (clock_id == CPUCLOCK_PROF)
|
||||
t = cputime_add(cputime.utime, cputime.stime);
|
||||
t = cputime.utime + cputime.stime;
|
||||
else
|
||||
/* CPUCLOCK_VIRT */
|
||||
t = cputime.utime;
|
||||
|
||||
if (cputime_le(cval, t))
|
||||
if (cval < t)
|
||||
/* about to fire */
|
||||
cval = cputime_one_jiffy;
|
||||
else
|
||||
cval = cputime_sub(cval, t);
|
||||
cval = cval - t;
|
||||
}
|
||||
|
||||
spin_unlock_irq(&tsk->sighand->siglock);
|
||||
@@ -161,10 +161,9 @@ static void set_cpu_itimer(struct task_struct *tsk, unsigned int clock_id,
|
||||
|
||||
cval = it->expires;
|
||||
cinterval = it->incr;
|
||||
if (!cputime_eq(cval, cputime_zero) ||
|
||||
!cputime_eq(nval, cputime_zero)) {
|
||||
if (cputime_gt(nval, cputime_zero))
|
||||
nval = cputime_add(nval, cputime_one_jiffy);
|
||||
if (cval || nval) {
|
||||
if (nval > 0)
|
||||
nval += cputime_one_jiffy;
|
||||
set_process_cpu_timer(tsk, clock_id, &nval, &cval);
|
||||
}
|
||||
it->expires = nval;
|
||||
|
||||
+52
-80
@@ -78,7 +78,7 @@ static inline int cpu_time_before(const clockid_t which_clock,
|
||||
if (CPUCLOCK_WHICH(which_clock) == CPUCLOCK_SCHED) {
|
||||
return now.sched < then.sched;
|
||||
} else {
|
||||
return cputime_lt(now.cpu, then.cpu);
|
||||
return now.cpu < then.cpu;
|
||||
}
|
||||
}
|
||||
static inline void cpu_time_add(const clockid_t which_clock,
|
||||
@@ -88,7 +88,7 @@ static inline void cpu_time_add(const clockid_t which_clock,
|
||||
if (CPUCLOCK_WHICH(which_clock) == CPUCLOCK_SCHED) {
|
||||
acc->sched += val.sched;
|
||||
} else {
|
||||
acc->cpu = cputime_add(acc->cpu, val.cpu);
|
||||
acc->cpu += val.cpu;
|
||||
}
|
||||
}
|
||||
static inline union cpu_time_count cpu_time_sub(const clockid_t which_clock,
|
||||
@@ -98,24 +98,11 @@ static inline union cpu_time_count cpu_time_sub(const clockid_t which_clock,
|
||||
if (CPUCLOCK_WHICH(which_clock) == CPUCLOCK_SCHED) {
|
||||
a.sched -= b.sched;
|
||||
} else {
|
||||
a.cpu = cputime_sub(a.cpu, b.cpu);
|
||||
a.cpu -= b.cpu;
|
||||
}
|
||||
return a;
|
||||
}
|
||||
|
||||
/*
|
||||
* Divide and limit the result to res >= 1
|
||||
*
|
||||
* This is necessary to prevent signal delivery starvation, when the result of
|
||||
* the division would be rounded down to 0.
|
||||
*/
|
||||
static inline cputime_t cputime_div_non_zero(cputime_t time, unsigned long div)
|
||||
{
|
||||
cputime_t res = cputime_div(time, div);
|
||||
|
||||
return max_t(cputime_t, res, 1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Update expiry time from increment, and increase overrun count,
|
||||
* given the current clock sample.
|
||||
@@ -148,28 +135,26 @@ static void bump_cpu_timer(struct k_itimer *timer,
|
||||
} else {
|
||||
cputime_t delta, incr;
|
||||
|
||||
if (cputime_lt(now.cpu, timer->it.cpu.expires.cpu))
|
||||
if (now.cpu < timer->it.cpu.expires.cpu)
|
||||
return;
|
||||
incr = timer->it.cpu.incr.cpu;
|
||||
delta = cputime_sub(cputime_add(now.cpu, incr),
|
||||
timer->it.cpu.expires.cpu);
|
||||
delta = now.cpu + incr - timer->it.cpu.expires.cpu;
|
||||
/* Don't use (incr*2 < delta), incr*2 might overflow. */
|
||||
for (i = 0; cputime_lt(incr, cputime_sub(delta, incr)); i++)
|
||||
incr = cputime_add(incr, incr);
|
||||
for (; i >= 0; incr = cputime_halve(incr), i--) {
|
||||
if (cputime_lt(delta, incr))
|
||||
for (i = 0; incr < delta - incr; i++)
|
||||
incr += incr;
|
||||
for (; i >= 0; incr = incr >> 1, i--) {
|
||||
if (delta < incr)
|
||||
continue;
|
||||
timer->it.cpu.expires.cpu =
|
||||
cputime_add(timer->it.cpu.expires.cpu, incr);
|
||||
timer->it.cpu.expires.cpu += incr;
|
||||
timer->it_overrun += 1 << i;
|
||||
delta = cputime_sub(delta, incr);
|
||||
delta -= incr;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static inline cputime_t prof_ticks(struct task_struct *p)
|
||||
{
|
||||
return cputime_add(p->utime, p->stime);
|
||||
return p->utime + p->stime;
|
||||
}
|
||||
static inline cputime_t virt_ticks(struct task_struct *p)
|
||||
{
|
||||
@@ -248,8 +233,8 @@ void thread_group_cputime(struct task_struct *tsk, struct task_cputime *times)
|
||||
|
||||
t = tsk;
|
||||
do {
|
||||
times->utime = cputime_add(times->utime, t->utime);
|
||||
times->stime = cputime_add(times->stime, t->stime);
|
||||
times->utime += t->utime;
|
||||
times->stime += t->stime;
|
||||
times->sum_exec_runtime += task_sched_runtime(t);
|
||||
} while_each_thread(tsk, t);
|
||||
out:
|
||||
@@ -258,10 +243,10 @@ out:
|
||||
|
||||
static void update_gt_cputime(struct task_cputime *a, struct task_cputime *b)
|
||||
{
|
||||
if (cputime_gt(b->utime, a->utime))
|
||||
if (b->utime > a->utime)
|
||||
a->utime = b->utime;
|
||||
|
||||
if (cputime_gt(b->stime, a->stime))
|
||||
if (b->stime > a->stime)
|
||||
a->stime = b->stime;
|
||||
|
||||
if (b->sum_exec_runtime > a->sum_exec_runtime)
|
||||
@@ -306,7 +291,7 @@ static int cpu_clock_sample_group(const clockid_t which_clock,
|
||||
return -EINVAL;
|
||||
case CPUCLOCK_PROF:
|
||||
thread_group_cputime(p, &cputime);
|
||||
cpu->cpu = cputime_add(cputime.utime, cputime.stime);
|
||||
cpu->cpu = cputime.utime + cputime.stime;
|
||||
break;
|
||||
case CPUCLOCK_VIRT:
|
||||
thread_group_cputime(p, &cputime);
|
||||
@@ -470,26 +455,24 @@ static void cleanup_timers(struct list_head *head,
|
||||
unsigned long long sum_exec_runtime)
|
||||
{
|
||||
struct cpu_timer_list *timer, *next;
|
||||
cputime_t ptime = cputime_add(utime, stime);
|
||||
cputime_t ptime = utime + stime;
|
||||
|
||||
list_for_each_entry_safe(timer, next, head, entry) {
|
||||
list_del_init(&timer->entry);
|
||||
if (cputime_lt(timer->expires.cpu, ptime)) {
|
||||
timer->expires.cpu = cputime_zero;
|
||||
if (timer->expires.cpu < ptime) {
|
||||
timer->expires.cpu = 0;
|
||||
} else {
|
||||
timer->expires.cpu = cputime_sub(timer->expires.cpu,
|
||||
ptime);
|
||||
timer->expires.cpu -= ptime;
|
||||
}
|
||||
}
|
||||
|
||||
++head;
|
||||
list_for_each_entry_safe(timer, next, head, entry) {
|
||||
list_del_init(&timer->entry);
|
||||
if (cputime_lt(timer->expires.cpu, utime)) {
|
||||
timer->expires.cpu = cputime_zero;
|
||||
if (timer->expires.cpu < utime) {
|
||||
timer->expires.cpu = 0;
|
||||
} else {
|
||||
timer->expires.cpu = cputime_sub(timer->expires.cpu,
|
||||
utime);
|
||||
timer->expires.cpu -= utime;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -520,8 +503,7 @@ void posix_cpu_timers_exit_group(struct task_struct *tsk)
|
||||
struct signal_struct *const sig = tsk->signal;
|
||||
|
||||
cleanup_timers(tsk->signal->cpu_timers,
|
||||
cputime_add(tsk->utime, sig->utime),
|
||||
cputime_add(tsk->stime, sig->stime),
|
||||
tsk->utime + sig->utime, tsk->stime + sig->stime,
|
||||
tsk->se.sum_exec_runtime + sig->sum_sched_runtime);
|
||||
}
|
||||
|
||||
@@ -540,8 +522,7 @@ static void clear_dead_task(struct k_itimer *timer, union cpu_time_count now)
|
||||
|
||||
static inline int expires_gt(cputime_t expires, cputime_t new_exp)
|
||||
{
|
||||
return cputime_eq(expires, cputime_zero) ||
|
||||
cputime_gt(expires, new_exp);
|
||||
return expires == 0 || expires > new_exp;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -651,7 +632,7 @@ static int cpu_timer_sample_group(const clockid_t which_clock,
|
||||
default:
|
||||
return -EINVAL;
|
||||
case CPUCLOCK_PROF:
|
||||
cpu->cpu = cputime_add(cputime.utime, cputime.stime);
|
||||
cpu->cpu = cputime.utime + cputime.stime;
|
||||
break;
|
||||
case CPUCLOCK_VIRT:
|
||||
cpu->cpu = cputime.utime;
|
||||
@@ -918,12 +899,12 @@ static void check_thread_timers(struct task_struct *tsk,
|
||||
unsigned long soft;
|
||||
|
||||
maxfire = 20;
|
||||
tsk->cputime_expires.prof_exp = cputime_zero;
|
||||
tsk->cputime_expires.prof_exp = 0;
|
||||
while (!list_empty(timers)) {
|
||||
struct cpu_timer_list *t = list_first_entry(timers,
|
||||
struct cpu_timer_list,
|
||||
entry);
|
||||
if (!--maxfire || cputime_lt(prof_ticks(tsk), t->expires.cpu)) {
|
||||
if (!--maxfire || prof_ticks(tsk) < t->expires.cpu) {
|
||||
tsk->cputime_expires.prof_exp = t->expires.cpu;
|
||||
break;
|
||||
}
|
||||
@@ -933,12 +914,12 @@ static void check_thread_timers(struct task_struct *tsk,
|
||||
|
||||
++timers;
|
||||
maxfire = 20;
|
||||
tsk->cputime_expires.virt_exp = cputime_zero;
|
||||
tsk->cputime_expires.virt_exp = 0;
|
||||
while (!list_empty(timers)) {
|
||||
struct cpu_timer_list *t = list_first_entry(timers,
|
||||
struct cpu_timer_list,
|
||||
entry);
|
||||
if (!--maxfire || cputime_lt(virt_ticks(tsk), t->expires.cpu)) {
|
||||
if (!--maxfire || virt_ticks(tsk) < t->expires.cpu) {
|
||||
tsk->cputime_expires.virt_exp = t->expires.cpu;
|
||||
break;
|
||||
}
|
||||
@@ -1009,20 +990,19 @@ static u32 onecputick;
|
||||
static void check_cpu_itimer(struct task_struct *tsk, struct cpu_itimer *it,
|
||||
cputime_t *expires, cputime_t cur_time, int signo)
|
||||
{
|
||||
if (cputime_eq(it->expires, cputime_zero))
|
||||
if (!it->expires)
|
||||
return;
|
||||
|
||||
if (cputime_ge(cur_time, it->expires)) {
|
||||
if (!cputime_eq(it->incr, cputime_zero)) {
|
||||
it->expires = cputime_add(it->expires, it->incr);
|
||||
if (cur_time >= it->expires) {
|
||||
if (it->incr) {
|
||||
it->expires += it->incr;
|
||||
it->error += it->incr_error;
|
||||
if (it->error >= onecputick) {
|
||||
it->expires = cputime_sub(it->expires,
|
||||
cputime_one_jiffy);
|
||||
it->expires -= cputime_one_jiffy;
|
||||
it->error -= onecputick;
|
||||
}
|
||||
} else {
|
||||
it->expires = cputime_zero;
|
||||
it->expires = 0;
|
||||
}
|
||||
|
||||
trace_itimer_expire(signo == SIGPROF ?
|
||||
@@ -1031,9 +1011,7 @@ static void check_cpu_itimer(struct task_struct *tsk, struct cpu_itimer *it,
|
||||
__group_send_sig_info(signo, SEND_SIG_PRIV, tsk);
|
||||
}
|
||||
|
||||
if (!cputime_eq(it->expires, cputime_zero) &&
|
||||
(cputime_eq(*expires, cputime_zero) ||
|
||||
cputime_lt(it->expires, *expires))) {
|
||||
if (it->expires && (!*expires || it->expires < *expires)) {
|
||||
*expires = it->expires;
|
||||
}
|
||||
}
|
||||
@@ -1048,9 +1026,7 @@ static void check_cpu_itimer(struct task_struct *tsk, struct cpu_itimer *it,
|
||||
*/
|
||||
static inline int task_cputime_zero(const struct task_cputime *cputime)
|
||||
{
|
||||
if (cputime_eq(cputime->utime, cputime_zero) &&
|
||||
cputime_eq(cputime->stime, cputime_zero) &&
|
||||
cputime->sum_exec_runtime == 0)
|
||||
if (!cputime->utime && !cputime->stime && !cputime->sum_exec_runtime)
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
@@ -1076,15 +1052,15 @@ static void check_process_timers(struct task_struct *tsk,
|
||||
*/
|
||||
thread_group_cputimer(tsk, &cputime);
|
||||
utime = cputime.utime;
|
||||
ptime = cputime_add(utime, cputime.stime);
|
||||
ptime = utime + cputime.stime;
|
||||
sum_sched_runtime = cputime.sum_exec_runtime;
|
||||
maxfire = 20;
|
||||
prof_expires = cputime_zero;
|
||||
prof_expires = 0;
|
||||
while (!list_empty(timers)) {
|
||||
struct cpu_timer_list *tl = list_first_entry(timers,
|
||||
struct cpu_timer_list,
|
||||
entry);
|
||||
if (!--maxfire || cputime_lt(ptime, tl->expires.cpu)) {
|
||||
if (!--maxfire || ptime < tl->expires.cpu) {
|
||||
prof_expires = tl->expires.cpu;
|
||||
break;
|
||||
}
|
||||
@@ -1094,12 +1070,12 @@ static void check_process_timers(struct task_struct *tsk,
|
||||
|
||||
++timers;
|
||||
maxfire = 20;
|
||||
virt_expires = cputime_zero;
|
||||
virt_expires = 0;
|
||||
while (!list_empty(timers)) {
|
||||
struct cpu_timer_list *tl = list_first_entry(timers,
|
||||
struct cpu_timer_list,
|
||||
entry);
|
||||
if (!--maxfire || cputime_lt(utime, tl->expires.cpu)) {
|
||||
if (!--maxfire || utime < tl->expires.cpu) {
|
||||
virt_expires = tl->expires.cpu;
|
||||
break;
|
||||
}
|
||||
@@ -1154,8 +1130,7 @@ static void check_process_timers(struct task_struct *tsk,
|
||||
}
|
||||
}
|
||||
x = secs_to_cputime(soft);
|
||||
if (cputime_eq(prof_expires, cputime_zero) ||
|
||||
cputime_lt(x, prof_expires)) {
|
||||
if (!prof_expires || x < prof_expires) {
|
||||
prof_expires = x;
|
||||
}
|
||||
}
|
||||
@@ -1249,12 +1224,9 @@ out:
|
||||
static inline int task_cputime_expired(const struct task_cputime *sample,
|
||||
const struct task_cputime *expires)
|
||||
{
|
||||
if (!cputime_eq(expires->utime, cputime_zero) &&
|
||||
cputime_ge(sample->utime, expires->utime))
|
||||
if (expires->utime && sample->utime >= expires->utime)
|
||||
return 1;
|
||||
if (!cputime_eq(expires->stime, cputime_zero) &&
|
||||
cputime_ge(cputime_add(sample->utime, sample->stime),
|
||||
expires->stime))
|
||||
if (expires->stime && sample->utime + sample->stime >= expires->stime)
|
||||
return 1;
|
||||
if (expires->sum_exec_runtime != 0 &&
|
||||
sample->sum_exec_runtime >= expires->sum_exec_runtime)
|
||||
@@ -1389,18 +1361,18 @@ void set_process_cpu_timer(struct task_struct *tsk, unsigned int clock_idx,
|
||||
* it to be relative, *newval argument is relative and we update
|
||||
* it to be absolute.
|
||||
*/
|
||||
if (!cputime_eq(*oldval, cputime_zero)) {
|
||||
if (cputime_le(*oldval, now.cpu)) {
|
||||
if (*oldval) {
|
||||
if (*oldval <= now.cpu) {
|
||||
/* Just about to fire. */
|
||||
*oldval = cputime_one_jiffy;
|
||||
} else {
|
||||
*oldval = cputime_sub(*oldval, now.cpu);
|
||||
*oldval -= now.cpu;
|
||||
}
|
||||
}
|
||||
|
||||
if (cputime_eq(*newval, cputime_zero))
|
||||
if (!*newval)
|
||||
return;
|
||||
*newval = cputime_add(*newval, now.cpu);
|
||||
*newval += now.cpu;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
+35
-45
@@ -2166,7 +2166,7 @@ static int irqtime_account_hi_update(void)
|
||||
|
||||
local_irq_save(flags);
|
||||
latest_ns = this_cpu_read(cpu_hardirq_time);
|
||||
if (cputime64_gt(nsecs_to_cputime64(latest_ns), cpustat->irq))
|
||||
if (nsecs_to_cputime64(latest_ns) > cpustat->irq)
|
||||
ret = 1;
|
||||
local_irq_restore(flags);
|
||||
return ret;
|
||||
@@ -2181,7 +2181,7 @@ static int irqtime_account_si_update(void)
|
||||
|
||||
local_irq_save(flags);
|
||||
latest_ns = this_cpu_read(cpu_softirq_time);
|
||||
if (cputime64_gt(nsecs_to_cputime64(latest_ns), cpustat->softirq))
|
||||
if (nsecs_to_cputime64(latest_ns) > cpustat->softirq)
|
||||
ret = 1;
|
||||
local_irq_restore(flags);
|
||||
return ret;
|
||||
@@ -3868,19 +3868,17 @@ void account_user_time(struct task_struct *p, cputime_t cputime,
|
||||
cputime_t cputime_scaled)
|
||||
{
|
||||
struct cpu_usage_stat *cpustat = &kstat_this_cpu.cpustat;
|
||||
cputime64_t tmp;
|
||||
|
||||
/* Add user time to process. */
|
||||
p->utime = cputime_add(p->utime, cputime);
|
||||
p->utimescaled = cputime_add(p->utimescaled, cputime_scaled);
|
||||
p->utime += cputime;
|
||||
p->utimescaled += cputime_scaled;
|
||||
account_group_user_time(p, cputime);
|
||||
|
||||
/* Add user time to cpustat. */
|
||||
tmp = cputime_to_cputime64(cputime);
|
||||
if (TASK_NICE(p) > 0)
|
||||
cpustat->nice = cputime64_add(cpustat->nice, tmp);
|
||||
cpustat->nice += (__force cputime64_t) cputime;
|
||||
else
|
||||
cpustat->user = cputime64_add(cpustat->user, tmp);
|
||||
cpustat->user += (__force cputime64_t) cputime;
|
||||
|
||||
cpuacct_update_stats(p, CPUACCT_STAT_USER, cputime);
|
||||
/* Account for user time used */
|
||||
@@ -3896,24 +3894,21 @@ void account_user_time(struct task_struct *p, cputime_t cputime,
|
||||
static void account_guest_time(struct task_struct *p, cputime_t cputime,
|
||||
cputime_t cputime_scaled)
|
||||
{
|
||||
cputime64_t tmp;
|
||||
struct cpu_usage_stat *cpustat = &kstat_this_cpu.cpustat;
|
||||
|
||||
tmp = cputime_to_cputime64(cputime);
|
||||
|
||||
/* Add guest time to process. */
|
||||
p->utime = cputime_add(p->utime, cputime);
|
||||
p->utimescaled = cputime_add(p->utimescaled, cputime_scaled);
|
||||
p->utime += cputime;
|
||||
p->utimescaled += cputime_scaled;
|
||||
account_group_user_time(p, cputime);
|
||||
p->gtime = cputime_add(p->gtime, cputime);
|
||||
p->gtime += cputime;
|
||||
|
||||
/* Add guest time to cpustat. */
|
||||
if (TASK_NICE(p) > 0) {
|
||||
cpustat->nice = cputime64_add(cpustat->nice, tmp);
|
||||
cpustat->guest_nice = cputime64_add(cpustat->guest_nice, tmp);
|
||||
cpustat->nice += (__force cputime64_t) cputime;
|
||||
cpustat->guest_nice += (__force cputime64_t) cputime;
|
||||
} else {
|
||||
cpustat->user = cputime64_add(cpustat->user, tmp);
|
||||
cpustat->guest = cputime64_add(cpustat->guest, tmp);
|
||||
cpustat->user += (__force cputime64_t) cputime;
|
||||
cpustat->guest += (__force cputime64_t) cputime;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3928,15 +3923,13 @@ static inline
|
||||
void __account_system_time(struct task_struct *p, cputime_t cputime,
|
||||
cputime_t cputime_scaled, cputime64_t *target_cputime64)
|
||||
{
|
||||
cputime64_t tmp = cputime_to_cputime64(cputime);
|
||||
|
||||
/* Add system time to process. */
|
||||
p->stime = cputime_add(p->stime, cputime);
|
||||
p->stimescaled = cputime_add(p->stimescaled, cputime_scaled);
|
||||
p->stime += cputime;
|
||||
p->stimescaled += cputime_scaled;
|
||||
account_group_system_time(p, cputime);
|
||||
|
||||
/* Add system time to cpustat. */
|
||||
*target_cputime64 = cputime64_add(*target_cputime64, tmp);
|
||||
*target_cputime64 += (__force cputime64_t) cputime;
|
||||
cpuacct_update_stats(p, CPUACCT_STAT_SYSTEM, cputime);
|
||||
|
||||
/* Account for system time used */
|
||||
@@ -3978,9 +3971,8 @@ void account_system_time(struct task_struct *p, int hardirq_offset,
|
||||
void account_steal_time(cputime_t cputime)
|
||||
{
|
||||
struct cpu_usage_stat *cpustat = &kstat_this_cpu.cpustat;
|
||||
cputime64_t cputime64 = cputime_to_cputime64(cputime);
|
||||
|
||||
cpustat->steal = cputime64_add(cpustat->steal, cputime64);
|
||||
cpustat->steal += (__force cputime64_t) cputime;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -3990,13 +3982,12 @@ void account_steal_time(cputime_t cputime)
|
||||
void account_idle_time(cputime_t cputime)
|
||||
{
|
||||
struct cpu_usage_stat *cpustat = &kstat_this_cpu.cpustat;
|
||||
cputime64_t cputime64 = cputime_to_cputime64(cputime);
|
||||
struct rq *rq = this_rq();
|
||||
|
||||
if (atomic_read(&rq->nr_iowait) > 0)
|
||||
cpustat->iowait = cputime64_add(cpustat->iowait, cputime64);
|
||||
cpustat->iowait += (__force cputime64_t) cputime;
|
||||
else
|
||||
cpustat->idle = cputime64_add(cpustat->idle, cputime64);
|
||||
cpustat->idle += (__force cputime64_t) cputime;
|
||||
}
|
||||
|
||||
static __always_inline bool steal_account_process_tick(void)
|
||||
@@ -4046,16 +4037,15 @@ static void irqtime_account_process_tick(struct task_struct *p, int user_tick,
|
||||
struct rq *rq)
|
||||
{
|
||||
cputime_t one_jiffy_scaled = cputime_to_scaled(cputime_one_jiffy);
|
||||
cputime64_t tmp = cputime_to_cputime64(cputime_one_jiffy);
|
||||
struct cpu_usage_stat *cpustat = &kstat_this_cpu.cpustat;
|
||||
|
||||
if (steal_account_process_tick())
|
||||
return;
|
||||
|
||||
if (irqtime_account_hi_update()) {
|
||||
cpustat->irq = cputime64_add(cpustat->irq, tmp);
|
||||
cpustat->irq += (__force cputime64_t) cputime_one_jiffy;
|
||||
} else if (irqtime_account_si_update()) {
|
||||
cpustat->softirq = cputime64_add(cpustat->softirq, tmp);
|
||||
cpustat->softirq += (__force cputime64_t) cputime_one_jiffy;
|
||||
} else if (this_cpu_ksoftirqd() == p) {
|
||||
/*
|
||||
* ksoftirqd time do not get accounted in cpu_softirq_time.
|
||||
@@ -4171,7 +4161,7 @@ void thread_group_times(struct task_struct *p, cputime_t *ut, cputime_t *st)
|
||||
|
||||
void task_times(struct task_struct *p, cputime_t *ut, cputime_t *st)
|
||||
{
|
||||
cputime_t rtime, utime = p->utime, total = cputime_add(utime, p->stime);
|
||||
cputime_t rtime, utime = p->utime, total = utime + p->stime;
|
||||
|
||||
/*
|
||||
* Use CFS's precise accounting:
|
||||
@@ -4179,11 +4169,11 @@ void task_times(struct task_struct *p, cputime_t *ut, cputime_t *st)
|
||||
rtime = nsecs_to_cputime(p->se.sum_exec_runtime);
|
||||
|
||||
if (total) {
|
||||
u64 temp = rtime;
|
||||
u64 temp = (__force u64) rtime;
|
||||
|
||||
temp *= utime;
|
||||
do_div(temp, total);
|
||||
utime = (cputime_t)temp;
|
||||
temp *= (__force u64) utime;
|
||||
do_div(temp, (__force u32) total);
|
||||
utime = (__force cputime_t) temp;
|
||||
} else
|
||||
utime = rtime;
|
||||
|
||||
@@ -4191,7 +4181,7 @@ void task_times(struct task_struct *p, cputime_t *ut, cputime_t *st)
|
||||
* Compare with previous values, to keep monotonicity:
|
||||
*/
|
||||
p->prev_utime = max(p->prev_utime, utime);
|
||||
p->prev_stime = max(p->prev_stime, cputime_sub(rtime, p->prev_utime));
|
||||
p->prev_stime = max(p->prev_stime, rtime - p->prev_utime);
|
||||
|
||||
*ut = p->prev_utime;
|
||||
*st = p->prev_stime;
|
||||
@@ -4208,21 +4198,20 @@ void thread_group_times(struct task_struct *p, cputime_t *ut, cputime_t *st)
|
||||
|
||||
thread_group_cputime(p, &cputime);
|
||||
|
||||
total = cputime_add(cputime.utime, cputime.stime);
|
||||
total = cputime.utime + cputime.stime;
|
||||
rtime = nsecs_to_cputime(cputime.sum_exec_runtime);
|
||||
|
||||
if (total) {
|
||||
u64 temp = rtime;
|
||||
u64 temp = (__force u64) rtime;
|
||||
|
||||
temp *= cputime.utime;
|
||||
do_div(temp, total);
|
||||
utime = (cputime_t)temp;
|
||||
temp *= (__force u64) cputime.utime;
|
||||
do_div(temp, (__force u32) total);
|
||||
utime = (__force cputime_t) temp;
|
||||
} else
|
||||
utime = rtime;
|
||||
|
||||
sig->prev_utime = max(sig->prev_utime, utime);
|
||||
sig->prev_stime = max(sig->prev_stime,
|
||||
cputime_sub(rtime, sig->prev_utime));
|
||||
sig->prev_stime = max(sig->prev_stime, rtime - sig->prev_utime);
|
||||
|
||||
*ut = sig->prev_utime;
|
||||
*st = sig->prev_stime;
|
||||
@@ -9769,7 +9758,8 @@ static void cpuacct_update_stats(struct task_struct *tsk,
|
||||
ca = task_ca(tsk);
|
||||
|
||||
do {
|
||||
__percpu_counter_add(&ca->cpustat[idx], val, batch);
|
||||
__percpu_counter_add(&ca->cpustat[idx],
|
||||
(__force s64) val, batch);
|
||||
ca = ca->parent;
|
||||
} while (ca);
|
||||
rcu_read_unlock();
|
||||
|
||||
@@ -283,8 +283,7 @@ static inline void account_group_user_time(struct task_struct *tsk,
|
||||
return;
|
||||
|
||||
raw_spin_lock(&cputimer->lock);
|
||||
cputimer->cputime.utime =
|
||||
cputime_add(cputimer->cputime.utime, cputime);
|
||||
cputimer->cputime.utime += cputime;
|
||||
raw_spin_unlock(&cputimer->lock);
|
||||
}
|
||||
|
||||
@@ -307,8 +306,7 @@ static inline void account_group_system_time(struct task_struct *tsk,
|
||||
return;
|
||||
|
||||
raw_spin_lock(&cputimer->lock);
|
||||
cputimer->cputime.stime =
|
||||
cputime_add(cputimer->cputime.stime, cputime);
|
||||
cputimer->cputime.stime += cputime;
|
||||
raw_spin_unlock(&cputimer->lock);
|
||||
}
|
||||
|
||||
|
||||
+2
-4
@@ -1629,10 +1629,8 @@ bool do_notify_parent(struct task_struct *tsk, int sig)
|
||||
info.si_uid = __task_cred(tsk)->uid;
|
||||
rcu_read_unlock();
|
||||
|
||||
info.si_utime = cputime_to_clock_t(cputime_add(tsk->utime,
|
||||
tsk->signal->utime));
|
||||
info.si_stime = cputime_to_clock_t(cputime_add(tsk->stime,
|
||||
tsk->signal->stime));
|
||||
info.si_utime = cputime_to_clock_t(tsk->utime + tsk->signal->utime);
|
||||
info.si_stime = cputime_to_clock_t(tsk->stime + tsk->signal->stime);
|
||||
|
||||
info.si_status = tsk->exit_code & 0x7f;
|
||||
if (tsk->exit_code & 0x80)
|
||||
|
||||
+3
-3
@@ -1605,7 +1605,7 @@ static void k_getrusage(struct task_struct *p, int who, struct rusage *r)
|
||||
unsigned long maxrss = 0;
|
||||
|
||||
memset((char *) r, 0, sizeof *r);
|
||||
utime = stime = cputime_zero;
|
||||
utime = stime = 0;
|
||||
|
||||
if (who == RUSAGE_THREAD) {
|
||||
task_times(current, &utime, &stime);
|
||||
@@ -1635,8 +1635,8 @@ static void k_getrusage(struct task_struct *p, int who, struct rusage *r)
|
||||
|
||||
case RUSAGE_SELF:
|
||||
thread_group_times(p, &tgutime, &tgstime);
|
||||
utime = cputime_add(utime, tgutime);
|
||||
stime = cputime_add(stime, tgstime);
|
||||
utime += tgutime;
|
||||
stime += tgstime;
|
||||
r->ru_nvcsw += p->signal->nvcsw;
|
||||
r->ru_nivcsw += p->signal->nivcsw;
|
||||
r->ru_minflt += p->signal->min_flt;
|
||||
|
||||
+1
-1
@@ -127,7 +127,7 @@ void acct_update_integrals(struct task_struct *tsk)
|
||||
|
||||
local_irq_save(flags);
|
||||
time = tsk->stime + tsk->utime;
|
||||
dtime = cputime_sub(time, tsk->acct_timexpd);
|
||||
dtime = time - tsk->acct_timexpd;
|
||||
jiffies_to_timeval(cputime_to_jiffies(dtime), &value);
|
||||
delta = value.tv_sec;
|
||||
delta = delta * USEC_PER_SEC + value.tv_usec;
|
||||
|
||||
Reference in New Issue
Block a user