Skip to content

Commit

Permalink
mm: memcg/percpu: account extra objcg space to memory cgroups
Browse files Browse the repository at this point in the history
Similar to slab memory allocator, for each accounted percpu object there
is an extra space which is used to store obj_cgroup membership.  Charge
it too.

[[email protected]: fix layout]

Link: https://lkml.kernel.org/r/[email protected]
Signed-off-by: Qi Zheng <[email protected]>
Acked-by: Dennis Zhou <[email protected]>
Cc: Tejun Heo <[email protected]>
Cc: Christoph Lameter <[email protected]>
Cc: Muchun Song <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
Qi Zheng authored and torvalds committed Jan 15, 2022
1 parent bf181c5 commit 8c57c07
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 5 deletions.
18 changes: 18 additions & 0 deletions mm/percpu-internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,24 @@ static inline int pcpu_chunk_map_bits(struct pcpu_chunk *chunk)
return pcpu_nr_pages_to_map_bits(chunk->nr_pages);
}

#ifdef CONFIG_MEMCG_KMEM
/**
* pcpu_obj_full_size - helper to calculate size of each accounted object
* @size: size of area to allocate in bytes
*
* For each accounted object there is an extra space which is used to store
* obj_cgroup membership. Charge it too.
*/
static inline size_t pcpu_obj_full_size(size_t size)
{
size_t extra_size;

extra_size = size / PCPU_MIN_ALLOC_SIZE * sizeof(struct obj_cgroup *);

return size * num_possible_cpus() + extra_size;
}
#endif /* CONFIG_MEMCG_KMEM */

#ifdef CONFIG_PERCPU_STATS

#include <linux/spinlock.h>
Expand Down
10 changes: 5 additions & 5 deletions mm/percpu.c
Original file line number Diff line number Diff line change
Expand Up @@ -1635,7 +1635,7 @@ static bool pcpu_memcg_pre_alloc_hook(size_t size, gfp_t gfp,
if (!objcg)
return true;

if (obj_cgroup_charge(objcg, gfp, size * num_possible_cpus())) {
if (obj_cgroup_charge(objcg, gfp, pcpu_obj_full_size(size))) {
obj_cgroup_put(objcg);
return false;
}
Expand All @@ -1656,10 +1656,10 @@ static void pcpu_memcg_post_alloc_hook(struct obj_cgroup *objcg,

rcu_read_lock();
mod_memcg_state(obj_cgroup_memcg(objcg), MEMCG_PERCPU_B,
size * num_possible_cpus());
pcpu_obj_full_size(size));
rcu_read_unlock();
} else {
obj_cgroup_uncharge(objcg, size * num_possible_cpus());
obj_cgroup_uncharge(objcg, pcpu_obj_full_size(size));
obj_cgroup_put(objcg);
}
}
Expand All @@ -1676,11 +1676,11 @@ static void pcpu_memcg_free_hook(struct pcpu_chunk *chunk, int off, size_t size)
return;
chunk->obj_cgroups[off >> PCPU_MIN_ALLOC_SHIFT] = NULL;

obj_cgroup_uncharge(objcg, size * num_possible_cpus());
obj_cgroup_uncharge(objcg, pcpu_obj_full_size(size));

rcu_read_lock();
mod_memcg_state(obj_cgroup_memcg(objcg), MEMCG_PERCPU_B,
-(size * num_possible_cpus()));
-pcpu_obj_full_size(size));
rcu_read_unlock();

obj_cgroup_put(objcg);
Expand Down

0 comments on commit 8c57c07

Please sign in to comment.