|
@@ -614,19 +614,25 @@ static void cputime_adjust(struct task_cputime *curr,
|
|
|
stime = curr->stime;
|
|
|
utime = curr->utime;
|
|
|
|
|
|
- if (utime == 0) {
|
|
|
- stime = rtime;
|
|
|
+ /*
|
|
|
+ * If either stime or both stime and utime are 0, assume all runtime is
|
|
|
+ * userspace. Once a task gets some ticks, the monotonicy code at
|
|
|
+ * 'update' will ensure things converge to the observed ratio.
|
|
|
+ */
|
|
|
+ if (stime == 0) {
|
|
|
+ utime = rtime;
|
|
|
goto update;
|
|
|
}
|
|
|
|
|
|
- if (stime == 0) {
|
|
|
- utime = rtime;
|
|
|
+ if (utime == 0) {
|
|
|
+ stime = rtime;
|
|
|
goto update;
|
|
|
}
|
|
|
|
|
|
stime = scale_stime((__force u64)stime, (__force u64)rtime,
|
|
|
(__force u64)(stime + utime));
|
|
|
|
|
|
+update:
|
|
|
/*
|
|
|
* Make sure stime doesn't go backwards; this preserves monotonicity
|
|
|
* for utime because rtime is monotonic.
|
|
@@ -649,7 +655,6 @@ static void cputime_adjust(struct task_cputime *curr,
|
|
|
stime = rtime - utime;
|
|
|
}
|
|
|
|
|
|
-update:
|
|
|
prev->stime = stime;
|
|
|
prev->utime = utime;
|
|
|
out:
|