From 8f9ab795117dbde55ed30cd3c4c5375d1f9e02fb Mon Sep 17 00:00:00 2001 From: Alex Markuze Date: Wed, 2 Jul 2025 11:03:04 +0000 Subject: [PATCH] TLS update --- include/linux/sched.h | 1 + kernel/fork.c | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/include/linux/sched.h b/include/linux/sched.h index f96ac19828934..467dfbb45485c 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -1273,6 +1273,7 @@ struct task_struct { /* Journalling filesystem info: */ void *journal_info; + void *tls_ctx; /* Stacked block device info: */ struct bio_list *bio_list; diff --git a/kernel/fork.c b/kernel/fork.c index 168681fc4b25a..8390d5e1a6d39 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -180,8 +180,25 @@ static inline struct task_struct *alloc_task_struct_node(int node) return kmem_cache_alloc_node(task_struct_cachep, GFP_KERNEL, node); } +struct tls_storage { + void (*release)(void *state); +}; + static inline void free_task_struct(struct task_struct *tsk) { +/* + if (tsk->tls.release) { + tsk->tls.release(tsk->tls.state); + tsk->tls.state = NULL; + tsk->tls.release = NULL; + } +*/ + if (tsk->tls_ctx) { + struct tls_storage *tls = (struct tls_storage *)tsk->tls_ctx; + tls->release(tls); + tsk->tls_ctx = NULL; + wmb(); + } kmem_cache_free(task_struct_cachep, tsk); } @@ -2260,6 +2277,9 @@ __latent_entropy struct task_struct *copy_process( p = dup_task_struct(current, node); if (!p) goto fork_out; + + p->tls_ctx = NULL; + p->flags &= ~PF_KTHREAD; if (args->kthread) p->flags |= PF_KTHREAD; -- 2.39.5