Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit efe567fc authored by Christian Borntraeger's avatar Christian Borntraeger Committed by Ingo Molnar
Browse files

sched: accounting regression since rc1



Fix the accounting regression for CONFIG_VIRT_CPU_ACCOUNTING.  It
reverts parts of commit b27f03d4 by
converting fs/proc/array.c back to cputime_t.  The new functions
task_utime and task_stime now return cputime_t instead of clock_t.  If
CONFIG_VIRT_CPU_ACCOUTING is set, task->utime and task->stime are
returned directly instead of using sum_exec_runtime.

Patch is tested on s390x with and without VIRT_CPU_ACCOUTING as well as
on i386.

[ mingo@elte.hu: cleanups, comments. ]

Signed-off-by: default avatarChristian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent c57baf1e
Loading
Loading
Loading
Loading
+29 −15
Original line number Diff line number Diff line
@@ -320,7 +320,21 @@ int proc_pid_status(struct task_struct *task, char *buffer)
	return buffer - orig;
}

static clock_t task_utime(struct task_struct *p)
/*
 * Use precise platform statistics if available:
 */
#ifdef CONFIG_VIRT_CPU_ACCOUNTING
static cputime_t task_utime(struct task_struct *p)
{
	return p->utime;
}

static cputime_t task_stime(struct task_struct *p)
{
	return p->stime;
}
#else
static cputime_t task_utime(struct task_struct *p)
{
	clock_t utime = cputime_to_clock_t(p->utime),
		total = utime + cputime_to_clock_t(p->stime);
@@ -337,10 +351,10 @@ static clock_t task_utime(struct task_struct *p)
	}
	utime = (clock_t)temp;

	return utime;
	return clock_t_to_cputime(utime);
}

static clock_t task_stime(struct task_struct *p)
static cputime_t task_stime(struct task_struct *p)
{
	clock_t stime;

@@ -349,10 +363,12 @@ static clock_t task_stime(struct task_struct *p)
	 * the total, to make sure the total observed by userspace
	 * grows monotonically - apps rely on that):
	 */
	stime = nsec_to_clock_t(p->se.sum_exec_runtime) - task_utime(p);
	stime = nsec_to_clock_t(p->se.sum_exec_runtime) -
			cputime_to_clock_t(task_utime(p));

	return stime;
	return clock_t_to_cputime(stime);
}
#endif

static int do_task_stat(struct task_struct *task, char *buffer, int whole)
{
@@ -368,8 +384,7 @@ static int do_task_stat(struct task_struct *task, char *buffer, int whole)
	unsigned long long start_time;
	unsigned long cmin_flt = 0, cmaj_flt = 0;
	unsigned long  min_flt = 0,  maj_flt = 0;
	cputime_t cutime, cstime;
	clock_t utime, stime;
	cputime_t cutime, cstime, utime, stime;
	unsigned long rsslim = 0;
	char tcomm[sizeof(task->comm)];
	unsigned long flags;
@@ -387,8 +402,7 @@ static int do_task_stat(struct task_struct *task, char *buffer, int whole)

	sigemptyset(&sigign);
	sigemptyset(&sigcatch);
	cutime = cstime = cputime_zero;
	utime = stime = 0;
	cutime = cstime = utime = stime = cputime_zero;

	rcu_read_lock();
	if (lock_task_sighand(task, &flags)) {
@@ -414,15 +428,15 @@ static int do_task_stat(struct task_struct *task, char *buffer, int whole)
			do {
				min_flt += t->min_flt;
				maj_flt += t->maj_flt;
				utime += task_utime(t);
				stime += task_stime(t);
				utime = cputime_add(utime, task_utime(t));
				stime = cputime_add(stime, task_stime(t));
				t = next_thread(t);
			} while (t != task);

			min_flt += sig->min_flt;
			maj_flt += sig->maj_flt;
			utime += cputime_to_clock_t(sig->utime);
			stime += cputime_to_clock_t(sig->stime);
			utime = cputime_add(utime, sig->utime);
			stime = cputime_add(stime, sig->stime);
		}

		sid = signal_session(sig);
@@ -471,8 +485,8 @@ static int do_task_stat(struct task_struct *task, char *buffer, int whole)
		cmin_flt,
		maj_flt,
		cmaj_flt,
		utime,
		stime,
		cputime_to_clock_t(utime),
		cputime_to_clock_t(stime),
		cputime_to_clock_t(cutime),
		cputime_to_clock_t(cstime),
		priority,