|
@@ -78,6 +78,12 @@ struct scan_control {
|
|
|
/* Which cgroup do we reclaim from */
|
|
|
struct mem_cgroup *mem_cgroup;
|
|
|
|
|
|
+ /*
|
|
|
+ * Nodemask of nodes allowed by the caller. If NULL, all nodes
|
|
|
+ * are scanned.
|
|
|
+ */
|
|
|
+ nodemask_t *nodemask;
|
|
|
+
|
|
|
/* Pluggable isolate pages callback */
|
|
|
unsigned long (*isolate_pages)(unsigned long nr, struct list_head *dst,
|
|
|
unsigned long *scanned, int order, int mode,
|
|
@@ -1538,7 +1544,8 @@ static void shrink_zones(int priority, struct zonelist *zonelist,
|
|
|
struct zone *zone;
|
|
|
|
|
|
sc->all_unreclaimable = 1;
|
|
|
- for_each_zone_zonelist(zone, z, zonelist, high_zoneidx) {
|
|
|
+ for_each_zone_zonelist_nodemask(zone, z, zonelist, high_zoneidx,
|
|
|
+ sc->nodemask) {
|
|
|
if (!populated_zone(zone))
|
|
|
continue;
|
|
|
/*
|
|
@@ -1683,7 +1690,7 @@ out:
|
|
|
}
|
|
|
|
|
|
unsigned long try_to_free_pages(struct zonelist *zonelist, int order,
|
|
|
- gfp_t gfp_mask)
|
|
|
+ gfp_t gfp_mask, nodemask_t *nodemask)
|
|
|
{
|
|
|
struct scan_control sc = {
|
|
|
.gfp_mask = gfp_mask,
|
|
@@ -1694,6 +1701,7 @@ unsigned long try_to_free_pages(struct zonelist *zonelist, int order,
|
|
|
.order = order,
|
|
|
.mem_cgroup = NULL,
|
|
|
.isolate_pages = isolate_pages_global,
|
|
|
+ .nodemask = nodemask,
|
|
|
};
|
|
|
|
|
|
return do_try_to_free_pages(zonelist, &sc);
|
|
@@ -1714,6 +1722,7 @@ unsigned long try_to_free_mem_cgroup_pages(struct mem_cgroup *mem_cont,
|
|
|
.order = 0,
|
|
|
.mem_cgroup = mem_cont,
|
|
|
.isolate_pages = mem_cgroup_isolate_pages,
|
|
|
+ .nodemask = NULL, /* we don't care the placement */
|
|
|
};
|
|
|
struct zonelist *zonelist;
|
|
|
|