|
@@ -1157,6 +1157,7 @@ get_page_from_freelist(gfp_t gfp_mask, unsigned int order,
|
|
nodemask_t *allowednodes = NULL;/* zonelist_cache approximation */
|
|
nodemask_t *allowednodes = NULL;/* zonelist_cache approximation */
|
|
int zlc_active = 0; /* set if using zonelist_cache */
|
|
int zlc_active = 0; /* set if using zonelist_cache */
|
|
int did_zlc_setup = 0; /* just call zlc_setup() one time */
|
|
int did_zlc_setup = 0; /* just call zlc_setup() one time */
|
|
|
|
+ enum zone_type highest_zoneidx = -1; /* Gets set for policy zonelists */
|
|
|
|
|
|
zonelist_scan:
|
|
zonelist_scan:
|
|
/*
|
|
/*
|
|
@@ -1166,6 +1167,18 @@ zonelist_scan:
|
|
z = zonelist->zones;
|
|
z = zonelist->zones;
|
|
|
|
|
|
do {
|
|
do {
|
|
|
|
+ /*
|
|
|
|
+ * In NUMA, this could be a policy zonelist which contains
|
|
|
|
+ * zones that may not be allowed by the current gfp_mask.
|
|
|
|
+ * Check the zone is allowed by the current flags
|
|
|
|
+ */
|
|
|
|
+ if (unlikely(alloc_should_filter_zonelist(zonelist))) {
|
|
|
|
+ if (highest_zoneidx == -1)
|
|
|
|
+ highest_zoneidx = gfp_zone(gfp_mask);
|
|
|
|
+ if (zone_idx(*z) > highest_zoneidx)
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+
|
|
if (NUMA_BUILD && zlc_active &&
|
|
if (NUMA_BUILD && zlc_active &&
|
|
!zlc_zone_worth_trying(zonelist, z, allowednodes))
|
|
!zlc_zone_worth_trying(zonelist, z, allowednodes))
|
|
continue;
|
|
continue;
|