From 1607a485584827c3dfa4696d8e868d74a9bac503 Mon Sep 17 00:00:00 2001 From: Yihao Wu Date: Tue, 26 May 2020 16:43:06 +0800 Subject: [PATCH 1015/2944] alinux: sched: Fix regression caused by nr_uninterruptible fix #27788368 per cgroup nr_uninterruptible tracking leads to huge performance regression of hackbench. This patch delete nr_uninterruptible related code for now, to address performance regression issue. Fixes: 9410d3142882 ("alinux: cpuacct: Export nr_running & nr_uninterruptible") Fixes: 36da4fe9851a ("alinux: sched: Maintain "nr_uninterruptible" in runqueue") Signed-off-by: Yihao Wu Acked-by: Shanpei Chen --- kernel/sched/core.c | 28 ++------------ kernel/sched/cpuacct.c | 99 -------------------------------------------------- kernel/sched/fair.c | 11 ------ kernel/sched/rt.c | 14 ------- kernel/sched/sched.h | 6 --- 5 files changed, 3 insertions(+), 155 deletions(-) diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 6b3e019..7dd963d 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -744,28 +744,18 @@ static inline void dequeue_task(struct rq *rq, struct task_struct *p, int flags) p->sched_class->dequeue_task(rq, p, flags); } -static void update_nr_uninterruptible(struct task_struct *tsk, long inc) -{ - if (tsk->sched_class->update_nr_uninterruptible) - tsk->sched_class->update_nr_uninterruptible(tsk, inc); -} - void activate_task(struct rq *rq, struct task_struct *p, int flags) { - if (task_contributes_to_load(p)) { - update_nr_uninterruptible(p, -1); + if (task_contributes_to_load(p)) rq->nr_uninterruptible--; - } enqueue_task(rq, p, flags); } void deactivate_task(struct rq *rq, struct task_struct *p, int flags) { - if (task_contributes_to_load(p)) { - update_nr_uninterruptible(p, 1); + if (task_contributes_to_load(p)) rq->nr_uninterruptible++; - } dequeue_task(rq, p, flags); } @@ -1700,10 +1690,8 @@ static void ttwu_do_wakeup(struct rq *rq, struct task_struct *p, int wake_flags, lockdep_assert_held(&rq->lock); #ifdef CONFIG_SMP - if (p->sched_contributes_to_load) { - update_nr_uninterruptible(p, -1); + if (p->sched_contributes_to_load) rq->nr_uninterruptible--; - } if (wake_flags & WF_MIGRATED) en_flags |= ENQUEUE_MIGRATED; @@ -6394,18 +6382,8 @@ void sched_move_task(struct task_struct *tsk) if (running) put_prev_task(rq, tsk); - /* decrease old group */ - if ((!queued && task_contributes_to_load(tsk)) || - (tsk->state == TASK_WAKING && tsk->sched_contributes_to_load)) - update_nr_uninterruptible(tsk, -1); - sched_change_group(tsk, TASK_MOVE_GROUP); - /* increase new group after change */ - if ((!queued && task_contributes_to_load(tsk)) || - (tsk->state == TASK_WAKING && tsk->sched_contributes_to_load)) - update_nr_uninterruptible(tsk, 1); - if (queued) enqueue_task(rq, tsk, queue_flags); if (running) diff --git a/kernel/sched/cpuacct.c b/kernel/sched/cpuacct.c index d99f610..107c166 100644 --- a/kernel/sched/cpuacct.c +++ b/kernel/sched/cpuacct.c @@ -358,95 +358,6 @@ static inline struct task_group *cgroup_tg(struct cgroup *cgrp) struct task_group, css); } -static inline unsigned long nr_uninterruptible(void) -{ - unsigned long i, sum = 0; - - for_each_possible_cpu(i) - sum += cpu_rq(i)->nr_uninterruptible; - - /* - * Since we read the counters lockless, it might be slightly - * inaccurate. Do not allow it to go below zero though: - */ - if (unlikely((long)sum < 0)) - sum = 0; - - return sum; -} - -#ifdef CONFIG_CFS_BANDWIDTH -static inline bool tg_cfs_throttled(struct task_group *tg, int cpu) -{ - return tg->cfs_rq[cpu]->throttle_count; -} -#else -static inline bool tg_cfs_throttled(struct task_group *tg, int cpu) -{ - return false; -} -#endif - -#ifdef CONFIG_RT_GROUP_SCHED -static inline bool tg_rt_throttled(struct task_group *tg, int cpu) -{ - return tg->rt_rq[cpu]->rt_throttled && !tg->rt_rq[cpu]->rt_nr_boosted; -} -#endif - -static unsigned long ca_running(struct cpuacct *ca, int cpu) -{ - unsigned long nr_running = 0; - struct cgroup *cgrp = ca->css.cgroup; - struct task_group *tg; - - /* Make sure it is only called for non-root cpuacct */ - if (ca == &root_cpuacct) - return 0; - - rcu_read_lock(); - tg = cgroup_tg(cgrp); - if (unlikely(!tg)) - goto out; - - if (!tg_cfs_throttled(tg, cpu)) - nr_running += tg->cfs_rq[cpu]->h_nr_running; -#ifdef CONFIG_RT_GROUP_SCHED - if (!tg_rt_throttled(tg, cpu)) - nr_running += tg->rt_rq[cpu]->rt_nr_running; -#endif - /* SCHED_DEADLINE doesn't support cgroup yet */ - -out: - rcu_read_unlock(); - return nr_running; -} - -static unsigned long ca_uninterruptible(struct cpuacct *ca, int cpu) -{ - unsigned long nr = 0; - struct cgroup *cgrp = ca->css.cgroup; - struct task_group *tg; - - /* Make sure it is only called for non-root cpuacct */ - if (ca == &root_cpuacct) - return nr; - - rcu_read_lock(); - tg = cgroup_tg(cgrp); - if (unlikely(!tg)) - goto out_rcu_unlock; - - nr = tg->cfs_rq[cpu]->nr_uninterruptible; -#ifdef CONFIG_RT_GROUP_SCHED - nr += tg->rt_rq[cpu]->nr_uninterruptible; -#endif - -out_rcu_unlock: - rcu_read_unlock(); - return nr; -} - void cgroup_idle_start(struct sched_entity *se) { unsigned long flags; @@ -625,7 +536,6 @@ static int cpuacct_proc_stats_show(struct seq_file *sf, void *v) u64 user, nice, system, idle, iowait, irq, softirq, steal, guest; u64 nr_migrations = 0; struct cpuacct_alistats *alistats; - unsigned long nr_run = 0, nr_uninter = 0; int cpu; user = nice = system = idle = iowait = @@ -656,8 +566,6 @@ static int cpuacct_proc_stats_show(struct seq_file *sf, void *v) alistats = per_cpu_ptr(ca->alistats, cpu); nr_migrations += alistats->nr_migrations; - nr_run += ca_running(ca, cpu); - nr_uninter += ca_uninterruptible(ca, cpu); } } else { struct kernel_cpustat *kcpustat; @@ -677,9 +585,6 @@ static int cpuacct_proc_stats_show(struct seq_file *sf, void *v) alistats = per_cpu_ptr(ca->alistats, cpu); nr_migrations += alistats->nr_migrations; } - - nr_run = nr_running(); - nr_uninter = nr_uninterruptible(); } seq_printf(sf, "user %lld\n", nsec_to_clock_t(user)); @@ -692,10 +597,6 @@ static int cpuacct_proc_stats_show(struct seq_file *sf, void *v) seq_printf(sf, "steal %lld\n", nsec_to_clock_t(steal)); seq_printf(sf, "guest %lld\n", nsec_to_clock_t(guest)); - seq_printf(sf, "nr_running %lld\n", (u64)nr_run); - if ((long) nr_uninter < 0) - nr_uninter = 0; - seq_printf(sf, "nr_uninterruptible %lld\n", (u64)nr_uninter); seq_printf(sf, "nr_migrations %lld\n", (u64)nr_migrations); return 0; diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index cf9b149..f89fb86 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -10311,16 +10311,6 @@ static unsigned int get_rr_interval_fair(struct rq *rq, struct task_struct *task return rr_interval; } -#ifdef CONFIG_SCHED_SLI -static void update_nr_uninterruptible_fair(struct task_struct *p, long inc) -{ - struct sched_entity *se = &p->se; - - for_each_sched_entity(se) - cfs_rq_of(se)->nr_uninterruptible += inc; -} -#endif - /* * All the scheduling class methods: */ @@ -10364,7 +10354,6 @@ static void update_nr_uninterruptible_fair(struct task_struct *p, long inc) #endif #ifdef CONFIG_SCHED_SLI - .update_nr_uninterruptible = update_nr_uninterruptible_fair, .update_nr_iowait = update_nr_iowait_fair, #endif }; diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c index 9f4e9b8..b980cc9 100644 --- a/kernel/sched/rt.c +++ b/kernel/sched/rt.c @@ -2374,16 +2374,6 @@ static unsigned int get_rr_interval_rt(struct rq *rq, struct task_struct *task) return 0; } -#ifdef CONFIG_SCHED_SLI -static void update_nr_uninterruptible_rt(struct task_struct *p, long inc) -{ - struct sched_rt_entity *se = &p->rt; - - for_each_sched_rt_entity(se) - rt_rq_of_se(se)->nr_uninterruptible += inc; -} -#endif - const struct sched_class rt_sched_class = { .next = &fair_sched_class, .enqueue_task = enqueue_task_rt, @@ -2414,10 +2404,6 @@ static void update_nr_uninterruptible_rt(struct task_struct *p, long inc) .switched_to = switched_to_rt, .update_curr = update_curr_rt, - -#ifdef CONFIG_SCHED_SLI - .update_nr_uninterruptible = update_nr_uninterruptible_rt, -#endif }; #ifdef CONFIG_RT_GROUP_SCHED diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h index dd7a54b..8fb5e89 100644 --- a/kernel/sched/sched.h +++ b/kernel/sched/sched.h @@ -575,8 +575,6 @@ struct cfs_rq { #endif /* CONFIG_CFS_BANDWIDTH */ #endif /* CONFIG_FAIR_GROUP_SCHED */ - unsigned long nr_uninterruptible; - ALI_HOTFIX_RESERVE(1) ALI_HOTFIX_RESERVE(2) ALI_HOTFIX_RESERVE(3) @@ -627,8 +625,6 @@ struct rt_rq { struct rq *rq; struct task_group *tg; #endif - - unsigned long nr_uninterruptible; }; static inline bool rt_rq_is_runnable(struct rt_rq *rt_rq) @@ -1675,8 +1671,6 @@ struct sched_class { #ifdef CONFIG_FAIR_GROUP_SCHED void (*task_change_group)(struct task_struct *p, int type); #endif - - void (*update_nr_uninterruptible)(struct task_struct *p, long inc); void (*update_nr_iowait)(struct task_struct *p, long inc); }; -- 1.8.3.1