diff options
| -rw-r--r-- | fs/proc/base.c | 51 | ||||
| -rw-r--r-- | include/linux/sched.h | 19 | ||||
| -rw-r--r-- | include/linux/task_io_accounting.h | 27 | ||||
| -rw-r--r-- | include/linux/task_io_accounting_ops.h | 56 | ||||
| -rw-r--r-- | kernel/exit.c | 30 | ||||
| -rw-r--r-- | kernel/fork.c | 15 | ||||
| -rw-r--r-- | kernel/tsacct.c | 14 | 
7 files changed, 101 insertions, 111 deletions
diff --git a/fs/proc/base.c b/fs/proc/base.c index e74308bdabd..3d94906c7aa 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c @@ -53,6 +53,7 @@  #include <linux/time.h>  #include <linux/proc_fs.h>  #include <linux/stat.h> +#include <linux/task_io_accounting_ops.h>  #include <linux/init.h>  #include <linux/capability.h>  #include <linux/file.h> @@ -2402,44 +2403,17 @@ static int proc_base_fill_cache(struct file *filp, void *dirent,  #ifdef CONFIG_TASK_IO_ACCOUNTING  static int do_io_accounting(struct task_struct *task, char *buffer, int whole)  { -	u64 rchar, wchar, syscr, syscw; -	struct task_io_accounting ioac; - -	rchar = task->rchar; -	wchar = task->wchar; -	syscr = task->syscr; -	syscw = task->syscw; -	memcpy(&ioac, &task->ioac, sizeof(ioac)); - -	if (whole) { -		unsigned long flags; - -		if (lock_task_sighand(task, &flags)) { -			struct signal_struct *sig = task->signal; -			struct task_struct *t = task; +	struct proc_io_accounting acct = task->ioac; +	unsigned long flags; -			rchar += sig->rchar; -			wchar += sig->wchar; -			syscr += sig->syscr; -			syscw += sig->syscw; +	if (whole && lock_task_sighand(task, &flags)) { +		struct task_struct *t = task; -			ioac.read_bytes += sig->ioac.read_bytes; -			ioac.write_bytes += sig->ioac.write_bytes; -			ioac.cancelled_write_bytes += -					sig->ioac.cancelled_write_bytes; -			while_each_thread(task, t) { -				rchar += t->rchar; -				wchar += t->wchar; -				syscr += t->syscr; -				syscw += t->syscw; +		task_io_accounting_add(&acct, &task->signal->ioac); +		while_each_thread(task, t) +			task_io_accounting_add(&acct, &t->ioac); -				ioac.read_bytes += t->ioac.read_bytes; -				ioac.write_bytes += t->ioac.write_bytes; -				ioac.cancelled_write_bytes += -					t->ioac.cancelled_write_bytes; -			} -			unlock_task_sighand(task, &flags); -		} +		unlock_task_sighand(task, &flags);  	}  	return sprintf(buffer,  			"rchar: %llu\n" @@ -2449,9 +2423,10 @@ static int do_io_accounting(struct task_struct *task, char *buffer, int whole)  			"read_bytes: %llu\n"  			"write_bytes: %llu\n"  			"cancelled_write_bytes: %llu\n", -			rchar, wchar, syscr, syscw, -			ioac.read_bytes, ioac.write_bytes, -			ioac.cancelled_write_bytes); +			acct.chr.rchar, acct.chr.wchar, +			acct.chr.syscr, acct.chr.syscw, +			acct.blk.read_bytes, acct.blk.write_bytes, +			acct.blk.cancelled_write_bytes);  }  static int proc_tid_io_accounting(struct task_struct *task, char *buffer) diff --git a/include/linux/sched.h b/include/linux/sched.h index f59318a0099..034c1ca6b33 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -505,10 +505,7 @@ struct signal_struct {  	unsigned long nvcsw, nivcsw, cnvcsw, cnivcsw;  	unsigned long min_flt, maj_flt, cmin_flt, cmaj_flt;  	unsigned long inblock, oublock, cinblock, coublock; -#ifdef CONFIG_TASK_XACCT -	u64 rchar, wchar, syscr, syscw; -#endif -	struct task_io_accounting ioac; +	struct proc_io_accounting ioac;  	/*  	 * Cumulative ns of scheduled CPU time for dead threads in the @@ -1256,11 +1253,7 @@ struct task_struct {  	unsigned long ptrace_message;  	siginfo_t *last_siginfo; /* For ptrace use.  */ -#ifdef CONFIG_TASK_XACCT -/* i/o counters(bytes read/written, #syscalls */ -	u64 rchar, wchar, syscr, syscw; -#endif -	struct task_io_accounting ioac; +	struct proc_io_accounting ioac;  #if defined(CONFIG_TASK_XACCT)  	u64 acct_rss_mem1;	/* accumulated rss usage */  	u64 acct_vm_mem1;	/* accumulated virtual memory usage */ @@ -2190,22 +2183,22 @@ extern long sched_group_rt_period(struct task_group *tg);  #ifdef CONFIG_TASK_XACCT  static inline void add_rchar(struct task_struct *tsk, ssize_t amt)  { -	tsk->rchar += amt; +	tsk->ioac.chr.rchar += amt;  }  static inline void add_wchar(struct task_struct *tsk, ssize_t amt)  { -	tsk->wchar += amt; +	tsk->ioac.chr.wchar += amt;  }  static inline void inc_syscr(struct task_struct *tsk)  { -	tsk->syscr++; +	tsk->ioac.chr.syscr++;  }  static inline void inc_syscw(struct task_struct *tsk)  { -	tsk->syscw++; +	tsk->ioac.chr.syscw++;  }  #else  static inline void add_rchar(struct task_struct *tsk, ssize_t amt) diff --git a/include/linux/task_io_accounting.h b/include/linux/task_io_accounting.h index 44d00e9ccee..165390f8b93 100644 --- a/include/linux/task_io_accounting.h +++ b/include/linux/task_io_accounting.h @@ -1,5 +1,5 @@  /* - * task_io_accounting: a structure which is used for recording a single task's + * proc_io_accounting: a structure which is used for recording a single task's   * IO statistics.   *   * Don't include this header file directly - it is designed to be dragged in via @@ -8,6 +8,22 @@   * Blame akpm@osdl.org for all this.   */ +#ifdef CONFIG_TASK_XACCT +struct task_chr_io_accounting { +	/* bytes read */ +	u64 rchar; +	/*  bytes written */ +	u64 wchar; +	/* # of read syscalls */ +	u64 syscr; +	/* # of write syscalls */ +	u64 syscw; +}; +#else /* CONFIG_TASK_XACCT */ +struct task_chr_io_accounting { +}; +#endif /* CONFIG_TASK_XACCT */ +  #ifdef CONFIG_TASK_IO_ACCOUNTING  struct task_io_accounting {  	/* @@ -31,7 +47,12 @@ struct task_io_accounting {  	 */  	u64 cancelled_write_bytes;  }; -#else +#else /* CONFIG_TASK_IO_ACCOUNTING */  struct task_io_accounting {  }; -#endif +#endif /* CONFIG_TASK_IO_ACCOUNTING */ + +struct proc_io_accounting { +	struct task_chr_io_accounting chr; +	struct task_io_accounting blk; +}; diff --git a/include/linux/task_io_accounting_ops.h b/include/linux/task_io_accounting_ops.h index ff46c6fad79..e6f958ebe97 100644 --- a/include/linux/task_io_accounting_ops.h +++ b/include/linux/task_io_accounting_ops.h @@ -9,7 +9,7 @@  #ifdef CONFIG_TASK_IO_ACCOUNTING  static inline void task_io_account_read(size_t bytes)  { -	current->ioac.read_bytes += bytes; +	current->ioac.blk.read_bytes += bytes;  }  /* @@ -18,12 +18,12 @@ static inline void task_io_account_read(size_t bytes)   */  static inline unsigned long task_io_get_inblock(const struct task_struct *p)  { -	return p->ioac.read_bytes >> 9; +	return p->ioac.blk.read_bytes >> 9;  }  static inline void task_io_account_write(size_t bytes)  { -	current->ioac.write_bytes += bytes; +	current->ioac.blk.write_bytes += bytes;  }  /* @@ -32,17 +32,25 @@ static inline void task_io_account_write(size_t bytes)   */  static inline unsigned long task_io_get_oublock(const struct task_struct *p)  { -	return p->ioac.write_bytes >> 9; +	return p->ioac.blk.write_bytes >> 9;  }  static inline void task_io_account_cancelled_write(size_t bytes)  { -	current->ioac.cancelled_write_bytes += bytes; +	current->ioac.blk.cancelled_write_bytes += bytes;  } -static inline void task_io_accounting_init(struct task_struct *tsk) +static inline void task_io_accounting_init(struct proc_io_accounting *ioac)  { -	memset(&tsk->ioac, 0, sizeof(tsk->ioac)); +	memset(ioac, 0, sizeof(*ioac)); +} + +static inline void task_blk_io_accounting_add(struct proc_io_accounting *dst, +						struct proc_io_accounting *src) +{ +	dst->blk.read_bytes += src->blk.read_bytes; +	dst->blk.write_bytes += src->blk.write_bytes; +	dst->blk.cancelled_write_bytes += src->blk.cancelled_write_bytes;  }  #else @@ -69,9 +77,37 @@ static inline void task_io_account_cancelled_write(size_t bytes)  {  } -static inline void task_io_accounting_init(struct task_struct *tsk) +static inline void task_io_accounting_init(struct proc_io_accounting *ioac) +{ +} + +static inline void task_blk_io_accounting_add(struct proc_io_accounting *dst, +						struct proc_io_accounting *src)  {  } -#endif		/* CONFIG_TASK_IO_ACCOUNTING */ -#endif		/* __TASK_IO_ACCOUNTING_OPS_INCLUDED */ +#endif /* CONFIG_TASK_IO_ACCOUNTING */ + +#ifdef CONFIG_TASK_XACCT +static inline void task_chr_io_accounting_add(struct proc_io_accounting *dst, +						struct proc_io_accounting *src) +{ +	dst->chr.rchar += src->chr.rchar; +	dst->chr.wchar += src->chr.wchar; +	dst->chr.syscr += src->chr.syscr; +	dst->chr.syscw += src->chr.syscw; +} +#else +static inline void task_chr_io_accounting_add(struct proc_io_accounting *dst, +						struct proc_io_accounting *src) +{ +} +#endif /* CONFIG_TASK_XACCT */ + +static inline void task_io_accounting_add(struct proc_io_accounting *dst, +						struct proc_io_accounting *src) +{ +	task_chr_io_accounting_add(dst, src); +	task_blk_io_accounting_add(dst, src); +} +#endif /* __TASK_IO_ACCOUNTING_OPS_INCLUDED */ diff --git a/kernel/exit.c b/kernel/exit.c index 0caf590548a..eb4d6470d1d 100644 --- a/kernel/exit.c +++ b/kernel/exit.c @@ -121,18 +121,7 @@ static void __exit_signal(struct task_struct *tsk)  		sig->nivcsw += tsk->nivcsw;  		sig->inblock += task_io_get_inblock(tsk);  		sig->oublock += task_io_get_oublock(tsk); -#ifdef CONFIG_TASK_XACCT -		sig->rchar += tsk->rchar; -		sig->wchar += tsk->wchar; -		sig->syscr += tsk->syscr; -		sig->syscw += tsk->syscw; -#endif /* CONFIG_TASK_XACCT */ -#ifdef CONFIG_TASK_IO_ACCOUNTING -		sig->ioac.read_bytes += tsk->ioac.read_bytes; -		sig->ioac.write_bytes += tsk->ioac.write_bytes; -		sig->ioac.cancelled_write_bytes += -					tsk->ioac.cancelled_write_bytes; -#endif /* CONFIG_TASK_IO_ACCOUNTING */ +		task_io_accounting_add(&sig->ioac, &tsk->ioac);  		sig->sum_sched_runtime += tsk->se.sum_exec_runtime;  		sig = NULL; /* Marker for below. */  	} @@ -1363,21 +1352,8 @@ static int wait_task_zombie(struct task_struct *p, int options,  		psig->coublock +=  			task_io_get_oublock(p) +  			sig->oublock + sig->coublock; -#ifdef CONFIG_TASK_XACCT -		psig->rchar += p->rchar + sig->rchar; -		psig->wchar += p->wchar + sig->wchar; -		psig->syscr += p->syscr + sig->syscr; -		psig->syscw += p->syscw + sig->syscw; -#endif /* CONFIG_TASK_XACCT */ -#ifdef CONFIG_TASK_IO_ACCOUNTING -		psig->ioac.read_bytes += -			p->ioac.read_bytes + sig->ioac.read_bytes; -		psig->ioac.write_bytes += -			p->ioac.write_bytes + sig->ioac.write_bytes; -		psig->ioac.cancelled_write_bytes += -				p->ioac.cancelled_write_bytes + -				sig->ioac.cancelled_write_bytes; -#endif /* CONFIG_TASK_IO_ACCOUNTING */ +		task_io_accounting_add(&psig->ioac, &p->ioac); +		task_io_accounting_add(&psig->ioac, &sig->ioac);  		spin_unlock_irq(&p->parent->sighand->siglock);  	} diff --git a/kernel/fork.c b/kernel/fork.c index 5e050c1317c..8214ba7c8bb 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -806,12 +806,7 @@ static int copy_signal(unsigned long clone_flags, struct task_struct *tsk)  	sig->nvcsw = sig->nivcsw = sig->cnvcsw = sig->cnivcsw = 0;  	sig->min_flt = sig->maj_flt = sig->cmin_flt = sig->cmaj_flt = 0;  	sig->inblock = sig->oublock = sig->cinblock = sig->coublock = 0; -#ifdef CONFIG_TASK_XACCT -	sig->rchar = sig->wchar = sig->syscr = sig->syscw = 0; -#endif -#ifdef CONFIG_TASK_IO_ACCOUNTING -	memset(&sig->ioac, 0, sizeof(sig->ioac)); -#endif +	task_io_accounting_init(&sig->ioac);  	sig->sum_sched_runtime = 0;  	INIT_LIST_HEAD(&sig->cpu_timers[0]);  	INIT_LIST_HEAD(&sig->cpu_timers[1]); @@ -994,13 +989,7 @@ static struct task_struct *copy_process(unsigned long clone_flags,  	p->last_switch_timestamp = 0;  #endif -#ifdef CONFIG_TASK_XACCT -	p->rchar = 0;		/* I/O counter: bytes read */ -	p->wchar = 0;		/* I/O counter: bytes written */ -	p->syscr = 0;		/* I/O counter: read syscalls */ -	p->syscw = 0;		/* I/O counter: write syscalls */ -#endif -	task_io_accounting_init(p); +	task_io_accounting_init(&p->ioac);  	acct_clear_integrals(p);  	p->it_virt_expires = cputime_zero; diff --git a/kernel/tsacct.c b/kernel/tsacct.c index 3da47ccdc5e..f9cd2561689 100644 --- a/kernel/tsacct.c +++ b/kernel/tsacct.c @@ -94,14 +94,14 @@ void xacct_add_tsk(struct taskstats *stats, struct task_struct *p)  		stats->hiwater_vm    = mm->hiwater_vm * PAGE_SIZE / KB;  		mmput(mm);  	} -	stats->read_char	= p->rchar; -	stats->write_char	= p->wchar; -	stats->read_syscalls	= p->syscr; -	stats->write_syscalls	= p->syscw; +	stats->read_char	= p->ioac.chr.rchar; +	stats->write_char	= p->ioac.chr.wchar; +	stats->read_syscalls	= p->ioac.chr.syscr; +	stats->write_syscalls	= p->ioac.chr.syscw;  #ifdef CONFIG_TASK_IO_ACCOUNTING -	stats->read_bytes	= p->ioac.read_bytes; -	stats->write_bytes	= p->ioac.write_bytes; -	stats->cancelled_write_bytes = p->ioac.cancelled_write_bytes; +	stats->read_bytes	= p->ioac.blk.read_bytes; +	stats->write_bytes	= p->ioac.blk.write_bytes; +	stats->cancelled_write_bytes = p->ioac.blk.cancelled_write_bytes;  #else  	stats->read_bytes	= 0;  	stats->write_bytes	= 0;  |