Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 106027
b: refs/heads/master
c: 297c5d9
h: refs/heads/master
i:
  106025: f6ac5f3
  106023: 0890c71
v: v3
  • Loading branch information
Andrea Righi authored and Linus Torvalds committed Jul 25, 2008
1 parent 5241b6d commit b1a7335
Show file tree
Hide file tree
Showing 5 changed files with 109 additions and 16 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: 0c18d7a5df82524e634637c3aec24d4cba096442
refs/heads/master: 297c5d92634c809cef23d73e7b2556f2528ff7e2
86 changes: 71 additions & 15 deletions trunk/fs/proc/base.c
Original file line number Diff line number Diff line change
Expand Up @@ -2376,29 +2376,82 @@ static int proc_base_fill_cache(struct file *filp, void *dirent,
}

#ifdef CONFIG_TASK_IO_ACCOUNTING
static int proc_pid_io_accounting(struct task_struct *task, char *buffer)
{
static int do_io_accounting(struct task_struct *task, char *buffer, int whole)
{
u64 rchar, wchar, syscr, syscw;
struct task_io_accounting ioac;

if (!whole) {
rchar = task->rchar;
wchar = task->wchar;
syscr = task->syscr;
syscw = task->syscw;
memcpy(&ioac, &task->ioac, sizeof(ioac));
} else {
unsigned long flags;
struct task_struct *t = task;
rchar = wchar = syscr = syscw = 0;
memset(&ioac, 0, sizeof(ioac));

rcu_read_lock();
do {
rchar += t->rchar;
wchar += t->wchar;
syscr += t->syscr;
syscw += t->syscw;

ioac.read_bytes += t->ioac.read_bytes;
ioac.write_bytes += t->ioac.write_bytes;
ioac.cancelled_write_bytes +=
t->ioac.cancelled_write_bytes;
t = next_thread(t);
} while (t != task);
rcu_read_unlock();

if (lock_task_sighand(task, &flags)) {
struct signal_struct *sig = task->signal;

rchar += sig->rchar;
wchar += sig->wchar;
syscr += sig->syscr;
syscw += sig->syscw;

ioac.read_bytes += sig->ioac.read_bytes;
ioac.write_bytes += sig->ioac.write_bytes;
ioac.cancelled_write_bytes +=
sig->ioac.cancelled_write_bytes;

unlock_task_sighand(task, &flags);
}
}

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);
(unsigned long long)rchar,
(unsigned long long)wchar,
(unsigned long long)syscr,
(unsigned long long)syscw,
(unsigned long long)ioac.read_bytes,
(unsigned long long)ioac.write_bytes,
(unsigned long long)ioac.cancelled_write_bytes);
}

static int proc_tid_io_accounting(struct task_struct *task, char *buffer)
{
return do_io_accounting(task, buffer, 0);
}
#endif

static int proc_tgid_io_accounting(struct task_struct *task, char *buffer)
{
return do_io_accounting(task, buffer, 1);
}
#endif /* CONFIG_TASK_IO_ACCOUNTING */

/*
* Thread groups
Expand Down Expand Up @@ -2470,7 +2523,7 @@ static const struct pid_entry tgid_base_stuff[] = {
REG("coredump_filter", S_IRUGO|S_IWUSR, coredump_filter),
#endif
#ifdef CONFIG_TASK_IO_ACCOUNTING
INF("io", S_IRUGO, pid_io_accounting),
INF("io", S_IRUGO, tgid_io_accounting),
#endif
};

Expand Down Expand Up @@ -2797,6 +2850,9 @@ static const struct pid_entry tid_base_stuff[] = {
#ifdef CONFIG_FAULT_INJECTION
REG("make-it-fail", S_IRUGO|S_IWUSR, fault_inject),
#endif
#ifdef CONFIG_TASK_IO_ACCOUNTING
INF("io", S_IRUGO, tid_io_accounting),
#endif
};

static int proc_tid_base_readdir(struct file * filp,
Expand Down
4 changes: 4 additions & 0 deletions trunk/include/linux/sched.h
Original file line number Diff line number Diff line change
Expand Up @@ -506,6 +506,10 @@ 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;

/*
* Cumulative ns of scheduled CPU time for dead threads in the
Expand Down
27 changes: 27 additions & 0 deletions trunk/kernel/exit.c
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,18 @@ 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 */
sig->sum_sched_runtime += tsk->se.sum_exec_runtime;
sig = NULL; /* Marker for below. */
}
Expand Down Expand Up @@ -1366,6 +1378,21 @@ 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 */
spin_unlock_irq(&p->parent->sighand->siglock);
}

Expand Down
6 changes: 6 additions & 0 deletions trunk/kernel/fork.c
Original file line number Diff line number Diff line change
Expand Up @@ -812,6 +812,12 @@ 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
sig->sum_sched_runtime = 0;
INIT_LIST_HEAD(&sig->cpu_timers[0]);
INIT_LIST_HEAD(&sig->cpu_timers[1]);
Expand Down

0 comments on commit b1a7335

Please sign in to comment.