diff options
Diffstat (limited to 'kernel/fork.c')
-rw-r--r-- | kernel/fork.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/kernel/fork.c b/kernel/fork.c index cffbe8a4e1fc..cbc6adc6e891 100644 --- a/kernel/fork.c +++ b/kernel/fork.c | |||
@@ -117,14 +117,17 @@ static struct kmem_cache *task_struct_cachep; | |||
117 | #endif | 117 | #endif |
118 | 118 | ||
119 | #ifndef __HAVE_ARCH_THREAD_INFO_ALLOCATOR | 119 | #ifndef __HAVE_ARCH_THREAD_INFO_ALLOCATOR |
120 | static inline struct thread_info *alloc_thread_info(struct task_struct *tsk) | 120 | static struct thread_info *alloc_thread_info_node(struct task_struct *tsk, |
121 | int node) | ||
121 | { | 122 | { |
122 | #ifdef CONFIG_DEBUG_STACK_USAGE | 123 | #ifdef CONFIG_DEBUG_STACK_USAGE |
123 | gfp_t mask = GFP_KERNEL | __GFP_ZERO; | 124 | gfp_t mask = GFP_KERNEL | __GFP_ZERO; |
124 | #else | 125 | #else |
125 | gfp_t mask = GFP_KERNEL; | 126 | gfp_t mask = GFP_KERNEL; |
126 | #endif | 127 | #endif |
127 | return (struct thread_info *)__get_free_pages(mask, THREAD_SIZE_ORDER); | 128 | struct page *page = alloc_pages_node(node, mask, THREAD_SIZE_ORDER); |
129 | |||
130 | return page ? page_address(page) : NULL; | ||
128 | } | 131 | } |
129 | 132 | ||
130 | static inline void free_thread_info(struct thread_info *ti) | 133 | static inline void free_thread_info(struct thread_info *ti) |
@@ -260,7 +263,7 @@ static struct task_struct *dup_task_struct(struct task_struct *orig) | |||
260 | if (!tsk) | 263 | if (!tsk) |
261 | return NULL; | 264 | return NULL; |
262 | 265 | ||
263 | ti = alloc_thread_info(tsk); | 266 | ti = alloc_thread_info_node(tsk, node); |
264 | if (!ti) { | 267 | if (!ti) { |
265 | free_task_struct(tsk); | 268 | free_task_struct(tsk); |
266 | return NULL; | 269 | return NULL; |