Skip to content

Commit acb5fe2

Browse files
shakeelbakpm00
authored andcommitted
memcg: warn for unexpected events and stats
To reduce memory usage by the memcg events and stats, the kernel uses indirection table and only allocate stats and events which are being used by the memcg code. To make this more robust, let's add warnings where unexpected stats and events indexes are used. Link: https://lkml.kernel.org/r/[email protected] Signed-off-by: Shakeel Butt <[email protected]> Reviewed-by: Roman Gushchin <[email protected]> Cc: Johannes Weiner <[email protected]> Cc: Michal Hocko <[email protected]> Cc: Muchun Song <[email protected]> Cc: T.J. Mercier <[email protected]> Cc: Yosry Ahmed <[email protected]> Signed-off-by: Andrew Morton <[email protected]>
1 parent 4715c6a commit acb5fe2

File tree

1 file changed

+23
-16
lines changed

1 file changed

+23
-16
lines changed

mm/memcontrol.c

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -670,7 +670,7 @@ unsigned long lruvec_page_state(struct lruvec *lruvec, enum node_stat_item idx)
670670
return node_page_state(lruvec_pgdat(lruvec), idx);
671671

672672
i = memcg_stats_index(idx);
673-
if (i < 0)
673+
if (WARN_ONCE(i < 0, "%s: missing stat item %d\n", __func__, idx))
674674
return 0;
675675

676676
pn = container_of(lruvec, struct mem_cgroup_per_node, lruvec);
@@ -686,14 +686,14 @@ unsigned long lruvec_page_state_local(struct lruvec *lruvec,
686686
enum node_stat_item idx)
687687
{
688688
struct mem_cgroup_per_node *pn;
689-
long x = 0;
689+
long x;
690690
int i;
691691

692692
if (mem_cgroup_disabled())
693693
return node_page_state(lruvec_pgdat(lruvec), idx);
694694

695695
i = memcg_stats_index(idx);
696-
if (i < 0)
696+
if (WARN_ONCE(i < 0, "%s: missing stat item %d\n", __func__, idx))
697697
return 0;
698698

699699
pn = container_of(lruvec, struct mem_cgroup_per_node, lruvec);
@@ -922,7 +922,7 @@ unsigned long memcg_page_state(struct mem_cgroup *memcg, int idx)
922922
long x;
923923
int i = memcg_stats_index(idx);
924924

925-
if (i < 0)
925+
if (WARN_ONCE(i < 0, "%s: missing stat item %d\n", __func__, idx))
926926
return 0;
927927

928928
x = READ_ONCE(memcg->vmstats->state[i]);
@@ -959,7 +959,10 @@ void __mod_memcg_state(struct mem_cgroup *memcg, int idx, int val)
959959
{
960960
int i = memcg_stats_index(idx);
961961

962-
if (mem_cgroup_disabled() || i < 0)
962+
if (mem_cgroup_disabled())
963+
return;
964+
965+
if (WARN_ONCE(i < 0, "%s: missing stat item %d\n", __func__, idx))
963966
return;
964967

965968
__this_cpu_add(memcg->vmstats_percpu->state[i], val);
@@ -972,7 +975,7 @@ static unsigned long memcg_page_state_local(struct mem_cgroup *memcg, int idx)
972975
long x;
973976
int i = memcg_stats_index(idx);
974977

975-
if (i < 0)
978+
if (WARN_ONCE(i < 0, "%s: missing stat item %d\n", __func__, idx))
976979
return 0;
977980

978981
x = READ_ONCE(memcg->vmstats->state_local[i]);
@@ -991,7 +994,7 @@ static void __mod_memcg_lruvec_state(struct lruvec *lruvec,
991994
struct mem_cgroup *memcg;
992995
int i = memcg_stats_index(idx);
993996

994-
if (i < 0)
997+
if (WARN_ONCE(i < 0, "%s: missing stat item %d\n", __func__, idx))
995998
return;
996999

9971000
pn = container_of(lruvec, struct mem_cgroup_per_node, lruvec);
@@ -1102,34 +1105,38 @@ void __mod_lruvec_kmem_state(void *p, enum node_stat_item idx, int val)
11021105
void __count_memcg_events(struct mem_cgroup *memcg, enum vm_event_item idx,
11031106
unsigned long count)
11041107
{
1105-
int index = memcg_events_index(idx);
1108+
int i = memcg_events_index(idx);
11061109

1107-
if (mem_cgroup_disabled() || index < 0)
1110+
if (mem_cgroup_disabled())
1111+
return;
1112+
1113+
if (WARN_ONCE(i < 0, "%s: missing stat item %d\n", __func__, idx))
11081114
return;
11091115

11101116
memcg_stats_lock();
1111-
__this_cpu_add(memcg->vmstats_percpu->events[index], count);
1117+
__this_cpu_add(memcg->vmstats_percpu->events[i], count);
11121118
memcg_rstat_updated(memcg, count);
11131119
memcg_stats_unlock();
11141120
}
11151121

11161122
static unsigned long memcg_events(struct mem_cgroup *memcg, int event)
11171123
{
1118-
int index = memcg_events_index(event);
1124+
int i = memcg_events_index(event);
11191125

1120-
if (index < 0)
1126+
if (WARN_ONCE(i < 0, "%s: missing stat item %d\n", __func__, event))
11211127
return 0;
1122-
return READ_ONCE(memcg->vmstats->events[index]);
1128+
1129+
return READ_ONCE(memcg->vmstats->events[i]);
11231130
}
11241131

11251132
static unsigned long memcg_events_local(struct mem_cgroup *memcg, int event)
11261133
{
1127-
int index = memcg_events_index(event);
1134+
int i = memcg_events_index(event);
11281135

1129-
if (index < 0)
1136+
if (WARN_ONCE(i < 0, "%s: missing stat item %d\n", __func__, event))
11301137
return 0;
11311138

1132-
return READ_ONCE(memcg->vmstats->events_local[index]);
1139+
return READ_ONCE(memcg->vmstats->events_local[i]);
11331140
}
11341141

11351142
static void mem_cgroup_charge_statistics(struct mem_cgroup *memcg,

0 commit comments

Comments
 (0)