mirror of https://github.com/torvalds/linux.git
fork: define a local GFP_VMAP_STACK
The current allocation of VMAP stack memory is using (THREADINFO_GFP & ~__GFP_ACCOUNT) which is a complicated way of saying (GFP_KERNEL | __GFP_ZERO): <linux/thread_info.h>: define THREADINFO_GFP (GFP_KERNEL_ACCOUNT | __GFP_ZERO) <linux/gfp_types.h>: define GFP_KERNEL_ACCOUNT (GFP_KERNEL | __GFP_ACCOUNT) This is an unfortunate side-effect of independent changes blurring the picture: commit19809c2da2changed (THREADINFO_GFP | __GFP_HIGHMEM) to just THREADINFO_GFP since highmem became implicit. commit9b6f7e163cthen added stack caching and rewrote the allocation to (THREADINFO_GFP & ~__GFP_ACCOUNT) as cached stacks need to be accounted separately. However that code, when it eventually accounts the memory does this: ret = memcg_kmem_charge(vm->pages[i], GFP_KERNEL, 0) so the memory is charged as a GFP_KERNEL allocation. Define a unique GFP_VMAP_STACK to use GFP_KERNEL | __GFP_ZERO and move the comment there. Link: https://lkml.kernel.org/r/20250509-gfp-stack-v1-1-82f6f7efc210@linaro.org Signed-off-by: Linus Walleij <linus.walleij@linaro.org> Reported-by: Mateusz Guzik <mjguzik@gmail.com> Cc: Pasha Tatashin <pasha.tatashin@soleen.com> Cc: Mike Rapoport (Microsoft) <rppt@kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
parent
449e0b4ed5
commit
f7b0ff2bc9
|
|
@ -201,6 +201,12 @@ static inline void free_task_struct(struct task_struct *tsk)
|
|||
*/
|
||||
#define NR_CACHED_STACKS 2
|
||||
static DEFINE_PER_CPU(struct vm_struct *, cached_stacks[NR_CACHED_STACKS]);
|
||||
/*
|
||||
* Allocated stacks are cached and later reused by new threads, so memcg
|
||||
* accounting is performed by the code assigning/releasing stacks to tasks.
|
||||
* We need a zeroed memory without __GFP_ACCOUNT.
|
||||
*/
|
||||
#define GFP_VMAP_STACK (GFP_KERNEL | __GFP_ZERO)
|
||||
|
||||
struct vm_stack {
|
||||
struct rcu_head rcu;
|
||||
|
|
@ -307,13 +313,8 @@ static int alloc_thread_stack_node(struct task_struct *tsk, int node)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Allocated stacks are cached and later reused by new threads,
|
||||
* so memcg accounting is performed manually on assigning/releasing
|
||||
* stacks to tasks. Drop __GFP_ACCOUNT.
|
||||
*/
|
||||
stack = __vmalloc_node(THREAD_SIZE, THREAD_ALIGN,
|
||||
THREADINFO_GFP & ~__GFP_ACCOUNT,
|
||||
GFP_VMAP_STACK,
|
||||
node, __builtin_return_address(0));
|
||||
if (!stack)
|
||||
return -ENOMEM;
|
||||
|
|
|
|||
Loading…
Reference in New Issue