aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/fork.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/fork.c')
-rw-r--r--kernel/fork.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/kernel/fork.c b/kernel/fork.c
index 2cebfb23b0b..d4638c8cc19 100644
--- a/kernel/fork.c
+++ b/kernel/fork.c
@@ -136,9 +136,17 @@ struct kmem_cache *vm_area_cachep;
136/* SLAB cache for mm_struct structures (tsk->mm) */ 136/* SLAB cache for mm_struct structures (tsk->mm) */
137static struct kmem_cache *mm_cachep; 137static struct kmem_cache *mm_cachep;
138 138
139static void account_kernel_stack(struct thread_info *ti, int account)
140{
141 struct zone *zone = page_zone(virt_to_page(ti));
142
143 mod_zone_page_state(zone, NR_KERNEL_STACK, account);
144}
145
139void free_task(struct task_struct *tsk) 146void free_task(struct task_struct *tsk)
140{ 147{
141 prop_local_destroy_single(&tsk->dirties); 148 prop_local_destroy_single(&tsk->dirties);
149 account_kernel_stack(tsk->stack, -1);
142 free_thread_info(tsk->stack); 150 free_thread_info(tsk->stack);
143 rt_mutex_debug_task_free(tsk); 151 rt_mutex_debug_task_free(tsk);
144 ftrace_graph_exit_task(tsk); 152 ftrace_graph_exit_task(tsk);
@@ -253,6 +261,9 @@ static struct task_struct *dup_task_struct(struct task_struct *orig)
253 tsk->btrace_seq = 0; 261 tsk->btrace_seq = 0;
254#endif 262#endif
255 tsk->splice_pipe = NULL; 263 tsk->splice_pipe = NULL;
264
265 account_kernel_stack(ti, 1);
266
256 return tsk; 267 return tsk;
257 268
258out: 269out: