@@ -211,7 +211,7 @@ static int free_vm_stack_cache(unsigned int cpu)
211
211
return 0 ;
212
212
}
213
213
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 )
215
215
{
216
216
void * stack ;
217
217
int i ;
@@ -232,7 +232,7 @@ static unsigned long *alloc_thread_stack_node(struct task_struct *tsk, int node)
232
232
233
233
tsk -> stack_vm_area = s ;
234
234
tsk -> stack = s -> addr ;
235
- return s -> addr ;
235
+ return 0 ;
236
236
}
237
237
238
238
/*
@@ -245,17 +245,16 @@ static unsigned long *alloc_thread_stack_node(struct task_struct *tsk, int node)
245
245
THREADINFO_GFP & ~__GFP_ACCOUNT ,
246
246
PAGE_KERNEL ,
247
247
0 , node , __builtin_return_address (0 ));
248
-
248
+ if (!stack )
249
+ return - ENOMEM ;
249
250
/*
250
251
* We can't call find_vm_area() in interrupt context, and
251
252
* free_thread_stack() can be called in interrupt context,
252
253
* so cache the vm_struct.
253
254
*/
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 ;
259
258
}
260
259
261
260
static void free_thread_stack (struct task_struct * tsk )
@@ -282,16 +281,16 @@ static void free_thread_stack(struct task_struct *tsk)
282
281
283
282
# else /* !CONFIG_VMAP_STACK */
284
283
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 )
286
285
{
287
286
struct page * page = alloc_pages_node (node , THREADINFO_GFP ,
288
287
THREAD_SIZE_ORDER );
289
288
290
289
if (likely (page )) {
291
290
tsk -> stack = kasan_reset_tag (page_address (page ));
292
- return tsk -> stack ;
291
+ return 0 ;
293
292
}
294
- return NULL ;
293
+ return - ENOMEM ;
295
294
}
296
295
297
296
static void free_thread_stack (struct task_struct * tsk )
@@ -305,14 +304,13 @@ static void free_thread_stack(struct task_struct *tsk)
305
304
306
305
static struct kmem_cache * thread_stack_cache ;
307
306
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 )
310
308
{
311
309
unsigned long * stack ;
312
310
stack = kmem_cache_alloc_node (thread_stack_cache , THREADINFO_GFP , node );
313
311
stack = kasan_reset_tag (stack );
314
312
tsk -> stack = stack ;
315
- return stack ;
313
+ return stack ? 0 : - ENOMEM ;
316
314
}
317
315
318
316
static void free_thread_stack (struct task_struct * tsk )
@@ -332,13 +330,13 @@ void thread_stack_cache_init(void)
332
330
# endif /* THREAD_SIZE >= PAGE_SIZE || defined(CONFIG_VMAP_STACK) */
333
331
#else /* CONFIG_ARCH_THREAD_STACK_ALLOCATOR */
334
332
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 )
336
334
{
337
335
unsigned long * stack ;
338
336
339
337
stack = arch_alloc_thread_stack_node (tsk , node );
340
338
tsk -> stack = stack ;
341
- return stack ;
339
+ return stack ? 0 : - ENOMEM ;
342
340
}
343
341
344
342
static void free_thread_stack (struct task_struct * tsk )
@@ -895,8 +893,6 @@ void set_task_stack_end_magic(struct task_struct *tsk)
895
893
static struct task_struct * dup_task_struct (struct task_struct * orig , int node )
896
894
{
897
895
struct task_struct * tsk ;
898
- unsigned long * stack ;
899
- struct vm_struct * stack_vm_area __maybe_unused ;
900
896
int err ;
901
897
902
898
if (node == NUMA_NO_NODE )
@@ -909,24 +905,13 @@ static struct task_struct *dup_task_struct(struct task_struct *orig, int node)
909
905
if (err )
910
906
goto free_tsk ;
911
907
912
- stack = alloc_thread_stack_node (tsk , node );
913
- if (! stack )
908
+ err = alloc_thread_stack_node (tsk , node );
909
+ if (err )
914
910
goto free_tsk ;
915
911
916
912
if (memcg_charge_kernel_stack (tsk ))
917
913
goto free_stack ;
918
914
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
930
915
#ifdef CONFIG_THREAD_INFO_IN_TASK
931
916
refcount_set (& tsk -> stack_refcount , 1 );
932
917
#endif
0 commit comments