mirror of
https://github.com/torvalds/linux.git
synced 2024-12-25 12:21:37 +00:00
mm: memcg: factor out legacy socket memory accounting code
Move out the legacy cgroup v1 socket memory accounting code into mm/memcontrol-v1.c. This commit introduces three new functions: memcg1_tcpmem_active(), memcg1_charge_skmem() and memcg1_uncharge_skmem(), which contain all cgroup v1-specific code and become trivial if CONFIG_MEMCG_V1 isn't set. Note, that !!memcg->tcpmem_pressure check in mem_cgroup_under_socket_pressure() can't be easily moved into memcontrol-v1.h without including memcontrol-v1.h from memcontrol.h which isn't a good idea, so it's better to just #ifdef it. Link: https://lkml.kernel.org/r/20240628210317.272856-3-roman.gushchin@linux.dev Signed-off-by: Roman Gushchin <roman.gushchin@linux.dev> Acked-by: Shakeel Butt <shakeel.butt@linux.dev> Cc: Johannes Weiner <hannes@cmpxchg.org> Cc: Michal Hocko <mhocko@kernel.org> Cc: Muchun Song <muchun.song@linux.dev> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
parent
04fbe921d3
commit
773e9ae77f
@ -1650,8 +1650,10 @@ void mem_cgroup_sk_alloc(struct sock *sk);
|
||||
void mem_cgroup_sk_free(struct sock *sk);
|
||||
static inline bool mem_cgroup_under_socket_pressure(struct mem_cgroup *memcg)
|
||||
{
|
||||
#ifdef CONFIG_MEMCG_V1
|
||||
if (!cgroup_subsys_on_dfl(memory_cgrp_subsys))
|
||||
return !!memcg->tcpmem_pressure;
|
||||
#endif /* CONFIG_MEMCG_V1 */
|
||||
do {
|
||||
if (time_before(jiffies, READ_ONCE(memcg->socket_pressure)))
|
||||
return true;
|
||||
|
@ -2925,6 +2925,23 @@ void memcg1_account_kmem(struct mem_cgroup *memcg, int nr_pages)
|
||||
}
|
||||
#endif /* CONFIG_MEMCG_KMEM */
|
||||
|
||||
bool memcg1_charge_skmem(struct mem_cgroup *memcg, unsigned int nr_pages,
|
||||
gfp_t gfp_mask)
|
||||
{
|
||||
struct page_counter *fail;
|
||||
|
||||
if (page_counter_try_charge(&memcg->tcpmem, nr_pages, &fail)) {
|
||||
memcg->tcpmem_pressure = 0;
|
||||
return true;
|
||||
}
|
||||
memcg->tcpmem_pressure = 1;
|
||||
if (gfp_mask & __GFP_NOFAIL) {
|
||||
page_counter_charge(&memcg->tcpmem, nr_pages);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static int __init memcg1_init(void)
|
||||
{
|
||||
int node;
|
||||
|
@ -103,6 +103,17 @@ void memcg1_check_events(struct mem_cgroup *memcg, int nid);
|
||||
void memcg1_stat_format(struct mem_cgroup *memcg, struct seq_buf *s);
|
||||
|
||||
void memcg1_account_kmem(struct mem_cgroup *memcg, int nr_pages);
|
||||
static inline bool memcg1_tcpmem_active(struct mem_cgroup *memcg)
|
||||
{
|
||||
return memcg->tcpmem_active;
|
||||
}
|
||||
bool memcg1_charge_skmem(struct mem_cgroup *memcg, unsigned int nr_pages,
|
||||
gfp_t gfp_mask);
|
||||
static inline void memcg1_uncharge_skmem(struct mem_cgroup *memcg, unsigned int nr_pages)
|
||||
{
|
||||
page_counter_uncharge(&memcg->tcpmem, nr_pages);
|
||||
}
|
||||
|
||||
extern struct cftype memsw_files[];
|
||||
extern struct cftype mem_cgroup_legacy_files[];
|
||||
|
||||
@ -122,6 +133,11 @@ static inline void memcg1_check_events(struct mem_cgroup *memcg, int nid) {}
|
||||
static inline void memcg1_stat_format(struct mem_cgroup *memcg, struct seq_buf *s) {}
|
||||
|
||||
static inline void memcg1_account_kmem(struct mem_cgroup *memcg, int nr_pages) {}
|
||||
static inline bool memcg1_tcpmem_active(struct mem_cgroup *memcg) { return false; }
|
||||
static inline bool memcg1_charge_skmem(struct mem_cgroup *memcg, unsigned int nr_pages,
|
||||
gfp_t gfp_mask) { return true; }
|
||||
static inline void memcg1_uncharge_skmem(struct mem_cgroup *memcg, unsigned int nr_pages) {}
|
||||
|
||||
extern struct cftype memsw_files[];
|
||||
extern struct cftype mem_cgroup_legacy_files[];
|
||||
#endif /* CONFIG_MEMCG_V1 */
|
||||
|
@ -3753,7 +3753,7 @@ static void mem_cgroup_css_free(struct cgroup_subsys_state *css)
|
||||
if (cgroup_subsys_on_dfl(memory_cgrp_subsys) && !cgroup_memory_nosocket)
|
||||
static_branch_dec(&memcg_sockets_enabled_key);
|
||||
|
||||
if (!cgroup_subsys_on_dfl(memory_cgrp_subsys) && memcg->tcpmem_active)
|
||||
if (!cgroup_subsys_on_dfl(memory_cgrp_subsys) && memcg1_tcpmem_active(memcg))
|
||||
static_branch_dec(&memcg_sockets_enabled_key);
|
||||
|
||||
#if defined(CONFIG_MEMCG_KMEM)
|
||||
@ -4979,7 +4979,7 @@ void mem_cgroup_sk_alloc(struct sock *sk)
|
||||
memcg = mem_cgroup_from_task(current);
|
||||
if (mem_cgroup_is_root(memcg))
|
||||
goto out;
|
||||
if (!cgroup_subsys_on_dfl(memory_cgrp_subsys) && !memcg->tcpmem_active)
|
||||
if (!cgroup_subsys_on_dfl(memory_cgrp_subsys) && !memcg1_tcpmem_active(memcg))
|
||||
goto out;
|
||||
if (css_tryget(&memcg->css))
|
||||
sk->sk_memcg = memcg;
|
||||
@ -5005,20 +5005,8 @@ void mem_cgroup_sk_free(struct sock *sk)
|
||||
bool mem_cgroup_charge_skmem(struct mem_cgroup *memcg, unsigned int nr_pages,
|
||||
gfp_t gfp_mask)
|
||||
{
|
||||
if (!cgroup_subsys_on_dfl(memory_cgrp_subsys)) {
|
||||
struct page_counter *fail;
|
||||
|
||||
if (page_counter_try_charge(&memcg->tcpmem, nr_pages, &fail)) {
|
||||
memcg->tcpmem_pressure = 0;
|
||||
return true;
|
||||
}
|
||||
memcg->tcpmem_pressure = 1;
|
||||
if (gfp_mask & __GFP_NOFAIL) {
|
||||
page_counter_charge(&memcg->tcpmem, nr_pages);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
if (!cgroup_subsys_on_dfl(memory_cgrp_subsys))
|
||||
return memcg1_charge_skmem(memcg, nr_pages, gfp_mask);
|
||||
|
||||
if (try_charge(memcg, gfp_mask, nr_pages) == 0) {
|
||||
mod_memcg_state(memcg, MEMCG_SOCK, nr_pages);
|
||||
@ -5036,7 +5024,7 @@ bool mem_cgroup_charge_skmem(struct mem_cgroup *memcg, unsigned int nr_pages,
|
||||
void mem_cgroup_uncharge_skmem(struct mem_cgroup *memcg, unsigned int nr_pages)
|
||||
{
|
||||
if (!cgroup_subsys_on_dfl(memory_cgrp_subsys)) {
|
||||
page_counter_uncharge(&memcg->tcpmem, nr_pages);
|
||||
memcg1_uncharge_skmem(memcg, nr_pages);
|
||||
return;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user