diff options
Diffstat (limited to 'kernel/fork.c')
-rw-r--r-- | kernel/fork.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/kernel/fork.c b/kernel/fork.c index 2cebfb23b0b8..d4638c8cc19e 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) */ |
137 | static struct kmem_cache *mm_cachep; | 137 | static struct kmem_cache *mm_cachep; |
138 | 138 | ||
139 | static 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 | |||
139 | void free_task(struct task_struct *tsk) | 146 | void 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 | ||
258 | out: | 269 | out: |