
hulk inclusion category: bugfix bugzilla: https://gitee.com/openeuler/kernel/issues/ICB7K1 -------------------------------- destroy_auto_affinity() is called from atomic section, and smart_grid_usage_dec() might sleep will cause a atomic sleep issue. Fixes: abd2d73ab235 ("sched: introduce smart grid qos zone") Signed-off-by: Zhang Qiao <zhangqiao22@huawei.com> --- kernel/sched/core.c | 1 + kernel/sched/fair.c | 11 +++++++++-- kernel/sched/sched.h | 2 ++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 0858706eebd8..5d2937935b47 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -8955,6 +8955,7 @@ static void cpu_cgroup_css_offline(struct cgroup_subsys_state *css) { struct task_group *tg = css_tg(css); + offline_auto_affinity(tg); offline_soft_domain(tg); } diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 6bb1dc0dfa93..d48d1ed28a5c 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -6504,7 +6504,7 @@ int init_auto_affinity(struct task_group *tg) return 0; } -static void destroy_auto_affinity(struct task_group *tg) +void offline_auto_affinity(struct task_group *tg) { struct auto_affinity *auto_affi = tg->auto_affinity; @@ -6513,11 +6513,18 @@ static void destroy_auto_affinity(struct task_group *tg) if (auto_affi->period_active) smart_grid_usage_dec(); +} + +static void destroy_auto_affinity(struct task_group *tg) +{ + struct auto_affinity *auto_affi = tg->auto_affinity; + + if (unlikely(!auto_affi)) + return; hrtimer_cancel(&auto_affi->period_timer); sched_grid_zone_del_af(auto_affi); free_affinity_domains(&auto_affi->ad); - kfree(tg->auto_affinity); tg->auto_affinity = NULL; } diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h index 8b2d9bd94c44..93653d7f587f 100644 --- a/kernel/sched/sched.h +++ b/kernel/sched/sched.h @@ -610,6 +610,7 @@ extern void sched_move_task(struct task_struct *tsk); extern void start_auto_affinity(struct auto_affinity *auto_affi); extern void stop_auto_affinity(struct auto_affinity *auto_affi); extern int init_auto_affinity(struct task_group *tg); +void offline_auto_affinity(struct task_group *tg); extern void tg_update_affinity_domains(int cpu, int online); extern int tg_rebuild_affinity_domains(int cpu, struct auto_affinity *auto_affi); @@ -620,6 +621,7 @@ static inline int init_auto_affinity(struct task_group *tg) } static inline void tg_update_affinity_domains(int cpu, int online) {} +static inline void offline_auto_affinity(struct task_group *tg) { } #endif #ifdef CONFIG_SCHED_SOFT_QUOTA -- 2.18.0.huawei.25