Re: [PATCH 13/27] mm, memcg: Move memcg limit enforcement from zones to nodes

From: Vlastimil Babka
Date: Thu Jun 16 2016 - 11:06:55 EST


On 06/09/2016 08:04 PM, Mel Gorman wrote:
Memcg was broken by the move of all LRUs to nodes because it is tracking
limits on a per-zone basis while receiving reclaim requests on a per-node
basis. This patch moves limit enforcement to the nodes. Technically, all
the variable names should also change but people are already familiar by
the meaning of "mz" even if "mn" would be a more appropriate name now.

Signed-off-by: Mel Gorman <mgorman@xxxxxxxxxxxxxxxxxxx>

Didn't spot bugs, but I'm not that familiar with memcg. Noticed some things below to further optimize/cleanup.

[...]

@@ -323,13 +319,10 @@ EXPORT_SYMBOL(memcg_kmem_enabled_key);

#endif /* !CONFIG_SLOB */

-static struct mem_cgroup_per_zone *
-mem_cgroup_zone_zoneinfo(struct mem_cgroup *memcg, struct zone *zone)
+static struct mem_cgroup_per_node *
+mem_cgroup_nodeinfo(struct mem_cgroup *memcg, pg_data_t *pgdat)
{
- int nid = zone_to_nid(zone);
- int zid = zone_idx(zone);
-
- return &memcg->nodeinfo[nid]->zoneinfo[zid];
+ return memcg->nodeinfo[pgdat->node_id];

I've noticed most callers pass NODE_DATA(nid) as second parameter, which is quite wasteful to just obtain back the node_id (I doubt the compiler can know that they will be the same?). So it would be more efficient to use nid instead of pg_data_t pointer in the signature.

}

/**
@@ -383,37 +376,35 @@ ino_t page_cgroup_ino(struct page *page)
return ino;
}

-static struct mem_cgroup_per_zone *
+static struct mem_cgroup_per_node *
mem_cgroup_page_zoneinfo(struct mem_cgroup *memcg, struct page *page)

This could be renamed to _nodeinfo()?

{
int nid = page_to_nid(page);
- int zid = page_zonenum(page);

- return &memcg->nodeinfo[nid]->zoneinfo[zid];
+ return memcg->nodeinfo[nid];
}