
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. Signed-off-by: Zhang Qiao <zhangqiao22@huawei.com> --- kernel/sched/core.c | 1 + kernel/sched/fair.c | 14 ++++++++++++-- kernel/sched/sched.h | 2 ++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/kernel/sched/core.c b/kernel/sched/core.c index e2080b7a9d37..349c9f5fc55d 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -10804,6 +10804,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 b6ffe4117a65..c4c3afa6e7b4 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -7282,7 +7282,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; @@ -7294,11 +7294,21 @@ 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 (!smart_grid_enabled()) + return; + + 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 fe5821c48fed..b418b334b804 100644 --- a/kernel/sched/sched.h +++ b/kernel/sched/sched.h @@ -573,6 +573,7 @@ static inline int sched_task_is_throttled(struct task_struct *p, int cpu) 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); @@ -583,6 +584,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_FAIR_GROUP_SCHED -- 2.18.0.huawei.25