Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 47627
b: refs/heads/master
c: 4b98d11
h: refs/heads/master
i:
  47625: 9d342a8
  47623: 2158a61
v: v3
  • Loading branch information
Alexey Dobriyan authored and Linus Torvalds committed Feb 11, 2007
1 parent 7deaf18 commit 0f92a9f
Show file tree
Hide file tree
Showing 5 changed files with 59 additions and 13 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 18f705f49a5b19206233f7cef8f869ce7291f8c8
refs/heads/master: 4b98d11b40f03382918796f3c5c936d5495d20a4
4 changes: 4 additions & 0 deletions trunk/fs/proc/base.c
Original file line number Diff line number Diff line change
Expand Up @@ -1810,17 +1810,21 @@ static int proc_base_fill_cache(struct file *filp, void *dirent, filldir_t filld
static int proc_pid_io_accounting(struct task_struct *task, char *buffer)
{
return sprintf(buffer,
#ifdef CONFIG_TASK_XACCT
"rchar: %llu\n"
"wchar: %llu\n"
"syscr: %llu\n"
"syscw: %llu\n"
#endif
"read_bytes: %llu\n"
"write_bytes: %llu\n"
"cancelled_write_bytes: %llu\n",
#ifdef CONFIG_TASK_XACCT
(unsigned long long)task->rchar,
(unsigned long long)task->wchar,
(unsigned long long)task->syscr,
(unsigned long long)task->syscw,
#endif
(unsigned long long)task->ioac.read_bytes,
(unsigned long long)task->ioac.write_bytes,
(unsigned long long)task->ioac.cancelled_write_bytes);
Expand Down
24 changes: 12 additions & 12 deletions trunk/fs/read_write.c
Original file line number Diff line number Diff line change
Expand Up @@ -274,9 +274,9 @@ ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos)
ret = do_sync_read(file, buf, count, pos);
if (ret > 0) {
fsnotify_access(file->f_path.dentry);
current->rchar += ret;
add_rchar(current, ret);
}
current->syscr++;
inc_syscr(current);
}
}

Expand Down Expand Up @@ -332,9 +332,9 @@ ssize_t vfs_write(struct file *file, const char __user *buf, size_t count, loff_
ret = do_sync_write(file, buf, count, pos);
if (ret > 0) {
fsnotify_modify(file->f_path.dentry);
current->wchar += ret;
add_wchar(current, ret);
}
current->syscw++;
inc_syscw(current);
}
}

Expand Down Expand Up @@ -675,8 +675,8 @@ sys_readv(unsigned long fd, const struct iovec __user *vec, unsigned long vlen)
}

if (ret > 0)
current->rchar += ret;
current->syscr++;
add_rchar(current, ret);
inc_syscr(current);
return ret;
}

Expand All @@ -696,8 +696,8 @@ sys_writev(unsigned long fd, const struct iovec __user *vec, unsigned long vlen)
}

if (ret > 0)
current->wchar += ret;
current->syscw++;
add_wchar(current, ret);
inc_syscw(current);
return ret;
}

Expand Down Expand Up @@ -779,12 +779,12 @@ static ssize_t do_sendfile(int out_fd, int in_fd, loff_t *ppos,
retval = in_file->f_op->sendfile(in_file, ppos, count, file_send_actor, out_file);

if (retval > 0) {
current->rchar += retval;
current->wchar += retval;
add_rchar(current, retval);
add_wchar(current, retval);
}
current->syscr++;
current->syscw++;

inc_syscr(current);
inc_syscw(current);
if (*ppos > max)
retval = -EOVERFLOW;

Expand Down
40 changes: 40 additions & 0 deletions trunk/include/linux/sched.h
Original file line number Diff line number Diff line change
Expand Up @@ -1013,8 +1013,10 @@ struct task_struct {
* to a stack based synchronous wait) if its doing sync IO.
*/
wait_queue_t *io_wait;
#ifdef CONFIG_TASK_XACCT
/* i/o counters(bytes read/written, #syscalls */
u64 rchar, wchar, syscr, syscw;
#endif
struct task_io_accounting ioac;
#if defined(CONFIG_TASK_XACCT)
u64 acct_rss_mem1; /* accumulated rss usage */
Expand Down Expand Up @@ -1649,6 +1651,44 @@ extern int sched_create_sysfs_power_savings_entries(struct sysdev_class *cls);

extern void normalize_rt_tasks(void);

#ifdef CONFIG_TASK_XACCT
static inline void add_rchar(struct task_struct *tsk, ssize_t amt)
{
tsk->rchar += amt;
}

static inline void add_wchar(struct task_struct *tsk, ssize_t amt)
{
tsk->wchar += amt;
}

static inline void inc_syscr(struct task_struct *tsk)
{
tsk->syscr++;
}

static inline void inc_syscw(struct task_struct *tsk)
{
tsk->syscw++;
}
#else
static inline void add_rchar(struct task_struct *tsk, ssize_t amt)
{
}

static inline void add_wchar(struct task_struct *tsk, ssize_t amt)
{
}

static inline void inc_syscr(struct task_struct *tsk)
{
}

static inline void inc_syscw(struct task_struct *tsk)
{
}
#endif

#endif /* __KERNEL__ */

#endif
2 changes: 2 additions & 0 deletions trunk/kernel/fork.c
Original file line number Diff line number Diff line change
Expand Up @@ -1038,10 +1038,12 @@ static struct task_struct *copy_process(unsigned long clone_flags,
p->utime = cputime_zero;
p->stime = cputime_zero;
p->sched_time = 0;
#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);
acct_clear_integrals(p);

Expand Down

0 comments on commit 0f92a9f

Please sign in to comment.