mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	cputime: Use accessors to read task cputime stats
This is in preparation for the full dynticks feature. While remotely reading the cputime of a task running in a full dynticks CPU, we'll need to do some extra-computation. This way we can account the time it spent tickless in userspace since its last cputime snapshot. Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Ingo Molnar <mingo@kernel.org> Cc: Li Zhong <zhong@linux.vnet.ibm.com> Cc: Namhyung Kim <namhyung.kim@lge.com> Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com> Cc: Paul Gortmaker <paul.gortmaker@windriver.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Steven Rostedt <rostedt@goodmis.org> Cc: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
		
							parent
							
								
									3f4724ea85
								
							
						
					
					
						commit
						6fac4829ce
					
				
					 16 changed files with 144 additions and 49 deletions
				
			
		| 
						 | 
					@ -1139,6 +1139,7 @@ struct rusage32 {
 | 
				
			||||||
SYSCALL_DEFINE2(osf_getrusage, int, who, struct rusage32 __user *, ru)
 | 
					SYSCALL_DEFINE2(osf_getrusage, int, who, struct rusage32 __user *, ru)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct rusage32 r;
 | 
						struct rusage32 r;
 | 
				
			||||||
 | 
						cputime_t utime, stime;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (who != RUSAGE_SELF && who != RUSAGE_CHILDREN)
 | 
						if (who != RUSAGE_SELF && who != RUSAGE_CHILDREN)
 | 
				
			||||||
		return -EINVAL;
 | 
							return -EINVAL;
 | 
				
			||||||
| 
						 | 
					@ -1146,8 +1147,9 @@ SYSCALL_DEFINE2(osf_getrusage, int, who, struct rusage32 __user *, ru)
 | 
				
			||||||
	memset(&r, 0, sizeof(r));
 | 
						memset(&r, 0, sizeof(r));
 | 
				
			||||||
	switch (who) {
 | 
						switch (who) {
 | 
				
			||||||
	case RUSAGE_SELF:
 | 
						case RUSAGE_SELF:
 | 
				
			||||||
		jiffies_to_timeval32(current->utime, &r.ru_utime);
 | 
							task_cputime(current, &utime, &stime);
 | 
				
			||||||
		jiffies_to_timeval32(current->stime, &r.ru_stime);
 | 
							jiffies_to_timeval32(utime, &r.ru_utime);
 | 
				
			||||||
 | 
							jiffies_to_timeval32(stime, &r.ru_stime);
 | 
				
			||||||
		r.ru_minflt = current->min_flt;
 | 
							r.ru_minflt = current->min_flt;
 | 
				
			||||||
		r.ru_majflt = current->maj_flt;
 | 
							r.ru_majflt = current->maj_flt;
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -899,6 +899,7 @@ static void apm_cpu_idle(void)
 | 
				
			||||||
	static int use_apm_idle; /* = 0 */
 | 
						static int use_apm_idle; /* = 0 */
 | 
				
			||||||
	static unsigned int last_jiffies; /* = 0 */
 | 
						static unsigned int last_jiffies; /* = 0 */
 | 
				
			||||||
	static unsigned int last_stime; /* = 0 */
 | 
						static unsigned int last_stime; /* = 0 */
 | 
				
			||||||
 | 
						cputime_t stime;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	int apm_idle_done = 0;
 | 
						int apm_idle_done = 0;
 | 
				
			||||||
	unsigned int jiffies_since_last_check = jiffies - last_jiffies;
 | 
						unsigned int jiffies_since_last_check = jiffies - last_jiffies;
 | 
				
			||||||
| 
						 | 
					@ -906,23 +907,23 @@ static void apm_cpu_idle(void)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	WARN_ONCE(1, "deprecated apm_cpu_idle will be deleted in 2012");
 | 
						WARN_ONCE(1, "deprecated apm_cpu_idle will be deleted in 2012");
 | 
				
			||||||
recalc:
 | 
					recalc:
 | 
				
			||||||
 | 
						task_cputime(current, NULL, &stime);
 | 
				
			||||||
	if (jiffies_since_last_check > IDLE_CALC_LIMIT) {
 | 
						if (jiffies_since_last_check > IDLE_CALC_LIMIT) {
 | 
				
			||||||
		use_apm_idle = 0;
 | 
							use_apm_idle = 0;
 | 
				
			||||||
		last_jiffies = jiffies;
 | 
					 | 
				
			||||||
		last_stime = current->stime;
 | 
					 | 
				
			||||||
	} else if (jiffies_since_last_check > idle_period) {
 | 
						} else if (jiffies_since_last_check > idle_period) {
 | 
				
			||||||
		unsigned int idle_percentage;
 | 
							unsigned int idle_percentage;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		idle_percentage = current->stime - last_stime;
 | 
							idle_percentage = stime - last_stime;
 | 
				
			||||||
		idle_percentage *= 100;
 | 
							idle_percentage *= 100;
 | 
				
			||||||
		idle_percentage /= jiffies_since_last_check;
 | 
							idle_percentage /= jiffies_since_last_check;
 | 
				
			||||||
		use_apm_idle = (idle_percentage > idle_threshold);
 | 
							use_apm_idle = (idle_percentage > idle_threshold);
 | 
				
			||||||
		if (apm_info.forbid_idle)
 | 
							if (apm_info.forbid_idle)
 | 
				
			||||||
			use_apm_idle = 0;
 | 
								use_apm_idle = 0;
 | 
				
			||||||
		last_jiffies = jiffies;
 | 
					 | 
				
			||||||
		last_stime = current->stime;
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						last_jiffies = jiffies;
 | 
				
			||||||
 | 
						last_stime = stime;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	bucket = IDLE_LEAKY_MAX;
 | 
						bucket = IDLE_LEAKY_MAX;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	while (!need_resched()) {
 | 
						while (!need_resched()) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -18,6 +18,7 @@
 | 
				
			||||||
#include <linux/slab.h>
 | 
					#include <linux/slab.h>
 | 
				
			||||||
#include <linux/mISDNif.h>
 | 
					#include <linux/mISDNif.h>
 | 
				
			||||||
#include <linux/kthread.h>
 | 
					#include <linux/kthread.h>
 | 
				
			||||||
 | 
					#include <linux/sched.h>
 | 
				
			||||||
#include "core.h"
 | 
					#include "core.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static u_int	*debug;
 | 
					static u_int	*debug;
 | 
				
			||||||
| 
						 | 
					@ -202,6 +203,9 @@ static int
 | 
				
			||||||
mISDNStackd(void *data)
 | 
					mISDNStackd(void *data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct mISDNstack *st = data;
 | 
						struct mISDNstack *st = data;
 | 
				
			||||||
 | 
					#ifdef MISDN_MSG_STATS
 | 
				
			||||||
 | 
						cputime_t utime, stime;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
	int err = 0;
 | 
						int err = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sigfillset(¤t->blocked);
 | 
						sigfillset(¤t->blocked);
 | 
				
			||||||
| 
						 | 
					@ -303,9 +307,10 @@ mISDNStackd(void *data)
 | 
				
			||||||
	       "msg %d sleep %d stopped\n",
 | 
						       "msg %d sleep %d stopped\n",
 | 
				
			||||||
	       dev_name(&st->dev->dev), st->msg_cnt, st->sleep_cnt,
 | 
						       dev_name(&st->dev->dev), st->msg_cnt, st->sleep_cnt,
 | 
				
			||||||
	       st->stopped_cnt);
 | 
						       st->stopped_cnt);
 | 
				
			||||||
 | 
						task_cputime(st->thread, &utime, &stime);
 | 
				
			||||||
	printk(KERN_DEBUG
 | 
						printk(KERN_DEBUG
 | 
				
			||||||
	       "mISDNStackd daemon for %s utime(%ld) stime(%ld)\n",
 | 
						       "mISDNStackd daemon for %s utime(%ld) stime(%ld)\n",
 | 
				
			||||||
	       dev_name(&st->dev->dev), st->thread->utime, st->thread->stime);
 | 
						       dev_name(&st->dev->dev), utime, stime);
 | 
				
			||||||
	printk(KERN_DEBUG
 | 
						printk(KERN_DEBUG
 | 
				
			||||||
	       "mISDNStackd daemon for %s nvcsw(%ld) nivcsw(%ld)\n",
 | 
						       "mISDNStackd daemon for %s nvcsw(%ld) nivcsw(%ld)\n",
 | 
				
			||||||
	       dev_name(&st->dev->dev), st->thread->nvcsw, st->thread->nivcsw);
 | 
						       dev_name(&st->dev->dev), st->thread->nvcsw, st->thread->nivcsw);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -33,6 +33,7 @@
 | 
				
			||||||
#include <linux/elf.h>
 | 
					#include <linux/elf.h>
 | 
				
			||||||
#include <linux/utsname.h>
 | 
					#include <linux/utsname.h>
 | 
				
			||||||
#include <linux/coredump.h>
 | 
					#include <linux/coredump.h>
 | 
				
			||||||
 | 
					#include <linux/sched.h>
 | 
				
			||||||
#include <asm/uaccess.h>
 | 
					#include <asm/uaccess.h>
 | 
				
			||||||
#include <asm/param.h>
 | 
					#include <asm/param.h>
 | 
				
			||||||
#include <asm/page.h>
 | 
					#include <asm/page.h>
 | 
				
			||||||
| 
						 | 
					@ -1320,8 +1321,11 @@ static void fill_prstatus(struct elf_prstatus *prstatus,
 | 
				
			||||||
		cputime_to_timeval(cputime.utime, &prstatus->pr_utime);
 | 
							cputime_to_timeval(cputime.utime, &prstatus->pr_utime);
 | 
				
			||||||
		cputime_to_timeval(cputime.stime, &prstatus->pr_stime);
 | 
							cputime_to_timeval(cputime.stime, &prstatus->pr_stime);
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		cputime_to_timeval(p->utime, &prstatus->pr_utime);
 | 
							cputime_t utime, stime;
 | 
				
			||||||
		cputime_to_timeval(p->stime, &prstatus->pr_stime);
 | 
					
 | 
				
			||||||
 | 
							task_cputime(p, &utime, &stime);
 | 
				
			||||||
 | 
							cputime_to_timeval(utime, &prstatus->pr_utime);
 | 
				
			||||||
 | 
							cputime_to_timeval(stime, &prstatus->pr_stime);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	cputime_to_timeval(p->signal->cutime, &prstatus->pr_cutime);
 | 
						cputime_to_timeval(p->signal->cutime, &prstatus->pr_cutime);
 | 
				
			||||||
	cputime_to_timeval(p->signal->cstime, &prstatus->pr_cstime);
 | 
						cputime_to_timeval(p->signal->cstime, &prstatus->pr_cstime);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1375,8 +1375,11 @@ static void fill_prstatus(struct elf_prstatus *prstatus,
 | 
				
			||||||
		cputime_to_timeval(cputime.utime, &prstatus->pr_utime);
 | 
							cputime_to_timeval(cputime.utime, &prstatus->pr_utime);
 | 
				
			||||||
		cputime_to_timeval(cputime.stime, &prstatus->pr_stime);
 | 
							cputime_to_timeval(cputime.stime, &prstatus->pr_stime);
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		cputime_to_timeval(p->utime, &prstatus->pr_utime);
 | 
							cputime_t utime, stime;
 | 
				
			||||||
		cputime_to_timeval(p->stime, &prstatus->pr_stime);
 | 
					
 | 
				
			||||||
 | 
							task_cputime(p, &utime, &stime);
 | 
				
			||||||
 | 
							cputime_to_timeval(utime, &prstatus->pr_utime);
 | 
				
			||||||
 | 
							cputime_to_timeval(stime, &prstatus->pr_stime);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	cputime_to_timeval(p->signal->cutime, &prstatus->pr_cutime);
 | 
						cputime_to_timeval(p->signal->cutime, &prstatus->pr_cutime);
 | 
				
			||||||
	cputime_to_timeval(p->signal->cstime, &prstatus->pr_cstime);
 | 
						cputime_to_timeval(p->signal->cstime, &prstatus->pr_cstime);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -449,7 +449,7 @@ static int do_task_stat(struct seq_file *m, struct pid_namespace *ns,
 | 
				
			||||||
			do {
 | 
								do {
 | 
				
			||||||
				min_flt += t->min_flt;
 | 
									min_flt += t->min_flt;
 | 
				
			||||||
				maj_flt += t->maj_flt;
 | 
									maj_flt += t->maj_flt;
 | 
				
			||||||
				gtime += t->gtime;
 | 
									gtime += task_gtime(t);
 | 
				
			||||||
				t = next_thread(t);
 | 
									t = next_thread(t);
 | 
				
			||||||
			} while (t != task);
 | 
								} while (t != task);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -472,7 +472,7 @@ static int do_task_stat(struct seq_file *m, struct pid_namespace *ns,
 | 
				
			||||||
		min_flt = task->min_flt;
 | 
							min_flt = task->min_flt;
 | 
				
			||||||
		maj_flt = task->maj_flt;
 | 
							maj_flt = task->maj_flt;
 | 
				
			||||||
		task_cputime_adjusted(task, &utime, &stime);
 | 
							task_cputime_adjusted(task, &utime, &stime);
 | 
				
			||||||
		gtime = task->gtime;
 | 
							gtime = task_gtime(task);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* scale priority and nice values from timeslices to -20..20 */
 | 
						/* scale priority and nice values from timeslices to -20..20 */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1792,6 +1792,29 @@ static inline void put_task_struct(struct task_struct *t)
 | 
				
			||||||
		__put_task_struct(t);
 | 
							__put_task_struct(t);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline cputime_t task_gtime(struct task_struct *t)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return t->gtime;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline void task_cputime(struct task_struct *t,
 | 
				
			||||||
 | 
									cputime_t *utime, cputime_t *stime)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if (utime)
 | 
				
			||||||
 | 
							*utime = t->utime;
 | 
				
			||||||
 | 
						if (stime)
 | 
				
			||||||
 | 
							*stime = t->stime;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline void task_cputime_scaled(struct task_struct *t,
 | 
				
			||||||
 | 
									       cputime_t *utimescaled,
 | 
				
			||||||
 | 
									       cputime_t *stimescaled)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if (utimescaled)
 | 
				
			||||||
 | 
							*utimescaled = t->utimescaled;
 | 
				
			||||||
 | 
						if (stimescaled)
 | 
				
			||||||
 | 
							*stimescaled = t->stimescaled;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
extern void task_cputime_adjusted(struct task_struct *p, cputime_t *ut, cputime_t *st);
 | 
					extern void task_cputime_adjusted(struct task_struct *p, cputime_t *ut, cputime_t *st);
 | 
				
			||||||
extern void thread_group_cputime_adjusted(struct task_struct *p, cputime_t *ut, cputime_t *st);
 | 
					extern void thread_group_cputime_adjusted(struct task_struct *p, cputime_t *ut, cputime_t *st);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -23,12 +23,15 @@ static inline void bacct_add_tsk(struct user_namespace *user_ns,
 | 
				
			||||||
#ifdef CONFIG_TASK_XACCT
 | 
					#ifdef CONFIG_TASK_XACCT
 | 
				
			||||||
extern void xacct_add_tsk(struct taskstats *stats, struct task_struct *p);
 | 
					extern void xacct_add_tsk(struct taskstats *stats, struct task_struct *p);
 | 
				
			||||||
extern void acct_update_integrals(struct task_struct *tsk);
 | 
					extern void acct_update_integrals(struct task_struct *tsk);
 | 
				
			||||||
 | 
					extern void acct_account_cputime(struct task_struct *tsk);
 | 
				
			||||||
extern void acct_clear_integrals(struct task_struct *tsk);
 | 
					extern void acct_clear_integrals(struct task_struct *tsk);
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
static inline void xacct_add_tsk(struct taskstats *stats, struct task_struct *p)
 | 
					static inline void xacct_add_tsk(struct taskstats *stats, struct task_struct *p)
 | 
				
			||||||
{}
 | 
					{}
 | 
				
			||||||
static inline void acct_update_integrals(struct task_struct *tsk)
 | 
					static inline void acct_update_integrals(struct task_struct *tsk)
 | 
				
			||||||
{}
 | 
					{}
 | 
				
			||||||
 | 
					static inline void acct_account_cputime(struct task_struct *tsk)
 | 
				
			||||||
 | 
					{}
 | 
				
			||||||
static inline void acct_clear_integrals(struct task_struct *tsk)
 | 
					static inline void acct_clear_integrals(struct task_struct *tsk)
 | 
				
			||||||
{}
 | 
					{}
 | 
				
			||||||
#endif /* CONFIG_TASK_XACCT */
 | 
					#endif /* CONFIG_TASK_XACCT */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -566,6 +566,7 @@ static void do_acct_process(struct bsd_acct_struct *acct,
 | 
				
			||||||
void acct_collect(long exitcode, int group_dead)
 | 
					void acct_collect(long exitcode, int group_dead)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct pacct_struct *pacct = ¤t->signal->pacct;
 | 
						struct pacct_struct *pacct = ¤t->signal->pacct;
 | 
				
			||||||
 | 
						cputime_t utime, stime;
 | 
				
			||||||
	unsigned long vsize = 0;
 | 
						unsigned long vsize = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (group_dead && current->mm) {
 | 
						if (group_dead && current->mm) {
 | 
				
			||||||
| 
						 | 
					@ -593,8 +594,9 @@ void acct_collect(long exitcode, int group_dead)
 | 
				
			||||||
		pacct->ac_flag |= ACORE;
 | 
							pacct->ac_flag |= ACORE;
 | 
				
			||||||
	if (current->flags & PF_SIGNALED)
 | 
						if (current->flags & PF_SIGNALED)
 | 
				
			||||||
		pacct->ac_flag |= AXSIG;
 | 
							pacct->ac_flag |= AXSIG;
 | 
				
			||||||
	pacct->ac_utime += current->utime;
 | 
						task_cputime(current, &utime, &stime);
 | 
				
			||||||
	pacct->ac_stime += current->stime;
 | 
						pacct->ac_utime += utime;
 | 
				
			||||||
 | 
						pacct->ac_stime += stime;
 | 
				
			||||||
	pacct->ac_minflt += current->min_flt;
 | 
						pacct->ac_minflt += current->min_flt;
 | 
				
			||||||
	pacct->ac_majflt += current->maj_flt;
 | 
						pacct->ac_majflt += current->maj_flt;
 | 
				
			||||||
	spin_unlock_irq(¤t->sighand->siglock);
 | 
						spin_unlock_irq(¤t->sighand->siglock);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -224,11 +224,13 @@ void clear_tasks_mm_cpumask(int cpu)
 | 
				
			||||||
static inline void check_for_tasks(int cpu)
 | 
					static inline void check_for_tasks(int cpu)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct task_struct *p;
 | 
						struct task_struct *p;
 | 
				
			||||||
 | 
						cputime_t utime, stime;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	write_lock_irq(&tasklist_lock);
 | 
						write_lock_irq(&tasklist_lock);
 | 
				
			||||||
	for_each_process(p) {
 | 
						for_each_process(p) {
 | 
				
			||||||
 | 
							task_cputime(p, &utime, &stime);
 | 
				
			||||||
		if (task_cpu(p) == cpu && p->state == TASK_RUNNING &&
 | 
							if (task_cpu(p) == cpu && p->state == TASK_RUNNING &&
 | 
				
			||||||
		    (p->utime || p->stime))
 | 
							    (utime || stime))
 | 
				
			||||||
			printk(KERN_WARNING "Task %s (pid = %d) is on cpu %d "
 | 
								printk(KERN_WARNING "Task %s (pid = %d) is on cpu %d "
 | 
				
			||||||
				"(state = %ld, flags = %x)\n",
 | 
									"(state = %ld, flags = %x)\n",
 | 
				
			||||||
				p->comm, task_pid_nr(p), cpu,
 | 
									p->comm, task_pid_nr(p), cpu,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -106,6 +106,7 @@ int __delayacct_add_tsk(struct taskstats *d, struct task_struct *tsk)
 | 
				
			||||||
	unsigned long long t2, t3;
 | 
						unsigned long long t2, t3;
 | 
				
			||||||
	unsigned long flags;
 | 
						unsigned long flags;
 | 
				
			||||||
	struct timespec ts;
 | 
						struct timespec ts;
 | 
				
			||||||
 | 
						cputime_t utime, stime, stimescaled, utimescaled;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Though tsk->delays accessed later, early exit avoids
 | 
						/* Though tsk->delays accessed later, early exit avoids
 | 
				
			||||||
	 * unnecessary returning of other data
 | 
						 * unnecessary returning of other data
 | 
				
			||||||
| 
						 | 
					@ -114,12 +115,14 @@ int __delayacct_add_tsk(struct taskstats *d, struct task_struct *tsk)
 | 
				
			||||||
		goto done;
 | 
							goto done;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	tmp = (s64)d->cpu_run_real_total;
 | 
						tmp = (s64)d->cpu_run_real_total;
 | 
				
			||||||
	cputime_to_timespec(tsk->utime + tsk->stime, &ts);
 | 
						task_cputime(tsk, &utime, &stime);
 | 
				
			||||||
 | 
						cputime_to_timespec(utime + stime, &ts);
 | 
				
			||||||
	tmp += timespec_to_ns(&ts);
 | 
						tmp += timespec_to_ns(&ts);
 | 
				
			||||||
	d->cpu_run_real_total = (tmp < (s64)d->cpu_run_real_total) ? 0 : tmp;
 | 
						d->cpu_run_real_total = (tmp < (s64)d->cpu_run_real_total) ? 0 : tmp;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	tmp = (s64)d->cpu_scaled_run_real_total;
 | 
						tmp = (s64)d->cpu_scaled_run_real_total;
 | 
				
			||||||
	cputime_to_timespec(tsk->utimescaled + tsk->stimescaled, &ts);
 | 
						task_cputime_scaled(tsk, &utimescaled, &stimescaled);
 | 
				
			||||||
 | 
						cputime_to_timespec(utimescaled + stimescaled, &ts);
 | 
				
			||||||
	tmp += timespec_to_ns(&ts);
 | 
						tmp += timespec_to_ns(&ts);
 | 
				
			||||||
	d->cpu_scaled_run_real_total =
 | 
						d->cpu_scaled_run_real_total =
 | 
				
			||||||
		(tmp < (s64)d->cpu_scaled_run_real_total) ? 0 : tmp;
 | 
							(tmp < (s64)d->cpu_scaled_run_real_total) ? 0 : tmp;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -85,6 +85,7 @@ static void __exit_signal(struct task_struct *tsk)
 | 
				
			||||||
	bool group_dead = thread_group_leader(tsk);
 | 
						bool group_dead = thread_group_leader(tsk);
 | 
				
			||||||
	struct sighand_struct *sighand;
 | 
						struct sighand_struct *sighand;
 | 
				
			||||||
	struct tty_struct *uninitialized_var(tty);
 | 
						struct tty_struct *uninitialized_var(tty);
 | 
				
			||||||
 | 
						cputime_t utime, stime;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sighand = rcu_dereference_check(tsk->sighand,
 | 
						sighand = rcu_dereference_check(tsk->sighand,
 | 
				
			||||||
					lockdep_tasklist_lock_is_held());
 | 
										lockdep_tasklist_lock_is_held());
 | 
				
			||||||
| 
						 | 
					@ -123,9 +124,10 @@ static void __exit_signal(struct task_struct *tsk)
 | 
				
			||||||
		 * We won't ever get here for the group leader, since it
 | 
							 * We won't ever get here for the group leader, since it
 | 
				
			||||||
		 * will have been the last reference on the signal_struct.
 | 
							 * will have been the last reference on the signal_struct.
 | 
				
			||||||
		 */
 | 
							 */
 | 
				
			||||||
		sig->utime += tsk->utime;
 | 
							task_cputime(tsk, &utime, &stime);
 | 
				
			||||||
		sig->stime += tsk->stime;
 | 
							sig->utime += utime;
 | 
				
			||||||
		sig->gtime += tsk->gtime;
 | 
							sig->stime += stime;
 | 
				
			||||||
 | 
							sig->gtime += task_gtime(tsk);
 | 
				
			||||||
		sig->min_flt += tsk->min_flt;
 | 
							sig->min_flt += tsk->min_flt;
 | 
				
			||||||
		sig->maj_flt += tsk->maj_flt;
 | 
							sig->maj_flt += tsk->maj_flt;
 | 
				
			||||||
		sig->nvcsw += tsk->nvcsw;
 | 
							sig->nvcsw += tsk->nvcsw;
 | 
				
			||||||
| 
						 | 
					@ -1092,7 +1094,7 @@ static int wait_task_zombie(struct wait_opts *wo, struct task_struct *p)
 | 
				
			||||||
		sig = p->signal;
 | 
							sig = p->signal;
 | 
				
			||||||
		psig->cutime += tgutime + sig->cutime;
 | 
							psig->cutime += tgutime + sig->cutime;
 | 
				
			||||||
		psig->cstime += tgstime + sig->cstime;
 | 
							psig->cstime += tgstime + sig->cstime;
 | 
				
			||||||
		psig->cgtime += p->gtime + sig->gtime + sig->cgtime;
 | 
							psig->cgtime += task_gtime(p) + sig->gtime + sig->cgtime;
 | 
				
			||||||
		psig->cmin_flt +=
 | 
							psig->cmin_flt +=
 | 
				
			||||||
			p->min_flt + sig->min_flt + sig->cmin_flt;
 | 
								p->min_flt + sig->min_flt + sig->cmin_flt;
 | 
				
			||||||
		psig->cmaj_flt +=
 | 
							psig->cmaj_flt +=
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -155,11 +155,19 @@ static void bump_cpu_timer(struct k_itimer *timer,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline cputime_t prof_ticks(struct task_struct *p)
 | 
					static inline cputime_t prof_ticks(struct task_struct *p)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	return p->utime + p->stime;
 | 
						cputime_t utime, stime;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						task_cputime(p, &utime, &stime);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return utime + stime;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
static inline cputime_t virt_ticks(struct task_struct *p)
 | 
					static inline cputime_t virt_ticks(struct task_struct *p)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	return p->utime;
 | 
						cputime_t utime;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						task_cputime(p, &utime, NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return utime;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int
 | 
					static int
 | 
				
			||||||
| 
						 | 
					@ -471,18 +479,23 @@ static void cleanup_timers(struct list_head *head,
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
void posix_cpu_timers_exit(struct task_struct *tsk)
 | 
					void posix_cpu_timers_exit(struct task_struct *tsk)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						cputime_t utime, stime;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	add_device_randomness((const void*) &tsk->se.sum_exec_runtime,
 | 
						add_device_randomness((const void*) &tsk->se.sum_exec_runtime,
 | 
				
			||||||
						sizeof(unsigned long long));
 | 
											sizeof(unsigned long long));
 | 
				
			||||||
 | 
						task_cputime(tsk, &utime, &stime);
 | 
				
			||||||
	cleanup_timers(tsk->cpu_timers,
 | 
						cleanup_timers(tsk->cpu_timers,
 | 
				
			||||||
		       tsk->utime, tsk->stime, tsk->se.sum_exec_runtime);
 | 
							       utime, stime, tsk->se.sum_exec_runtime);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
void posix_cpu_timers_exit_group(struct task_struct *tsk)
 | 
					void posix_cpu_timers_exit_group(struct task_struct *tsk)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct signal_struct *const sig = tsk->signal;
 | 
						struct signal_struct *const sig = tsk->signal;
 | 
				
			||||||
 | 
						cputime_t utime, stime;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						task_cputime(tsk, &utime, &stime);
 | 
				
			||||||
	cleanup_timers(tsk->signal->cpu_timers,
 | 
						cleanup_timers(tsk->signal->cpu_timers,
 | 
				
			||||||
		       tsk->utime + sig->utime, tsk->stime + sig->stime,
 | 
							       utime + sig->utime, stime + sig->stime,
 | 
				
			||||||
		       tsk->se.sum_exec_runtime + sig->sum_sched_runtime);
 | 
							       tsk->se.sum_exec_runtime + sig->sum_sched_runtime);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1226,11 +1239,14 @@ static inline int task_cputime_expired(const struct task_cputime *sample,
 | 
				
			||||||
static inline int fastpath_timer_check(struct task_struct *tsk)
 | 
					static inline int fastpath_timer_check(struct task_struct *tsk)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct signal_struct *sig;
 | 
						struct signal_struct *sig;
 | 
				
			||||||
 | 
						cputime_t utime, stime;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						task_cputime(tsk, &utime, &stime);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!task_cputime_zero(&tsk->cputime_expires)) {
 | 
						if (!task_cputime_zero(&tsk->cputime_expires)) {
 | 
				
			||||||
		struct task_cputime task_sample = {
 | 
							struct task_cputime task_sample = {
 | 
				
			||||||
			.utime = tsk->utime,
 | 
								.utime = utime,
 | 
				
			||||||
			.stime = tsk->stime,
 | 
								.stime = stime,
 | 
				
			||||||
			.sum_exec_runtime = tsk->se.sum_exec_runtime
 | 
								.sum_exec_runtime = tsk->se.sum_exec_runtime
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -164,7 +164,7 @@ void account_user_time(struct task_struct *p, cputime_t cputime,
 | 
				
			||||||
	task_group_account_field(p, index, (__force u64) cputime);
 | 
						task_group_account_field(p, index, (__force u64) cputime);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Account for user time used */
 | 
						/* Account for user time used */
 | 
				
			||||||
	acct_update_integrals(p);
 | 
						acct_account_cputime(p);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
| 
						 | 
					@ -214,7 +214,7 @@ void __account_system_time(struct task_struct *p, cputime_t cputime,
 | 
				
			||||||
	task_group_account_field(p, index, (__force u64) cputime);
 | 
						task_group_account_field(p, index, (__force u64) cputime);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Account for system time used */
 | 
						/* Account for system time used */
 | 
				
			||||||
	acct_update_integrals(p);
 | 
						acct_account_cputime(p);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
| 
						 | 
					@ -296,6 +296,7 @@ static __always_inline bool steal_account_process_tick(void)
 | 
				
			||||||
void thread_group_cputime(struct task_struct *tsk, struct task_cputime *times)
 | 
					void thread_group_cputime(struct task_struct *tsk, struct task_cputime *times)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct signal_struct *sig = tsk->signal;
 | 
						struct signal_struct *sig = tsk->signal;
 | 
				
			||||||
 | 
						cputime_t utime, stime;
 | 
				
			||||||
	struct task_struct *t;
 | 
						struct task_struct *t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	times->utime = sig->utime;
 | 
						times->utime = sig->utime;
 | 
				
			||||||
| 
						 | 
					@ -309,8 +310,9 @@ void thread_group_cputime(struct task_struct *tsk, struct task_cputime *times)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	t = tsk;
 | 
						t = tsk;
 | 
				
			||||||
	do {
 | 
						do {
 | 
				
			||||||
		times->utime += t->utime;
 | 
							task_cputime(tsk, &utime, &stime);
 | 
				
			||||||
		times->stime += t->stime;
 | 
							times->utime += utime;
 | 
				
			||||||
 | 
							times->stime += stime;
 | 
				
			||||||
		times->sum_exec_runtime += task_sched_runtime(t);
 | 
							times->sum_exec_runtime += task_sched_runtime(t);
 | 
				
			||||||
	} while_each_thread(tsk, t);
 | 
						} while_each_thread(tsk, t);
 | 
				
			||||||
out:
 | 
					out:
 | 
				
			||||||
| 
						 | 
					@ -588,11 +590,10 @@ static void cputime_adjust(struct task_cputime *curr,
 | 
				
			||||||
void task_cputime_adjusted(struct task_struct *p, cputime_t *ut, cputime_t *st)
 | 
					void task_cputime_adjusted(struct task_struct *p, cputime_t *ut, cputime_t *st)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct task_cputime cputime = {
 | 
						struct task_cputime cputime = {
 | 
				
			||||||
		.utime = p->utime,
 | 
					 | 
				
			||||||
		.stime = p->stime,
 | 
					 | 
				
			||||||
		.sum_exec_runtime = p->se.sum_exec_runtime,
 | 
							.sum_exec_runtime = p->se.sum_exec_runtime,
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						task_cputime(p, &cputime.utime, &cputime.stime);
 | 
				
			||||||
	cputime_adjust(&cputime, &p->prev_cputime, ut, st);
 | 
						cputime_adjust(&cputime, &p->prev_cputime, ut, st);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1638,6 +1638,7 @@ bool do_notify_parent(struct task_struct *tsk, int sig)
 | 
				
			||||||
	unsigned long flags;
 | 
						unsigned long flags;
 | 
				
			||||||
	struct sighand_struct *psig;
 | 
						struct sighand_struct *psig;
 | 
				
			||||||
	bool autoreap = false;
 | 
						bool autoreap = false;
 | 
				
			||||||
 | 
						cputime_t utime, stime;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	BUG_ON(sig == -1);
 | 
						BUG_ON(sig == -1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1675,8 +1676,9 @@ bool do_notify_parent(struct task_struct *tsk, int sig)
 | 
				
			||||||
				       task_uid(tsk));
 | 
									       task_uid(tsk));
 | 
				
			||||||
	rcu_read_unlock();
 | 
						rcu_read_unlock();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	info.si_utime = cputime_to_clock_t(tsk->utime + tsk->signal->utime);
 | 
						task_cputime(tsk, &utime, &stime);
 | 
				
			||||||
	info.si_stime = cputime_to_clock_t(tsk->stime + tsk->signal->stime);
 | 
						info.si_utime = cputime_to_clock_t(utime + tsk->signal->utime);
 | 
				
			||||||
 | 
						info.si_stime = cputime_to_clock_t(stime + tsk->signal->stime);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	info.si_status = tsk->exit_code & 0x7f;
 | 
						info.si_status = tsk->exit_code & 0x7f;
 | 
				
			||||||
	if (tsk->exit_code & 0x80)
 | 
						if (tsk->exit_code & 0x80)
 | 
				
			||||||
| 
						 | 
					@ -1740,6 +1742,7 @@ static void do_notify_parent_cldstop(struct task_struct *tsk,
 | 
				
			||||||
	unsigned long flags;
 | 
						unsigned long flags;
 | 
				
			||||||
	struct task_struct *parent;
 | 
						struct task_struct *parent;
 | 
				
			||||||
	struct sighand_struct *sighand;
 | 
						struct sighand_struct *sighand;
 | 
				
			||||||
 | 
						cputime_t utime, stime;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (for_ptracer) {
 | 
						if (for_ptracer) {
 | 
				
			||||||
		parent = tsk->parent;
 | 
							parent = tsk->parent;
 | 
				
			||||||
| 
						 | 
					@ -1758,8 +1761,9 @@ static void do_notify_parent_cldstop(struct task_struct *tsk,
 | 
				
			||||||
	info.si_uid = from_kuid_munged(task_cred_xxx(parent, user_ns), task_uid(tsk));
 | 
						info.si_uid = from_kuid_munged(task_cred_xxx(parent, user_ns), task_uid(tsk));
 | 
				
			||||||
	rcu_read_unlock();
 | 
						rcu_read_unlock();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	info.si_utime = cputime_to_clock_t(tsk->utime);
 | 
						task_cputime(tsk, &utime, &stime);
 | 
				
			||||||
	info.si_stime = cputime_to_clock_t(tsk->stime);
 | 
						info.si_utime = cputime_to_clock_t(utime);
 | 
				
			||||||
 | 
						info.si_stime = cputime_to_clock_t(stime);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 	info.si_code = why;
 | 
					 	info.si_code = why;
 | 
				
			||||||
 	switch (why) {
 | 
					 	switch (why) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -32,6 +32,7 @@ void bacct_add_tsk(struct user_namespace *user_ns,
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	const struct cred *tcred;
 | 
						const struct cred *tcred;
 | 
				
			||||||
	struct timespec uptime, ts;
 | 
						struct timespec uptime, ts;
 | 
				
			||||||
 | 
						cputime_t utime, stime, utimescaled, stimescaled;
 | 
				
			||||||
	u64 ac_etime;
 | 
						u64 ac_etime;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	BUILD_BUG_ON(TS_COMM_LEN < TASK_COMM_LEN);
 | 
						BUILD_BUG_ON(TS_COMM_LEN < TASK_COMM_LEN);
 | 
				
			||||||
| 
						 | 
					@ -65,10 +66,15 @@ void bacct_add_tsk(struct user_namespace *user_ns,
 | 
				
			||||||
	stats->ac_ppid	 = pid_alive(tsk) ?
 | 
						stats->ac_ppid	 = pid_alive(tsk) ?
 | 
				
			||||||
		task_tgid_nr_ns(rcu_dereference(tsk->real_parent), pid_ns) : 0;
 | 
							task_tgid_nr_ns(rcu_dereference(tsk->real_parent), pid_ns) : 0;
 | 
				
			||||||
	rcu_read_unlock();
 | 
						rcu_read_unlock();
 | 
				
			||||||
	stats->ac_utime = cputime_to_usecs(tsk->utime);
 | 
					
 | 
				
			||||||
	stats->ac_stime = cputime_to_usecs(tsk->stime);
 | 
						task_cputime(tsk, &utime, &stime);
 | 
				
			||||||
	stats->ac_utimescaled = cputime_to_usecs(tsk->utimescaled);
 | 
						stats->ac_utime = cputime_to_usecs(utime);
 | 
				
			||||||
	stats->ac_stimescaled = cputime_to_usecs(tsk->stimescaled);
 | 
						stats->ac_stime = cputime_to_usecs(stime);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						task_cputime_scaled(tsk, &utimescaled, &stimescaled);
 | 
				
			||||||
 | 
						stats->ac_utimescaled = cputime_to_usecs(utimescaled);
 | 
				
			||||||
 | 
						stats->ac_stimescaled = cputime_to_usecs(stimescaled);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	stats->ac_minflt = tsk->min_flt;
 | 
						stats->ac_minflt = tsk->min_flt;
 | 
				
			||||||
	stats->ac_majflt = tsk->maj_flt;
 | 
						stats->ac_majflt = tsk->maj_flt;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -115,11 +121,8 @@ void xacct_add_tsk(struct taskstats *stats, struct task_struct *p)
 | 
				
			||||||
#undef KB
 | 
					#undef KB
 | 
				
			||||||
#undef MB
 | 
					#undef MB
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					static void __acct_update_integrals(struct task_struct *tsk,
 | 
				
			||||||
 * acct_update_integrals - update mm integral fields in task_struct
 | 
									    cputime_t utime, cputime_t stime)
 | 
				
			||||||
 * @tsk: task_struct for accounting
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
void acct_update_integrals(struct task_struct *tsk)
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (likely(tsk->mm)) {
 | 
						if (likely(tsk->mm)) {
 | 
				
			||||||
		cputime_t time, dtime;
 | 
							cputime_t time, dtime;
 | 
				
			||||||
| 
						 | 
					@ -128,7 +131,7 @@ void acct_update_integrals(struct task_struct *tsk)
 | 
				
			||||||
		u64 delta;
 | 
							u64 delta;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		local_irq_save(flags);
 | 
							local_irq_save(flags);
 | 
				
			||||||
		time = tsk->stime + tsk->utime;
 | 
							time = stime + utime;
 | 
				
			||||||
		dtime = time - tsk->acct_timexpd;
 | 
							dtime = time - tsk->acct_timexpd;
 | 
				
			||||||
		jiffies_to_timeval(cputime_to_jiffies(dtime), &value);
 | 
							jiffies_to_timeval(cputime_to_jiffies(dtime), &value);
 | 
				
			||||||
		delta = value.tv_sec;
 | 
							delta = value.tv_sec;
 | 
				
			||||||
| 
						 | 
					@ -144,6 +147,27 @@ void acct_update_integrals(struct task_struct *tsk)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * acct_update_integrals - update mm integral fields in task_struct
 | 
				
			||||||
 | 
					 * @tsk: task_struct for accounting
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					void acct_update_integrals(struct task_struct *tsk)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						cputime_t utime, stime;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						task_cputime(tsk, &utime, &stime);
 | 
				
			||||||
 | 
						__acct_update_integrals(tsk, utime, stime);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * acct_account_cputime - update mm integral after cputime update
 | 
				
			||||||
 | 
					 * @tsk: task_struct for accounting
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					void acct_account_cputime(struct task_struct *tsk)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						__acct_update_integrals(tsk, tsk->utime, tsk->stime);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * acct_clear_integrals - clear the mm integral fields in task_struct
 | 
					 * acct_clear_integrals - clear the mm integral fields in task_struct
 | 
				
			||||||
 * @tsk: task_struct whose accounting fields are cleared
 | 
					 * @tsk: task_struct whose accounting fields are cleared
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue