Author: Vladimir Davydov Email: [email protected] Subject: sched: do not account iothrottled tasks in loadavg Date: Mon, 22 Oct 2012 14:27:25 +0400
Changes from v1: * do not account tasks throttled while doing reclaim too Signed-off-by: Vladimir Davydov <[email protected]> Acked-by: Konstantin Khlebnikov <[email protected]> ============================================================================= Related to https://jira.sw.ru/browse/PSBM-33642 Signed-off-by: Vladimir Davydov <[email protected]> --- include/linux/sched.h | 3 +++ kernel/sched/core.c | 7 +++++++ kernel/sched/sched.h | 1 + kernel/ve/vziolimit.c | 3 ++- 4 files changed, 13 insertions(+), 1 deletion(-) diff --git a/include/linux/sched.h b/include/linux/sched.h index 2871013e89b9..e62dc2b6c2d3 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -167,6 +167,8 @@ print_cfs_rq(struct seq_file *m, int cpu, struct cfs_rq *cfs_rq); #define TASK_PARKED 512 #define TASK_STATE_MAX 1024 +#define __TASK_IOTHROTTLED 1024 + #define TASK_STATE_TO_CHAR_STR "RSDTtZXxKWP" extern char ___assert_task_state[1 - 2*!!( @@ -194,6 +196,7 @@ extern char ___assert_task_state[1 - 2*!!( #define task_contributes_to_load(task) \ ((task->state & TASK_UNINTERRUPTIBLE) != 0 && \ (task->flags & PF_FROZEN) == 0) +#define task_iothrottled(task) ((task->state & __TASK_IOTHROTTLED) != 0) #define __set_task_state(tsk, state_value) \ do { (tsk)->state = (state_value); } while (0) diff --git a/kernel/sched/core.c b/kernel/sched/core.c index c6a5ab063f6a..4e6254b641a6 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -870,6 +870,8 @@ void activate_task(struct rq *rq, struct task_struct *p, int flags) { if (task_contributes_to_load(p)) { rq->nr_uninterruptible--; + if (task_iothrottled(p)) + rq->nr_iothrottled--; task_cfs_rq(p)->nr_unint--; } @@ -890,6 +892,8 @@ void deactivate_task(struct rq *rq, struct task_struct *p, int flags) if (task_contributes_to_load(p)) { rq->nr_uninterruptible++; + if (task_iothrottled(p)) + rq->nr_iothrottled++; task_cfs_rq(p)->nr_unint++; } @@ -1567,6 +1571,8 @@ ttwu_do_activate(struct rq *rq, struct task_struct *p, int wake_flags) #ifdef CONFIG_SMP if (p->sched_contributes_to_load) { rq->nr_uninterruptible--; + if (task_iothrottled(p)) + rq->nr_iothrottled--; task_cfs_rq(p)->nr_unint--; } #endif @@ -2432,6 +2438,7 @@ static long calc_load_fold_active(struct rq *this_rq) nr_active = this_rq->nr_running; nr_active += (long) this_rq->nr_uninterruptible; + nr_active -= (long) this_rq->nr_iothrottled; if (nr_active != this_rq->calc_load_active) { delta = nr_active - this_rq->calc_load_active; diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h index 555c57ef8024..d4053c649279 100644 --- a/kernel/sched/sched.h +++ b/kernel/sched/sched.h @@ -479,6 +479,7 @@ struct rq { * it on another CPU. Always updated under the runqueue lock: */ unsigned long nr_uninterruptible; + unsigned long nr_iothrottled; unsigned long nr_sleeping; unsigned long nr_stopped; diff --git a/kernel/ve/vziolimit.c b/kernel/ve/vziolimit.c index fc8b24a00ffd..1da233d2f89d 100644 --- a/kernel/ve/vziolimit.c +++ b/kernel/ve/vziolimit.c @@ -110,7 +110,8 @@ static void iolimit_wait(struct iolimit *iolimit, unsigned long timeout) DEFINE_WAIT(wait); do { - prepare_to_wait(&iolimit->wq, &wait, TASK_KILLABLE); + prepare_to_wait(&iolimit->wq, &wait, + TASK_KILLABLE | __TASK_IOTHROTTLED); timeout = schedule_timeout(timeout); if (fatal_signal_pending(current)) break; -- 2.1.4 _______________________________________________ Devel mailing list [email protected] https://lists.openvz.org/mailman/listinfo/devel
