@@ -211,7 +211,7 @@ static int free_vm_stack_cache(unsigned int cpu)
211211 return 0 ;
212212}
213213
214- static unsigned long * alloc_thread_stack_node (struct task_struct * tsk , int node )
214+ static int alloc_thread_stack_node (struct task_struct * tsk , int node )
215215{
216216 void * stack ;
217217 int i ;
@@ -232,7 +232,7 @@ static unsigned long *alloc_thread_stack_node(struct task_struct *tsk, int node)
232232
233233 tsk -> stack_vm_area = s ;
234234 tsk -> stack = s -> addr ;
235- return s -> addr ;
235+ return 0 ;
236236 }
237237
238238 /*
@@ -245,17 +245,16 @@ static unsigned long *alloc_thread_stack_node(struct task_struct *tsk, int node)
245245 THREADINFO_GFP & ~__GFP_ACCOUNT ,
246246 PAGE_KERNEL ,
247247 0 , node , __builtin_return_address (0 ));
248-
248+ if (!stack )
249+ return - ENOMEM ;
249250 /*
250251 * We can't call find_vm_area() in interrupt context, and
251252 * free_thread_stack() can be called in interrupt context,
252253 * so cache the vm_struct.
253254 */
254- if (stack ) {
255- tsk -> stack_vm_area = find_vm_area (stack );
256- tsk -> stack = stack ;
257- }
258- return stack ;
255+ tsk -> stack_vm_area = find_vm_area (stack );
256+ tsk -> stack = stack ;
257+ return 0 ;
259258}
260259
261260static void free_thread_stack (struct task_struct * tsk )
@@ -282,16 +281,16 @@ static void free_thread_stack(struct task_struct *tsk)
282281
283282# else /* !CONFIG_VMAP_STACK */
284283
285- static unsigned long * alloc_thread_stack_node (struct task_struct * tsk , int node )
284+ static int alloc_thread_stack_node (struct task_struct * tsk , int node )
286285{
287286 struct page * page = alloc_pages_node (node , THREADINFO_GFP ,
288287 THREAD_SIZE_ORDER );
289288
290289 if (likely (page )) {
291290 tsk -> stack = kasan_reset_tag (page_address (page ));
292- return tsk -> stack ;
291+ return 0 ;
293292 }
294- return NULL ;
293+ return - ENOMEM ;
295294}
296295
297296static void free_thread_stack (struct task_struct * tsk )
@@ -305,14 +304,13 @@ static void free_thread_stack(struct task_struct *tsk)
305304
306305static struct kmem_cache * thread_stack_cache ;
307306
308- static unsigned long * alloc_thread_stack_node (struct task_struct * tsk ,
309- int node )
307+ static int alloc_thread_stack_node (struct task_struct * tsk , int node )
310308{
311309 unsigned long * stack ;
312310 stack = kmem_cache_alloc_node (thread_stack_cache , THREADINFO_GFP , node );
313311 stack = kasan_reset_tag (stack );
314312 tsk -> stack = stack ;
315- return stack ;
313+ return stack ? 0 : - ENOMEM ;
316314}
317315
318316static void free_thread_stack (struct task_struct * tsk )
@@ -332,13 +330,13 @@ void thread_stack_cache_init(void)
332330# endif /* THREAD_SIZE >= PAGE_SIZE || defined(CONFIG_VMAP_STACK) */
333331#else /* CONFIG_ARCH_THREAD_STACK_ALLOCATOR */
334332
335- static unsigned long * alloc_thread_stack_node (struct task_struct * tsk , int node )
333+ static int alloc_thread_stack_node (struct task_struct * tsk , int node )
336334{
337335 unsigned long * stack ;
338336
339337 stack = arch_alloc_thread_stack_node (tsk , node );
340338 tsk -> stack = stack ;
341- return stack ;
339+ return stack ? 0 : - ENOMEM ;
342340}
343341
344342static void free_thread_stack (struct task_struct * tsk )
@@ -895,8 +893,6 @@ void set_task_stack_end_magic(struct task_struct *tsk)
895893static struct task_struct * dup_task_struct (struct task_struct * orig , int node )
896894{
897895 struct task_struct * tsk ;
898- unsigned long * stack ;
899- struct vm_struct * stack_vm_area __maybe_unused ;
900896 int err ;
901897
902898 if (node == NUMA_NO_NODE )
@@ -909,24 +905,13 @@ static struct task_struct *dup_task_struct(struct task_struct *orig, int node)
909905 if (err )
910906 goto free_tsk ;
911907
912- stack = alloc_thread_stack_node (tsk , node );
913- if (! stack )
908+ err = alloc_thread_stack_node (tsk , node );
909+ if (err )
914910 goto free_tsk ;
915911
916912 if (memcg_charge_kernel_stack (tsk ))
917913 goto free_stack ;
918914
919- stack_vm_area = task_stack_vm_area (tsk );
920-
921- /*
922- * arch_dup_task_struct() clobbers the stack-related fields. Make
923- * sure they're properly initialized before using any stack-related
924- * functions again.
925- */
926- tsk -> stack = stack ;
927- #ifdef CONFIG_VMAP_STACK
928- tsk -> stack_vm_area = stack_vm_area ;
929- #endif
930915#ifdef CONFIG_THREAD_INFO_IN_TASK
931916 refcount_set (& tsk -> stack_refcount , 1 );
932917#endif
0 commit comments