Delay accounting: Block I/O delays
Subsystems (2)
PATCH 2/4 Delay accounting: Block I/O delays
delayacct-blkio.patch
Record time spent by a task waiting to queue and complete block I/O.
Signed-off-by Shailabh Nagar <[email protected]>
include/linux/delayacct.h | 16 +++++++++++++++- include/linux/sched.h | 2 ++ kernel/sched.c | 7 +++++++ 3 files changed, 24 insertions(+), 1 deletion(-)
include/linux/delayacct.h +15 -1
@@ -43,6 +43,19 @@ static inline void delayacct_timestamp(u#define test_ts_integrity (start_ts, end_ts) (1)#endif +static inline void delayacct_blkio (unsigned long long ts) +{ +unsigned long long now =sched_clock (); + +if (!test_ts_integrity (ts, now)) +return ; + +spin_lock (¤t->delays.lock); + current->delays.blkio_delay += now - ts; + current->delays.blkio_count++; +spin_unlock (¤t->delays.lock); +} +#else static inline void delayacct_init (struct task_struct *tsk)
@@ -50,7 +63,8 @@ static inline void delayacct_init(struct#define delayacct_def_var (ts)static inline void delayacct_timestamp (unsigned long long *ts) {} - +static inline void delayacct_blkio (unsigned long long ts) +{}#endif /* CONFIG_DELAY_ACCT */
include/linux/sched.h +2 -0
@@ -502,6 +502,8 @@ struct task_delay_info {spinlock_t lock;/* Add stats in pairs: uint64_t delay, uint32_t count */ +uint64_t blkio_delay;/* wait for block io completion */ + uint32_t blkio_count; };#endif
kernel/sched.c +7 -0
@@ -47,6 +47,7 @@#include <linux/syscalls.h> #include <linux/times.h> #include <linux/acct.h> +#include <linux/delayacct.h> #include <asm/tlb.h> #include <asm/unistd.h>
@@ -4083,10 +4084,13 @@ EXPORT_SYMBOL(yield); void __sched io_schedule(void) {struct runqueue *rq = &per_cpu (runqueues,raw_smp_processor_id ()); +delayacct_def_var (ts); +delayacct_timestamp (&ts);atomic_inc (&rq->nr_iowait);schedule ();atomic_dec (&rq->nr_iowait); +delayacct_blkio (ts); }EXPORT_SYMBOL (io_schedule);
@@ -4095,10 +4099,13 @@ long __sched io_schedule_timeout(long ti {struct runqueue *rq = &per_cpu (runqueues,raw_smp_processor_id ());long ret; +delayacct_def_var (ts); +delayacct_timestamp (&ts);atomic_inc (&rq->nr_iowait); ret =schedule_timeout (timeout);atomic_dec (&rq->nr_iowait); +delayacct_blkio (ts);return ret; }