|
@@ -471,6 +471,39 @@ void mem_cgroup_record_reclaim_priority(struct mem_cgroup *mem, int priority)
|
|
|
mem->prev_priority = priority;
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * Calculate # of pages to be scanned in this priority/zone.
|
|
|
+ * See also vmscan.c
|
|
|
+ *
|
|
|
+ * priority starts from "DEF_PRIORITY" and decremented in each loop.
|
|
|
+ * (see include/linux/mmzone.h)
|
|
|
+ */
|
|
|
+
|
|
|
+long mem_cgroup_calc_reclaim_active(struct mem_cgroup *mem,
|
|
|
+ struct zone *zone, int priority)
|
|
|
+{
|
|
|
+ long nr_active;
|
|
|
+ int nid = zone->zone_pgdat->node_id;
|
|
|
+ int zid = zone_idx(zone);
|
|
|
+ struct mem_cgroup_per_zone *mz = mem_cgroup_zoneinfo(mem, nid, zid);
|
|
|
+
|
|
|
+ nr_active = MEM_CGROUP_ZSTAT(mz, MEM_CGROUP_ZSTAT_ACTIVE);
|
|
|
+ return (nr_active >> priority);
|
|
|
+}
|
|
|
+
|
|
|
+long mem_cgroup_calc_reclaim_inactive(struct mem_cgroup *mem,
|
|
|
+ struct zone *zone, int priority)
|
|
|
+{
|
|
|
+ long nr_inactive;
|
|
|
+ int nid = zone->zone_pgdat->node_id;
|
|
|
+ int zid = zone_idx(zone);
|
|
|
+ struct mem_cgroup_per_zone *mz = mem_cgroup_zoneinfo(mem, nid, zid);
|
|
|
+
|
|
|
+ nr_inactive = MEM_CGROUP_ZSTAT(mz, MEM_CGROUP_ZSTAT_INACTIVE);
|
|
|
+
|
|
|
+ return (nr_inactive >> priority);
|
|
|
+}
|
|
|
+
|
|
|
unsigned long mem_cgroup_isolate_pages(unsigned long nr_to_scan,
|
|
|
struct list_head *dst,
|
|
|
unsigned long *scanned, int order,
|