diff options
Diffstat (limited to 'fs/proc/base.c')
-rw-r--r-- | fs/proc/base.c | 57 |
1 files changed, 16 insertions, 41 deletions
diff --git a/fs/proc/base.c b/fs/proc/base.c index e74308bdabd3..3d94906c7aa8 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c | |||
@@ -53,6 +53,7 @@ | |||
53 | #include <linux/time.h> | 53 | #include <linux/time.h> |
54 | #include <linux/proc_fs.h> | 54 | #include <linux/proc_fs.h> |
55 | #include <linux/stat.h> | 55 | #include <linux/stat.h> |
56 | #include <linux/task_io_accounting_ops.h> | ||
56 | #include <linux/init.h> | 57 | #include <linux/init.h> |
57 | #include <linux/capability.h> | 58 | #include <linux/capability.h> |
58 | #include <linux/file.h> | 59 | #include <linux/file.h> |
@@ -2402,44 +2403,17 @@ static int proc_base_fill_cache(struct file *filp, void *dirent, | |||
2402 | #ifdef CONFIG_TASK_IO_ACCOUNTING | 2403 | #ifdef CONFIG_TASK_IO_ACCOUNTING |
2403 | static int do_io_accounting(struct task_struct *task, char *buffer, int whole) | 2404 | static int do_io_accounting(struct task_struct *task, char *buffer, int whole) |
2404 | { | 2405 | { |
2405 | u64 rchar, wchar, syscr, syscw; | 2406 | struct proc_io_accounting acct = task->ioac; |
2406 | struct task_io_accounting ioac; | 2407 | unsigned long flags; |
2407 | 2408 | ||
2408 | rchar = task->rchar; | 2409 | if (whole && lock_task_sighand(task, &flags)) { |
2409 | wchar = task->wchar; | 2410 | struct task_struct *t = task; |
2410 | syscr = task->syscr; | 2411 | |
2411 | syscw = task->syscw; | 2412 | task_io_accounting_add(&acct, &task->signal->ioac); |
2412 | memcpy(&ioac, &task->ioac, sizeof(ioac)); | 2413 | while_each_thread(task, t) |
2413 | 2414 | task_io_accounting_add(&acct, &t->ioac); | |
2414 | if (whole) { | 2415 | |
2415 | unsigned long flags; | 2416 | unlock_task_sighand(task, &flags); |
2416 | |||
2417 | if (lock_task_sighand(task, &flags)) { | ||
2418 | struct signal_struct *sig = task->signal; | ||
2419 | struct task_struct *t = task; | ||
2420 | |||
2421 | rchar += sig->rchar; | ||
2422 | wchar += sig->wchar; | ||
2423 | syscr += sig->syscr; | ||
2424 | syscw += sig->syscw; | ||
2425 | |||
2426 | ioac.read_bytes += sig->ioac.read_bytes; | ||
2427 | ioac.write_bytes += sig->ioac.write_bytes; | ||
2428 | ioac.cancelled_write_bytes += | ||
2429 | sig->ioac.cancelled_write_bytes; | ||
2430 | while_each_thread(task, t) { | ||
2431 | rchar += t->rchar; | ||
2432 | wchar += t->wchar; | ||
2433 | syscr += t->syscr; | ||
2434 | syscw += t->syscw; | ||
2435 | |||
2436 | ioac.read_bytes += t->ioac.read_bytes; | ||
2437 | ioac.write_bytes += t->ioac.write_bytes; | ||
2438 | ioac.cancelled_write_bytes += | ||
2439 | t->ioac.cancelled_write_bytes; | ||
2440 | } | ||
2441 | unlock_task_sighand(task, &flags); | ||
2442 | } | ||
2443 | } | 2417 | } |
2444 | return sprintf(buffer, | 2418 | return sprintf(buffer, |
2445 | "rchar: %llu\n" | 2419 | "rchar: %llu\n" |
@@ -2449,9 +2423,10 @@ static int do_io_accounting(struct task_struct *task, char *buffer, int whole) | |||
2449 | "read_bytes: %llu\n" | 2423 | "read_bytes: %llu\n" |
2450 | "write_bytes: %llu\n" | 2424 | "write_bytes: %llu\n" |
2451 | "cancelled_write_bytes: %llu\n", | 2425 | "cancelled_write_bytes: %llu\n", |
2452 | rchar, wchar, syscr, syscw, | 2426 | acct.chr.rchar, acct.chr.wchar, |
2453 | ioac.read_bytes, ioac.write_bytes, | 2427 | acct.chr.syscr, acct.chr.syscw, |
2454 | ioac.cancelled_write_bytes); | 2428 | acct.blk.read_bytes, acct.blk.write_bytes, |
2429 | acct.blk.cancelled_write_bytes); | ||
2455 | } | 2430 | } |
2456 | 2431 | ||
2457 | static int proc_tid_io_accounting(struct task_struct *task, char *buffer) | 2432 | static int proc_tid_io_accounting(struct task_struct *task, char *buffer) |