6eaeeaba39
If CONFIG_TASK_IO_ACCOUNTING is defined, we update io accounting counters for each task. This patch permits reporting of values using the well known getrusage() syscall, filling ru_inblock and ru_oublock instead of null values. As TASK_IO_ACCOUNTING currently counts bytes counts, we approximate blocks count doing : nr_blocks = nr_bytes / 512 Example of use : ---------------------- After patch is applied, /usr/bin/time command can now give a good approximation of IO that the process had to do. $ /usr/bin/time grep tototo /usr/include/* Command exited with non-zero status 1 0.00user 0.02system 0:02.11elapsed 1%CPU (0avgtext+0avgdata 0maxresident)k 24288inputs+0outputs (0major+259minor)pagefaults 0swaps $ /usr/bin/time dd if=/dev/zero of=/tmp/testfile count=1000 1000+0 enregistrements lus 1000+0 enregistrements écrits 512000 octets (512 kB) copiés, 0,00326601 seconde, 157 MB/s 0.00user 0.00system 0:00.00elapsed 80%CPU (0avgtext+0avgdata 0maxresident)k 0inputs+3000outputs (0major+299minor)pagefaults 0swaps Signed-off-by: Eric Dumazet <dada1@cosmosbay.com> Cc: Oleg Nesterov <oleg@tv-sign.ru> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
75 lines
1.5 KiB
C
75 lines
1.5 KiB
C
/*
|
|
* Task I/O accounting operations
|
|
*/
|
|
#ifndef __TASK_IO_ACCOUNTING_OPS_INCLUDED
|
|
#define __TASK_IO_ACCOUNTING_OPS_INCLUDED
|
|
|
|
#ifdef CONFIG_TASK_IO_ACCOUNTING
|
|
static inline void task_io_account_read(size_t bytes)
|
|
{
|
|
current->ioac.read_bytes += bytes;
|
|
}
|
|
|
|
/*
|
|
* We approximate number of blocks, because we account bytes only.
|
|
* A 'block' is 512 bytes
|
|
*/
|
|
static inline unsigned long task_io_get_inblock(const struct task_struct *p)
|
|
{
|
|
return p->ioac.read_bytes >> 9;
|
|
}
|
|
|
|
static inline void task_io_account_write(size_t bytes)
|
|
{
|
|
current->ioac.write_bytes += bytes;
|
|
}
|
|
|
|
/*
|
|
* We approximate number of blocks, because we account bytes only.
|
|
* A 'block' is 512 bytes
|
|
*/
|
|
static inline unsigned long task_io_get_oublock(const struct task_struct *p)
|
|
{
|
|
return p->ioac.write_bytes >> 9;
|
|
}
|
|
|
|
static inline void task_io_account_cancelled_write(size_t bytes)
|
|
{
|
|
current->ioac.cancelled_write_bytes += bytes;
|
|
}
|
|
|
|
static inline void task_io_accounting_init(struct task_struct *tsk)
|
|
{
|
|
memset(&tsk->ioac, 0, sizeof(tsk->ioac));
|
|
}
|
|
|
|
#else
|
|
|
|
static inline void task_io_account_read(size_t bytes)
|
|
{
|
|
}
|
|
|
|
static inline unsigned long task_io_get_inblock(const struct task_struct *p)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static inline void task_io_account_write(size_t bytes)
|
|
{
|
|
}
|
|
|
|
static inline unsigned long task_io_get_oublock(const struct task_struct *p)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static inline void task_io_account_cancelled_write(size_t bytes)
|
|
{
|
|
}
|
|
|
|
static inline void task_io_accounting_init(struct task_struct *tsk)
|
|
{
|
|
}
|
|
|
|
#endif /* CONFIG_TASK_IO_ACCOUNTING */
|
|
#endif /* __TASK_IO_ACCOUNTING_OPS_INCLUDED */
|