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
/*
/* 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;
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);
}
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)));