Skip to content

Commit 8814e3b

Browse files
shakeelbakpm00
authored andcommitted
memcg: make mod_memcg_state re-entrant safe against irqs
Let's make mod_memcg_state re-entrant safe against irqs. The only thing needed is to convert the usage of __this_cpu_add() to this_cpu_add(). In addition, with re-entrant safety, there is no need to disable irqs. mod_memcg_state() is not safe against nmi, so let's add warning if someone tries to call it in nmi context. Link: https://lkml.kernel.org/r/[email protected] Signed-off-by: Shakeel Butt <[email protected]> Acked-by: Vlastimil Babka <[email protected]> Cc: Alexei Starovoitov <[email protected]> Cc: Johannes Weiner <[email protected]> Cc: Michal Hocko <[email protected]> Cc: Muchun Song <[email protected]> Cc: Roman Gushchin <[email protected]> Cc: Sebastian Andrzej Siewior <[email protected]> Signed-off-by: Andrew Morton <[email protected]>
1 parent c716353 commit 8814e3b

File tree

2 files changed

+6
-22
lines changed

2 files changed

+6
-22
lines changed

include/linux/memcontrol.h

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -903,19 +903,9 @@ struct mem_cgroup *mem_cgroup_get_oom_group(struct task_struct *victim,
903903
struct mem_cgroup *oom_domain);
904904
void mem_cgroup_print_oom_group(struct mem_cgroup *memcg);
905905

906-
void __mod_memcg_state(struct mem_cgroup *memcg, enum memcg_stat_item idx,
907-
int val);
908-
909906
/* idx can be of type enum memcg_stat_item or node_stat_item */
910-
static inline void mod_memcg_state(struct mem_cgroup *memcg,
911-
enum memcg_stat_item idx, int val)
912-
{
913-
unsigned long flags;
914-
915-
local_irq_save(flags);
916-
__mod_memcg_state(memcg, idx, val);
917-
local_irq_restore(flags);
918-
}
907+
void mod_memcg_state(struct mem_cgroup *memcg,
908+
enum memcg_stat_item idx, int val);
919909

920910
static inline void mod_memcg_page_state(struct page *page,
921911
enum memcg_stat_item idx, int val)
@@ -1375,12 +1365,6 @@ static inline void mem_cgroup_print_oom_group(struct mem_cgroup *memcg)
13751365
{
13761366
}
13771367

1378-
static inline void __mod_memcg_state(struct mem_cgroup *memcg,
1379-
enum memcg_stat_item idx,
1380-
int nr)
1381-
{
1382-
}
1383-
13841368
static inline void mod_memcg_state(struct mem_cgroup *memcg,
13851369
enum memcg_stat_item idx,
13861370
int nr)

mm/memcontrol.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -679,12 +679,12 @@ static int memcg_state_val_in_pages(int idx, int val)
679679
}
680680

681681
/**
682-
* __mod_memcg_state - update cgroup memory statistics
682+
* mod_memcg_state - update cgroup memory statistics
683683
* @memcg: the memory cgroup
684684
* @idx: the stat item - can be enum memcg_stat_item or enum node_stat_item
685685
* @val: delta to add to the counter, can be negative
686686
*/
687-
void __mod_memcg_state(struct mem_cgroup *memcg, enum memcg_stat_item idx,
687+
void mod_memcg_state(struct mem_cgroup *memcg, enum memcg_stat_item idx,
688688
int val)
689689
{
690690
int i = memcg_stats_index(idx);
@@ -698,7 +698,7 @@ void __mod_memcg_state(struct mem_cgroup *memcg, enum memcg_stat_item idx,
698698

699699
cpu = get_cpu();
700700

701-
__this_cpu_add(memcg->vmstats_percpu->state[i], val);
701+
this_cpu_add(memcg->vmstats_percpu->state[i], val);
702702
val = memcg_state_val_in_pages(idx, val);
703703
memcg_rstat_updated(memcg, val, cpu);
704704
trace_mod_memcg_state(memcg, idx, val);
@@ -2918,7 +2918,7 @@ static void drain_obj_stock(struct obj_stock_pcp *stock)
29182918

29192919
memcg = get_mem_cgroup_from_objcg(old);
29202920

2921-
__mod_memcg_state(memcg, MEMCG_KMEM, -nr_pages);
2921+
mod_memcg_state(memcg, MEMCG_KMEM, -nr_pages);
29222922
memcg1_account_kmem(memcg, -nr_pages);
29232923
if (!mem_cgroup_is_root(memcg))
29242924
memcg_uncharge(memcg, nr_pages);

0 commit comments

Comments
 (0)