Messages in this thread Patch in this message |  | | From | "Joel Fernandes (Google)" <> | Subject | [PATCH -tip 24/32] sched: Release references to the per-task cookie on exit | Date | Tue, 17 Nov 2020 18:19:54 -0500 |
| |
During exit, we have to free the references to a cookie that might be shared by many tasks. This commit therefore ensures when the task_struct is released, any references to cookies that it holds are also released.
Reviewed-by: Chris Hyser <chris.hyser@oracle.com> Tested-by: Julien Desfossez <jdesfossez@digitalocean.com> Signed-off-by: Joel Fernandes (Google) <joel@joelfernandes.org> --- include/linux/sched.h | 3 +++ kernel/fork.c | 1 + kernel/sched/core.c | 8 ++++++++ 3 files changed, 12 insertions(+)
diff --git a/include/linux/sched.h b/include/linux/sched.h index 79d76c78cc8e..6fbdb1a204bf 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -2084,11 +2084,14 @@ void sched_core_unsafe_exit(void); bool sched_core_wait_till_safe(unsigned long ti_check); bool sched_core_kernel_protected(void); int sched_core_share_pid(pid_t pid); +void sched_tsk_free(struct task_struct *tsk); #else #define sched_core_unsafe_enter(ignore) do { } while (0) #define sched_core_unsafe_exit(ignore) do { } while (0) #define sched_core_wait_till_safe(ignore) do { } while (0) #define sched_core_kernel_protected(ignore) do { } while (0) +#define sched_core_share_pid(pid) do { } while (0) +#define sched_tsk_free(tsk) do { } while (0) #endif #endif diff --git a/kernel/fork.c b/kernel/fork.c index 7199d359690c..5468c93829c5 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -736,6 +736,7 @@ void __put_task_struct(struct task_struct *tsk) exit_creds(tsk); delayacct_tsk_free(tsk); put_signal_struct(tsk->signal); + sched_tsk_free(tsk); if (!profile_handoff_task(tsk)) free_task(tsk); diff --git a/kernel/sched/core.c b/kernel/sched/core.c index a95898c75bdf..cc36c384364e 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -10066,6 +10066,14 @@ static int cpu_core_tag_write_u64(struct cgroup_subsys_state *css, struct cftype return 0; } + +void sched_tsk_free(struct task_struct *tsk) +{ + if (!tsk->core_task_cookie) + return; + sched_core_put_task_cookie(tsk->core_task_cookie); + sched_core_put(); +} #endif static struct cftype cpu_legacy_files[] = { -- 2.29.2.299.gdc1121823c-goog
|  |