From 2c8bdb26b5a3d7fec905873a58db3f67d178dcb5 Mon Sep 17 00:00:00 2001 From: Alex Markuze Date: Tue, 25 Feb 2025 16:57:11 +0000 Subject: [PATCH] Adding a tls storage struct --- include/linux/sched.h | 8 +++++++- kernel/fork.c | 5 +++++ net/ceph/ceph_san.c | 1 + 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/include/linux/sched.h b/include/linux/sched.h index 64934e0830af3..2dccb914be9cd 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -781,7 +781,10 @@ struct kmap_ctrl { pte_t pteval[KM_MAX_IDX]; #endif }; - +struct tls_storage { + void (*release)(void *state); + void *state; +}; struct task_struct { #ifdef CONFIG_THREAD_INFO_IN_TASK /* @@ -1241,6 +1244,9 @@ struct task_struct { /* Journalling filesystem info: */ void *journal_info; + /* TLS storage for per-task private data */ + struct tls_storage tls; + /* Stacked block device info: */ struct bio_list *bio_list; diff --git a/kernel/fork.c b/kernel/fork.c index 9b301180fd416..1ed6814c26011 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -182,6 +182,11 @@ static inline struct task_struct *alloc_task_struct_node(int node) 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; + } kmem_cache_free(task_struct_cachep, tsk); } diff --git a/net/ceph/ceph_san.c b/net/ceph/ceph_san.c index eb04740e5fedc..ed6592b5b0ea6 100644 --- a/net/ceph/ceph_san.c +++ b/net/ceph/ceph_san.c @@ -71,6 +71,7 @@ int cephsan_init(void) struct ceph_san_tls_logger *tls; struct cephsan_pagefrag *pf; + struct task_struct *task = current; for_each_possible_cpu(cpu) { tls = per_cpu_ptr(&ceph_san_tls, cpu); tls->pages = alloc_pages(GFP_KERNEL, get_order(CEPH_SAN_MAX_LOGS * sizeof(struct ceph_san_log_entry))); -- 2.39.5