|
@@ -2704,7 +2704,7 @@ static struct page *
|
|
|
get_page_from_freelist(gfp_t gfp_mask, unsigned int order, int alloc_flags,
|
|
|
const struct alloc_context *ac)
|
|
|
{
|
|
|
- struct zoneref *z;
|
|
|
+ struct zoneref *z = ac->preferred_zoneref;
|
|
|
struct zone *zone;
|
|
|
bool fair_skipped = false;
|
|
|
bool apply_fair = (alloc_flags & ALLOC_FAIR);
|
|
@@ -2714,7 +2714,7 @@ zonelist_scan:
|
|
|
* Scan zonelist, looking for a zone with enough free.
|
|
|
* See also __cpuset_node_allowed() comment in kernel/cpuset.c.
|
|
|
*/
|
|
|
- for_each_zone_zonelist_nodemask(zone, z, ac->zonelist, ac->high_zoneidx,
|
|
|
+ for_next_zone_zonelist_nodemask(zone, z, ac->zonelist, ac->high_zoneidx,
|
|
|
ac->nodemask) {
|
|
|
struct page *page;
|
|
|
unsigned long mark;
|
|
@@ -2734,7 +2734,7 @@ zonelist_scan:
|
|
|
fair_skipped = true;
|
|
|
continue;
|
|
|
}
|
|
|
- if (!zone_local(ac->preferred_zone, zone)) {
|
|
|
+ if (!zone_local(ac->preferred_zoneref->zone, zone)) {
|
|
|
if (fair_skipped)
|
|
|
goto reset_fair;
|
|
|
apply_fair = false;
|
|
@@ -2780,7 +2780,7 @@ zonelist_scan:
|
|
|
goto try_this_zone;
|
|
|
|
|
|
if (zone_reclaim_mode == 0 ||
|
|
|
- !zone_allows_reclaim(ac->preferred_zone, zone))
|
|
|
+ !zone_allows_reclaim(ac->preferred_zoneref->zone, zone))
|
|
|
continue;
|
|
|
|
|
|
ret = zone_reclaim(zone, gfp_mask, order);
|
|
@@ -2802,7 +2802,7 @@ zonelist_scan:
|
|
|
}
|
|
|
|
|
|
try_this_zone:
|
|
|
- page = buffered_rmqueue(ac->preferred_zone, zone, order,
|
|
|
+ page = buffered_rmqueue(ac->preferred_zoneref->zone, zone, order,
|
|
|
gfp_mask, alloc_flags, ac->migratetype);
|
|
|
if (page) {
|
|
|
if (prep_new_page(page, order, gfp_mask, alloc_flags))
|
|
@@ -2831,7 +2831,7 @@ try_this_zone:
|
|
|
reset_fair:
|
|
|
apply_fair = false;
|
|
|
fair_skipped = false;
|
|
|
- reset_alloc_batches(ac->preferred_zone);
|
|
|
+ reset_alloc_batches(ac->preferred_zoneref->zone);
|
|
|
goto zonelist_scan;
|
|
|
}
|
|
|
|
|
@@ -3114,7 +3114,7 @@ static void wake_all_kswapds(unsigned int order, const struct alloc_context *ac)
|
|
|
|
|
|
for_each_zone_zonelist_nodemask(zone, z, ac->zonelist,
|
|
|
ac->high_zoneidx, ac->nodemask)
|
|
|
- wakeup_kswapd(zone, order, zone_idx(ac->preferred_zone));
|
|
|
+ wakeup_kswapd(zone, order, zonelist_zone_idx(ac->preferred_zoneref));
|
|
|
}
|
|
|
|
|
|
static inline unsigned int
|
|
@@ -3332,7 +3332,7 @@ retry:
|
|
|
if ((did_some_progress && order <= PAGE_ALLOC_COSTLY_ORDER) ||
|
|
|
((gfp_mask & __GFP_REPEAT) && pages_reclaimed < (1 << order))) {
|
|
|
/* Wait for some write requests to complete then retry */
|
|
|
- wait_iff_congested(ac->preferred_zone, BLK_RW_ASYNC, HZ/50);
|
|
|
+ wait_iff_congested(ac->preferred_zoneref->zone, BLK_RW_ASYNC, HZ/50);
|
|
|
goto retry;
|
|
|
}
|
|
|
|
|
@@ -3370,7 +3370,6 @@ struct page *
|
|
|
__alloc_pages_nodemask(gfp_t gfp_mask, unsigned int order,
|
|
|
struct zonelist *zonelist, nodemask_t *nodemask)
|
|
|
{
|
|
|
- struct zoneref *preferred_zoneref;
|
|
|
struct page *page;
|
|
|
unsigned int cpuset_mems_cookie;
|
|
|
unsigned int alloc_flags = ALLOC_WMARK_LOW|ALLOC_FAIR;
|
|
@@ -3416,14 +3415,14 @@ retry_cpuset:
|
|
|
ac.spread_dirty_pages = (gfp_mask & __GFP_WRITE);
|
|
|
|
|
|
/* The preferred zone is used for statistics later */
|
|
|
- preferred_zoneref = first_zones_zonelist(ac.zonelist, ac.high_zoneidx,
|
|
|
- ac.nodemask, &ac.preferred_zone);
|
|
|
- if (!ac.preferred_zone) {
|
|
|
+ ac.preferred_zoneref = first_zones_zonelist(ac.zonelist,
|
|
|
+ ac.high_zoneidx, ac.nodemask);
|
|
|
+ if (!ac.preferred_zoneref) {
|
|
|
page = NULL;
|
|
|
goto no_zone;
|
|
|
}
|
|
|
|
|
|
- ac.classzone_idx = zonelist_zone_idx(preferred_zoneref);
|
|
|
+ ac.classzone_idx = zonelist_zone_idx(ac.preferred_zoneref);
|
|
|
|
|
|
/* First allocation attempt */
|
|
|
page = get_page_from_freelist(alloc_mask, order, alloc_flags, &ac);
|
|
@@ -4462,13 +4461,12 @@ static void build_zonelists(pg_data_t *pgdat)
|
|
|
*/
|
|
|
int local_memory_node(int node)
|
|
|
{
|
|
|
- struct zone *zone;
|
|
|
+ struct zoneref *z;
|
|
|
|
|
|
- (void)first_zones_zonelist(node_zonelist(node, GFP_KERNEL),
|
|
|
+ z = first_zones_zonelist(node_zonelist(node, GFP_KERNEL),
|
|
|
gfp_zone(GFP_KERNEL),
|
|
|
- NULL,
|
|
|
- &zone);
|
|
|
- return zone->node;
|
|
|
+ NULL);
|
|
|
+ return z->zone->node;
|
|
|
}
|
|
|
#endif
|
|
|
|