mirror of
https://github.com/torvalds/linux.git
synced 2026-05-25 07:33:19 +02:00
memcg: make __mod_memcg_lruvec_state re-entrant safe against irqs
Let's make __mod_memcg_lruvec_state re-entrant safe and name it mod_memcg_lruvec_state(). The only thing needed is to convert the usage of __this_cpu_add() to this_cpu_add(). There are two callers of mod_memcg_lruvec_state() and one of them i.e. __mod_objcg_mlstate() will be re-entrant safe as well, so, rename it mod_objcg_mlstate(). The last caller __mod_lruvec_state() still calls __mod_node_page_state() which is not re-entrant safe yet, so keep it as is. Link: https://lkml.kernel.org/r/20250514184158.3471331-6-shakeel.butt@linux.dev Signed-off-by: Shakeel Butt <shakeel.butt@linux.dev> Acked-by: Vlastimil Babka <vbabka@suse.cz> Cc: Alexei Starovoitov <ast@kernel.org> Cc: Johannes Weiner <hannes@cmpxchg.org> Cc: Michal Hocko <mhocko@kernel.org> Cc: Muchun Song <muchun.song@linux.dev> Cc: Roman Gushchin <roman.gushchin@linux.dev> Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
parent
e52401e724
commit
eee8a1778c
|
|
@ -725,7 +725,7 @@ unsigned long memcg_page_state_local(struct mem_cgroup *memcg, int idx)
|
|||
}
|
||||
#endif
|
||||
|
||||
static void __mod_memcg_lruvec_state(struct lruvec *lruvec,
|
||||
static void mod_memcg_lruvec_state(struct lruvec *lruvec,
|
||||
enum node_stat_item idx,
|
||||
int val)
|
||||
{
|
||||
|
|
@ -743,10 +743,10 @@ static void __mod_memcg_lruvec_state(struct lruvec *lruvec,
|
|||
cpu = get_cpu();
|
||||
|
||||
/* Update memcg */
|
||||
__this_cpu_add(memcg->vmstats_percpu->state[i], val);
|
||||
this_cpu_add(memcg->vmstats_percpu->state[i], val);
|
||||
|
||||
/* Update lruvec */
|
||||
__this_cpu_add(pn->lruvec_stats_percpu->state[i], val);
|
||||
this_cpu_add(pn->lruvec_stats_percpu->state[i], val);
|
||||
|
||||
val = memcg_state_val_in_pages(idx, val);
|
||||
memcg_rstat_updated(memcg, val, cpu);
|
||||
|
|
@ -773,7 +773,7 @@ void __mod_lruvec_state(struct lruvec *lruvec, enum node_stat_item idx,
|
|||
|
||||
/* Update memcg and lruvec */
|
||||
if (!mem_cgroup_disabled())
|
||||
__mod_memcg_lruvec_state(lruvec, idx, val);
|
||||
mod_memcg_lruvec_state(lruvec, idx, val);
|
||||
}
|
||||
|
||||
void __lruvec_stat_mod_folio(struct folio *folio, enum node_stat_item idx,
|
||||
|
|
@ -2525,7 +2525,7 @@ static void commit_charge(struct folio *folio, struct mem_cgroup *memcg)
|
|||
folio->memcg_data = (unsigned long)memcg;
|
||||
}
|
||||
|
||||
static inline void __mod_objcg_mlstate(struct obj_cgroup *objcg,
|
||||
static inline void mod_objcg_mlstate(struct obj_cgroup *objcg,
|
||||
struct pglist_data *pgdat,
|
||||
enum node_stat_item idx, int nr)
|
||||
{
|
||||
|
|
@ -2535,7 +2535,7 @@ static inline void __mod_objcg_mlstate(struct obj_cgroup *objcg,
|
|||
rcu_read_lock();
|
||||
memcg = obj_cgroup_memcg(objcg);
|
||||
lruvec = mem_cgroup_lruvec(memcg, pgdat);
|
||||
__mod_memcg_lruvec_state(lruvec, idx, nr);
|
||||
mod_memcg_lruvec_state(lruvec, idx, nr);
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
|
|
@ -2845,12 +2845,12 @@ static void __account_obj_stock(struct obj_cgroup *objcg,
|
|||
struct pglist_data *oldpg = stock->cached_pgdat;
|
||||
|
||||
if (stock->nr_slab_reclaimable_b) {
|
||||
__mod_objcg_mlstate(objcg, oldpg, NR_SLAB_RECLAIMABLE_B,
|
||||
mod_objcg_mlstate(objcg, oldpg, NR_SLAB_RECLAIMABLE_B,
|
||||
stock->nr_slab_reclaimable_b);
|
||||
stock->nr_slab_reclaimable_b = 0;
|
||||
}
|
||||
if (stock->nr_slab_unreclaimable_b) {
|
||||
__mod_objcg_mlstate(objcg, oldpg, NR_SLAB_UNRECLAIMABLE_B,
|
||||
mod_objcg_mlstate(objcg, oldpg, NR_SLAB_UNRECLAIMABLE_B,
|
||||
stock->nr_slab_unreclaimable_b);
|
||||
stock->nr_slab_unreclaimable_b = 0;
|
||||
}
|
||||
|
|
@ -2876,7 +2876,7 @@ static void __account_obj_stock(struct obj_cgroup *objcg,
|
|||
}
|
||||
}
|
||||
if (nr)
|
||||
__mod_objcg_mlstate(objcg, pgdat, idx, nr);
|
||||
mod_objcg_mlstate(objcg, pgdat, idx, nr);
|
||||
}
|
||||
|
||||
static bool consume_obj_stock(struct obj_cgroup *objcg, unsigned int nr_bytes,
|
||||
|
|
@ -2945,13 +2945,13 @@ static void drain_obj_stock(struct obj_stock_pcp *stock)
|
|||
*/
|
||||
if (stock->nr_slab_reclaimable_b || stock->nr_slab_unreclaimable_b) {
|
||||
if (stock->nr_slab_reclaimable_b) {
|
||||
__mod_objcg_mlstate(old, stock->cached_pgdat,
|
||||
mod_objcg_mlstate(old, stock->cached_pgdat,
|
||||
NR_SLAB_RECLAIMABLE_B,
|
||||
stock->nr_slab_reclaimable_b);
|
||||
stock->nr_slab_reclaimable_b = 0;
|
||||
}
|
||||
if (stock->nr_slab_unreclaimable_b) {
|
||||
__mod_objcg_mlstate(old, stock->cached_pgdat,
|
||||
mod_objcg_mlstate(old, stock->cached_pgdat,
|
||||
NR_SLAB_UNRECLAIMABLE_B,
|
||||
stock->nr_slab_unreclaimable_b);
|
||||
stock->nr_slab_unreclaimable_b = 0;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user