diff options
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/sched.c | 4 | ||||
-rw-r--r-- | kernel/sched_debug.c | 4 | ||||
-rw-r--r-- | kernel/sched_fair.c | 5 |
3 files changed, 13 insertions, 0 deletions
diff --git a/kernel/sched.c b/kernel/sched.c index 6244d24cafc1..38d05a89e0f2 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
@@ -6754,7 +6754,9 @@ void __sched io_schedule(void) | |||
6754 | 6754 | ||
6755 | delayacct_blkio_start(); | 6755 | delayacct_blkio_start(); |
6756 | atomic_inc(&rq->nr_iowait); | 6756 | atomic_inc(&rq->nr_iowait); |
6757 | current->in_iowait = 1; | ||
6757 | schedule(); | 6758 | schedule(); |
6759 | current->in_iowait = 0; | ||
6758 | atomic_dec(&rq->nr_iowait); | 6760 | atomic_dec(&rq->nr_iowait); |
6759 | delayacct_blkio_end(); | 6761 | delayacct_blkio_end(); |
6760 | } | 6762 | } |
@@ -6767,7 +6769,9 @@ long __sched io_schedule_timeout(long timeout) | |||
6767 | 6769 | ||
6768 | delayacct_blkio_start(); | 6770 | delayacct_blkio_start(); |
6769 | atomic_inc(&rq->nr_iowait); | 6771 | atomic_inc(&rq->nr_iowait); |
6772 | current->in_iowait = 1; | ||
6770 | ret = schedule_timeout(timeout); | 6773 | ret = schedule_timeout(timeout); |
6774 | current->in_iowait = 0; | ||
6771 | atomic_dec(&rq->nr_iowait); | 6775 | atomic_dec(&rq->nr_iowait); |
6772 | delayacct_blkio_end(); | 6776 | delayacct_blkio_end(); |
6773 | return ret; | 6777 | return ret; |
diff --git a/kernel/sched_debug.c b/kernel/sched_debug.c index 70c7e0b79946..5ddbd0891267 100644 --- a/kernel/sched_debug.c +++ b/kernel/sched_debug.c | |||
@@ -409,6 +409,8 @@ void proc_sched_show_task(struct task_struct *p, struct seq_file *m) | |||
409 | PN(se.wait_max); | 409 | PN(se.wait_max); |
410 | PN(se.wait_sum); | 410 | PN(se.wait_sum); |
411 | P(se.wait_count); | 411 | P(se.wait_count); |
412 | PN(se.iowait_sum); | ||
413 | P(se.iowait_count); | ||
412 | P(sched_info.bkl_count); | 414 | P(sched_info.bkl_count); |
413 | P(se.nr_migrations); | 415 | P(se.nr_migrations); |
414 | P(se.nr_migrations_cold); | 416 | P(se.nr_migrations_cold); |
@@ -479,6 +481,8 @@ void proc_sched_set_task(struct task_struct *p) | |||
479 | p->se.wait_max = 0; | 481 | p->se.wait_max = 0; |
480 | p->se.wait_sum = 0; | 482 | p->se.wait_sum = 0; |
481 | p->se.wait_count = 0; | 483 | p->se.wait_count = 0; |
484 | p->se.iowait_sum = 0; | ||
485 | p->se.iowait_count = 0; | ||
482 | p->se.sleep_max = 0; | 486 | p->se.sleep_max = 0; |
483 | p->se.sum_sleep_runtime = 0; | 487 | p->se.sum_sleep_runtime = 0; |
484 | p->se.block_max = 0; | 488 | p->se.block_max = 0; |
diff --git a/kernel/sched_fair.c b/kernel/sched_fair.c index 342000b31ad6..471fa281f5e0 100644 --- a/kernel/sched_fair.c +++ b/kernel/sched_fair.c | |||
@@ -652,6 +652,11 @@ static void enqueue_sleeper(struct cfs_rq *cfs_rq, struct sched_entity *se) | |||
652 | se->sum_sleep_runtime += delta; | 652 | se->sum_sleep_runtime += delta; |
653 | 653 | ||
654 | if (tsk) { | 654 | if (tsk) { |
655 | if (tsk->in_iowait) { | ||
656 | se->iowait_sum += delta; | ||
657 | se->iowait_count++; | ||
658 | } | ||
659 | |||
655 | /* | 660 | /* |
656 | * Blocking time is in units of nanosecs, so shift by | 661 | * Blocking time is in units of nanosecs, so shift by |
657 | * 20 to get a milliseconds-range estimation of the | 662 | * 20 to get a milliseconds-range estimation of the |