|
@@ -165,20 +165,12 @@ static unsigned long *alloc_thread_stack_node(struct task_struct *tsk,
|
|
|
struct page *page = alloc_pages_node(node, THREADINFO_GFP,
|
|
|
THREAD_SIZE_ORDER);
|
|
|
|
|
|
- if (page)
|
|
|
- memcg_kmem_update_page_stat(page, MEMCG_KERNEL_STACK,
|
|
|
- 1 << THREAD_SIZE_ORDER);
|
|
|
-
|
|
|
return page ? page_address(page) : NULL;
|
|
|
}
|
|
|
|
|
|
static inline void free_thread_stack(unsigned long *stack)
|
|
|
{
|
|
|
- struct page *page = virt_to_page(stack);
|
|
|
-
|
|
|
- memcg_kmem_update_page_stat(page, MEMCG_KERNEL_STACK,
|
|
|
- -(1 << THREAD_SIZE_ORDER));
|
|
|
- __free_pages(page, THREAD_SIZE_ORDER);
|
|
|
+ __free_pages(virt_to_page(stack), THREAD_SIZE_ORDER);
|
|
|
}
|
|
|
# else
|
|
|
static struct kmem_cache *thread_stack_cache;
|
|
@@ -223,10 +215,15 @@ static struct kmem_cache *mm_cachep;
|
|
|
|
|
|
static void account_kernel_stack(unsigned long *stack, int account)
|
|
|
{
|
|
|
- struct zone *zone = page_zone(virt_to_page(stack));
|
|
|
+ /* All stack pages are in the same zone and belong to the same memcg. */
|
|
|
+ struct page *first_page = virt_to_page(stack);
|
|
|
|
|
|
- mod_zone_page_state(zone, NR_KERNEL_STACK_KB,
|
|
|
+ mod_zone_page_state(page_zone(first_page), NR_KERNEL_STACK_KB,
|
|
|
THREAD_SIZE / 1024 * account);
|
|
|
+
|
|
|
+ memcg_kmem_update_page_stat(
|
|
|
+ first_page, MEMCG_KERNEL_STACK_KB,
|
|
|
+ account * (THREAD_SIZE / 1024));
|
|
|
}
|
|
|
|
|
|
void free_task(struct task_struct *tsk)
|