mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-23 07:01:23 +00:00
mm/page_alloc: integrate classzone_idx and high_zoneidx
classzone_idx is just different name for high_zoneidx now. So, integrate them and add some comment to struct alloc_context in order to reduce future confusion about the meaning of this variable. The accessor, ac_classzone_idx() is also removed since it isn't needed after integration. In addition to integration, this patch also renames high_zoneidx to highest_zoneidx since it represents more precise meaning. Signed-off-by: Joonsoo Kim <iamjoonsoo.kim@lge.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Reviewed-by: Baoquan He <bhe@redhat.com> Acked-by: Vlastimil Babka <vbabka@suse.cz> Acked-by: David Rientjes <rientjes@google.com> Cc: Johannes Weiner <hannes@cmpxchg.org> Cc: Mel Gorman <mgorman@techsingularity.net> Cc: Michal Hocko <mhocko@kernel.org> Cc: Minchan Kim <minchan@kernel.org> Cc: Ye Xiaolong <xiaolong.ye@intel.com> Link: http://lkml.kernel.org/r/1587095923-7515-3-git-send-email-iamjoonsoo.kim@lge.com Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
3334a45eb9
commit
97a225e69a
12 changed files with 175 additions and 150 deletions
|
@ -2593,7 +2593,7 @@ static bool unreserve_highatomic_pageblock(const struct alloc_context *ac,
|
|||
int order;
|
||||
bool ret;
|
||||
|
||||
for_each_zone_zonelist_nodemask(zone, z, zonelist, ac->high_zoneidx,
|
||||
for_each_zone_zonelist_nodemask(zone, z, zonelist, ac->highest_zoneidx,
|
||||
ac->nodemask) {
|
||||
/*
|
||||
* Preserve at least one pageblock unless memory pressure
|
||||
|
@ -3462,7 +3462,7 @@ ALLOW_ERROR_INJECTION(should_fail_alloc_page, TRUE);
|
|||
* to check in the allocation paths if no pages are free.
|
||||
*/
|
||||
bool __zone_watermark_ok(struct zone *z, unsigned int order, unsigned long mark,
|
||||
int classzone_idx, unsigned int alloc_flags,
|
||||
int highest_zoneidx, unsigned int alloc_flags,
|
||||
long free_pages)
|
||||
{
|
||||
long min = mark;
|
||||
|
@ -3507,7 +3507,7 @@ bool __zone_watermark_ok(struct zone *z, unsigned int order, unsigned long mark,
|
|||
* are not met, then a high-order request also cannot go ahead
|
||||
* even if a suitable page happened to be free.
|
||||
*/
|
||||
if (free_pages <= min + z->lowmem_reserve[classzone_idx])
|
||||
if (free_pages <= min + z->lowmem_reserve[highest_zoneidx])
|
||||
return false;
|
||||
|
||||
/* If this is an order-0 request then the watermark is fine */
|
||||
|
@ -3540,14 +3540,15 @@ bool __zone_watermark_ok(struct zone *z, unsigned int order, unsigned long mark,
|
|||
}
|
||||
|
||||
bool zone_watermark_ok(struct zone *z, unsigned int order, unsigned long mark,
|
||||
int classzone_idx, unsigned int alloc_flags)
|
||||
int highest_zoneidx, unsigned int alloc_flags)
|
||||
{
|
||||
return __zone_watermark_ok(z, order, mark, classzone_idx, alloc_flags,
|
||||
return __zone_watermark_ok(z, order, mark, highest_zoneidx, alloc_flags,
|
||||
zone_page_state(z, NR_FREE_PAGES));
|
||||
}
|
||||
|
||||
static inline bool zone_watermark_fast(struct zone *z, unsigned int order,
|
||||
unsigned long mark, int classzone_idx, unsigned int alloc_flags)
|
||||
unsigned long mark, int highest_zoneidx,
|
||||
unsigned int alloc_flags)
|
||||
{
|
||||
long free_pages = zone_page_state(z, NR_FREE_PAGES);
|
||||
long cma_pages = 0;
|
||||
|
@ -3565,22 +3566,23 @@ static inline bool zone_watermark_fast(struct zone *z, unsigned int order,
|
|||
* the caller is !atomic then it'll uselessly search the free
|
||||
* list. That corner case is then slower but it is harmless.
|
||||
*/
|
||||
if (!order && (free_pages - cma_pages) > mark + z->lowmem_reserve[classzone_idx])
|
||||
if (!order && (free_pages - cma_pages) >
|
||||
mark + z->lowmem_reserve[highest_zoneidx])
|
||||
return true;
|
||||
|
||||
return __zone_watermark_ok(z, order, mark, classzone_idx, alloc_flags,
|
||||
return __zone_watermark_ok(z, order, mark, highest_zoneidx, alloc_flags,
|
||||
free_pages);
|
||||
}
|
||||
|
||||
bool zone_watermark_ok_safe(struct zone *z, unsigned int order,
|
||||
unsigned long mark, int classzone_idx)
|
||||
unsigned long mark, int highest_zoneidx)
|
||||
{
|
||||
long free_pages = zone_page_state(z, NR_FREE_PAGES);
|
||||
|
||||
if (z->percpu_drift_mark && free_pages < z->percpu_drift_mark)
|
||||
free_pages = zone_page_state_snapshot(z, NR_FREE_PAGES);
|
||||
|
||||
return __zone_watermark_ok(z, order, mark, classzone_idx, 0,
|
||||
return __zone_watermark_ok(z, order, mark, highest_zoneidx, 0,
|
||||
free_pages);
|
||||
}
|
||||
|
||||
|
@ -3657,8 +3659,8 @@ retry:
|
|||
*/
|
||||
no_fallback = alloc_flags & ALLOC_NOFRAGMENT;
|
||||
z = ac->preferred_zoneref;
|
||||
for_next_zone_zonelist_nodemask(zone, z, ac->zonelist, ac->high_zoneidx,
|
||||
ac->nodemask) {
|
||||
for_next_zone_zonelist_nodemask(zone, z, ac->zonelist,
|
||||
ac->highest_zoneidx, ac->nodemask) {
|
||||
struct page *page;
|
||||
unsigned long mark;
|
||||
|
||||
|
@ -3713,7 +3715,7 @@ retry:
|
|||
|
||||
mark = wmark_pages(zone, alloc_flags & ALLOC_WMARK_MASK);
|
||||
if (!zone_watermark_fast(zone, order, mark,
|
||||
ac_classzone_idx(ac), alloc_flags)) {
|
||||
ac->highest_zoneidx, alloc_flags)) {
|
||||
int ret;
|
||||
|
||||
#ifdef CONFIG_DEFERRED_STRUCT_PAGE_INIT
|
||||
|
@ -3746,7 +3748,7 @@ retry:
|
|||
default:
|
||||
/* did we reclaim enough */
|
||||
if (zone_watermark_ok(zone, order, mark,
|
||||
ac_classzone_idx(ac), alloc_flags))
|
||||
ac->highest_zoneidx, alloc_flags))
|
||||
goto try_this_zone;
|
||||
|
||||
continue;
|
||||
|
@ -3905,7 +3907,7 @@ __alloc_pages_may_oom(gfp_t gfp_mask, unsigned int order,
|
|||
if (gfp_mask & __GFP_RETRY_MAYFAIL)
|
||||
goto out;
|
||||
/* The OOM killer does not needlessly kill tasks for lowmem */
|
||||
if (ac->high_zoneidx < ZONE_NORMAL)
|
||||
if (ac->highest_zoneidx < ZONE_NORMAL)
|
||||
goto out;
|
||||
if (pm_suspended_storage())
|
||||
goto out;
|
||||
|
@ -4108,10 +4110,10 @@ should_compact_retry(struct alloc_context *ac, unsigned int order, int alloc_fla
|
|||
* Let's give them a good hope and keep retrying while the order-0
|
||||
* watermarks are OK.
|
||||
*/
|
||||
for_each_zone_zonelist_nodemask(zone, z, ac->zonelist, ac->high_zoneidx,
|
||||
ac->nodemask) {
|
||||
for_each_zone_zonelist_nodemask(zone, z, ac->zonelist,
|
||||
ac->highest_zoneidx, ac->nodemask) {
|
||||
if (zone_watermark_ok(zone, 0, min_wmark_pages(zone),
|
||||
ac_classzone_idx(ac), alloc_flags))
|
||||
ac->highest_zoneidx, alloc_flags))
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
@ -4235,12 +4237,12 @@ static void wake_all_kswapds(unsigned int order, gfp_t gfp_mask,
|
|||
struct zoneref *z;
|
||||
struct zone *zone;
|
||||
pg_data_t *last_pgdat = NULL;
|
||||
enum zone_type high_zoneidx = ac->high_zoneidx;
|
||||
enum zone_type highest_zoneidx = ac->highest_zoneidx;
|
||||
|
||||
for_each_zone_zonelist_nodemask(zone, z, ac->zonelist, high_zoneidx,
|
||||
for_each_zone_zonelist_nodemask(zone, z, ac->zonelist, highest_zoneidx,
|
||||
ac->nodemask) {
|
||||
if (last_pgdat != zone->zone_pgdat)
|
||||
wakeup_kswapd(zone, gfp_mask, order, high_zoneidx);
|
||||
wakeup_kswapd(zone, gfp_mask, order, highest_zoneidx);
|
||||
last_pgdat = zone->zone_pgdat;
|
||||
}
|
||||
}
|
||||
|
@ -4375,8 +4377,8 @@ should_reclaim_retry(gfp_t gfp_mask, unsigned order,
|
|||
* request even if all reclaimable pages are considered then we are
|
||||
* screwed and have to go OOM.
|
||||
*/
|
||||
for_each_zone_zonelist_nodemask(zone, z, ac->zonelist, ac->high_zoneidx,
|
||||
ac->nodemask) {
|
||||
for_each_zone_zonelist_nodemask(zone, z, ac->zonelist,
|
||||
ac->highest_zoneidx, ac->nodemask) {
|
||||
unsigned long available;
|
||||
unsigned long reclaimable;
|
||||
unsigned long min_wmark = min_wmark_pages(zone);
|
||||
|
@ -4390,7 +4392,7 @@ should_reclaim_retry(gfp_t gfp_mask, unsigned order,
|
|||
* reclaimable pages?
|
||||
*/
|
||||
wmark = __zone_watermark_ok(zone, order, min_wmark,
|
||||
ac_classzone_idx(ac), alloc_flags, available);
|
||||
ac->highest_zoneidx, alloc_flags, available);
|
||||
trace_reclaim_retry_zone(z, order, reclaimable,
|
||||
available, min_wmark, *no_progress_loops, wmark);
|
||||
if (wmark) {
|
||||
|
@ -4509,7 +4511,7 @@ retry_cpuset:
|
|||
* could end up iterating over non-eligible zones endlessly.
|
||||
*/
|
||||
ac->preferred_zoneref = first_zones_zonelist(ac->zonelist,
|
||||
ac->high_zoneidx, ac->nodemask);
|
||||
ac->highest_zoneidx, ac->nodemask);
|
||||
if (!ac->preferred_zoneref->zone)
|
||||
goto nopage;
|
||||
|
||||
|
@ -4596,7 +4598,7 @@ retry:
|
|||
if (!(alloc_flags & ALLOC_CPUSET) || reserve_flags) {
|
||||
ac->nodemask = NULL;
|
||||
ac->preferred_zoneref = first_zones_zonelist(ac->zonelist,
|
||||
ac->high_zoneidx, ac->nodemask);
|
||||
ac->highest_zoneidx, ac->nodemask);
|
||||
}
|
||||
|
||||
/* Attempt with potentially adjusted zonelist and alloc_flags */
|
||||
|
@ -4730,7 +4732,7 @@ static inline bool prepare_alloc_pages(gfp_t gfp_mask, unsigned int order,
|
|||
struct alloc_context *ac, gfp_t *alloc_mask,
|
||||
unsigned int *alloc_flags)
|
||||
{
|
||||
ac->high_zoneidx = gfp_zone(gfp_mask);
|
||||
ac->highest_zoneidx = gfp_zone(gfp_mask);
|
||||
ac->zonelist = node_zonelist(preferred_nid, gfp_mask);
|
||||
ac->nodemask = nodemask;
|
||||
ac->migratetype = gfpflags_to_migratetype(gfp_mask);
|
||||
|
@ -4769,7 +4771,7 @@ static inline void finalise_ac(gfp_t gfp_mask, struct alloc_context *ac)
|
|||
* may get reset for allocations that ignore memory policies.
|
||||
*/
|
||||
ac->preferred_zoneref = first_zones_zonelist(ac->zonelist,
|
||||
ac->high_zoneidx, ac->nodemask);
|
||||
ac->highest_zoneidx, ac->nodemask);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -6867,7 +6869,7 @@ static void __init free_area_init_node(int nid)
|
|||
unsigned long end_pfn = 0;
|
||||
|
||||
/* pg_data_t should be reset to zero when it's allocated */
|
||||
WARN_ON(pgdat->nr_zones || pgdat->kswapd_classzone_idx);
|
||||
WARN_ON(pgdat->nr_zones || pgdat->kswapd_highest_zoneidx);
|
||||
|
||||
get_pfn_range_for_nid(nid, &start_pfn, &end_pfn);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue