On Thu, 7 Jul 2011 15:52:17 +0900 KAMEZAWA Hiroyuki <kamezawa.hiroyu@xxxxxxxxxxxxxx> wrote: > In mm/memcontrol.c, there are many lru stat functions as.. > > mem_cgroup_zone_nr_lru_pages > mem_cgroup_node_nr_file_lru_pages > mem_cgroup_nr_file_lru_pages > mem_cgroup_node_nr_anon_lru_pages > mem_cgroup_nr_anon_lru_pages > mem_cgroup_node_nr_unevictable_lru_pages > mem_cgroup_nr_unevictable_lru_pages > mem_cgroup_node_nr_lru_pages > mem_cgroup_nr_lru_pages > mem_cgroup_get_local_zonestat > > Some of them are under #ifdef MAX_NUMNODES >1 and others are not. > This seems bad. This patch consolidates all functions into > > mem_cgroup_zone_nr_lru_pages() > mem_cgroup_node_nr_lru_pages() > mem_cgroup_nr_lru_pages() > > For these functions, "which LRU?" information is passed by a mask. > > example) > mem_cgroup_nr_lru_pages(mem, BIT(LRU_ACTIVE_ANON)) > > And I added some macro as ALL_LRU, ALL_LRU_FILE, ALL_LRU_ANON. > example) > mem_cgroup_nr_lru_pages(mem, ALL_LRU) > > BTW, considering layout of NUMA memory placement of counters, this patch seems > to be better. > > Now, when we gather all LRU information, we scan in following orer > for_each_lru -> for_each_node -> for_each_zone. > > This means we'll touch cache lines in different node in turn. > > After patch, we'll scan > for_each_node -> for_each_zone -> for_each_lru(mask) > > Then, we'll gather information in the same cacheline at once. mm/vmscan.c: In function 'zone_nr_lru_pages': mm/vmscan.c:175: warning: passing argument 2 of 'mem_cgroup_zone_nr_lru_pages' makes pointer from integer without a cast include/linux/memcontrol.h:307: note: expected 'struct zone *' but argument is of type 'int' mm/vmscan.c:175: error: too many arguments to function 'mem_cgroup_zone_nr_lru_pages' --- a/include/linux/memcontrol.h~memcg-consolidates-memory-cgroup-lru-stat-functions-fix +++ a/include/linux/memcontrol.h @@ -304,8 +304,8 @@ mem_cgroup_inactive_file_is_low(struct m } static inline unsigned long -mem_cgroup_zone_nr_lru_pages(struct mem_cgroup *memcg, struct zone *zone, - enum lru_list lru) +mem_cgroup_zone_nr_lru_pages(struct mem_cgroup *memcg, int nid, int zid, + unsigned int lru_mask) { return 0; } > +unsigned long > +mem_cgroup_zone_nr_lru_pages(struct mem_cgroup *mem, int nid, int zid, > + unsigned int lru_mask) The memcg code sometimes uses "struct mem_cgroup *mem" and sometimes uses "struct mem_cgroup *memcg". That's irritating. I think "memcg" is better. -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/ Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>