mm: vmscan: remove reclaim_mode_t
There is little motiviation for reclaim_mode_t once RECLAIM_MODE_[A]SYNC and lumpy reclaim have been removed. This patch gets rid of reclaim_mode_t as well and improves the documentation about what reclaim/compaction is and when it is triggered. Signed-off-by: Mel Gorman <mgorman@suse.de> Acked-by: Rik van Riel <riel@redhat.com> Acked-by: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com> Cc: Konstantin Khlebnikov <khlebnikov@openvz.org> Cc: Hugh Dickins <hughd@google.com> Cc: Ying Han <yinghan@google.com> Cc: Andy Whitcroft <apw@shadowen.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
41ac1999c3
commit
23b9da55c5
|
@ -25,12 +25,12 @@
|
||||||
{RECLAIM_WB_ASYNC, "RECLAIM_WB_ASYNC"} \
|
{RECLAIM_WB_ASYNC, "RECLAIM_WB_ASYNC"} \
|
||||||
) : "RECLAIM_WB_NONE"
|
) : "RECLAIM_WB_NONE"
|
||||||
|
|
||||||
#define trace_reclaim_flags(page, sync) ( \
|
#define trace_reclaim_flags(page) ( \
|
||||||
(page_is_file_cache(page) ? RECLAIM_WB_FILE : RECLAIM_WB_ANON) | \
|
(page_is_file_cache(page) ? RECLAIM_WB_FILE : RECLAIM_WB_ANON) | \
|
||||||
(RECLAIM_WB_ASYNC) \
|
(RECLAIM_WB_ASYNC) \
|
||||||
)
|
)
|
||||||
|
|
||||||
#define trace_shrink_flags(file, sync) \
|
#define trace_shrink_flags(file) \
|
||||||
( \
|
( \
|
||||||
(file ? RECLAIM_WB_FILE : RECLAIM_WB_ANON) | \
|
(file ? RECLAIM_WB_FILE : RECLAIM_WB_ANON) | \
|
||||||
(RECLAIM_WB_ASYNC) \
|
(RECLAIM_WB_ASYNC) \
|
||||||
|
|
72
mm/vmscan.c
72
mm/vmscan.c
|
@ -53,16 +53,6 @@
|
||||||
#define CREATE_TRACE_POINTS
|
#define CREATE_TRACE_POINTS
|
||||||
#include <trace/events/vmscan.h>
|
#include <trace/events/vmscan.h>
|
||||||
|
|
||||||
/*
|
|
||||||
* reclaim_mode determines how the inactive list is shrunk
|
|
||||||
* RECLAIM_MODE_SINGLE: Reclaim only order-0 pages
|
|
||||||
* RECLAIM_MODE_COMPACTION: For high-order allocations, reclaim a number of
|
|
||||||
* order-0 pages and then compact the zone
|
|
||||||
*/
|
|
||||||
typedef unsigned __bitwise__ reclaim_mode_t;
|
|
||||||
#define RECLAIM_MODE_SINGLE ((__force reclaim_mode_t)0x01u)
|
|
||||||
#define RECLAIM_MODE_COMPACTION ((__force reclaim_mode_t)0x10u)
|
|
||||||
|
|
||||||
struct scan_control {
|
struct scan_control {
|
||||||
/* Incremented by the number of inactive pages that were scanned */
|
/* Incremented by the number of inactive pages that were scanned */
|
||||||
unsigned long nr_scanned;
|
unsigned long nr_scanned;
|
||||||
|
@ -88,12 +78,6 @@ struct scan_control {
|
||||||
|
|
||||||
int order;
|
int order;
|
||||||
|
|
||||||
/*
|
|
||||||
* Intend to reclaim enough continuous memory rather than reclaim
|
|
||||||
* enough amount of memory. i.e, mode for high order allocation.
|
|
||||||
*/
|
|
||||||
reclaim_mode_t reclaim_mode;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The memory cgroup that hit its limit and as a result is the
|
* The memory cgroup that hit its limit and as a result is the
|
||||||
* primary target of this reclaim invocation.
|
* primary target of this reclaim invocation.
|
||||||
|
@ -356,25 +340,6 @@ out:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void set_reclaim_mode(int priority, struct scan_control *sc)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* Restrict reclaim/compaction to costly allocations or when
|
|
||||||
* under memory pressure
|
|
||||||
*/
|
|
||||||
if (COMPACTION_BUILD && sc->order &&
|
|
||||||
(sc->order > PAGE_ALLOC_COSTLY_ORDER ||
|
|
||||||
priority < DEF_PRIORITY - 2))
|
|
||||||
sc->reclaim_mode = RECLAIM_MODE_COMPACTION;
|
|
||||||
else
|
|
||||||
sc->reclaim_mode = RECLAIM_MODE_SINGLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void reset_reclaim_mode(struct scan_control *sc)
|
|
||||||
{
|
|
||||||
sc->reclaim_mode = RECLAIM_MODE_SINGLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int is_page_cache_freeable(struct page *page)
|
static inline int is_page_cache_freeable(struct page *page)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
|
@ -497,8 +462,7 @@ static pageout_t pageout(struct page *page, struct address_space *mapping,
|
||||||
/* synchronous write or broken a_ops? */
|
/* synchronous write or broken a_ops? */
|
||||||
ClearPageReclaim(page);
|
ClearPageReclaim(page);
|
||||||
}
|
}
|
||||||
trace_mm_vmscan_writepage(page,
|
trace_mm_vmscan_writepage(page, trace_reclaim_flags(page));
|
||||||
trace_reclaim_flags(page, sc->reclaim_mode));
|
|
||||||
inc_zone_page_state(page, NR_VMSCAN_WRITE);
|
inc_zone_page_state(page, NR_VMSCAN_WRITE);
|
||||||
return PAGE_SUCCESS;
|
return PAGE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -953,7 +917,6 @@ cull_mlocked:
|
||||||
try_to_free_swap(page);
|
try_to_free_swap(page);
|
||||||
unlock_page(page);
|
unlock_page(page);
|
||||||
putback_lru_page(page);
|
putback_lru_page(page);
|
||||||
reset_reclaim_mode(sc);
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
activate_locked:
|
activate_locked:
|
||||||
|
@ -1348,8 +1311,6 @@ shrink_inactive_list(unsigned long nr_to_scan, struct mem_cgroup_zone *mz,
|
||||||
return SWAP_CLUSTER_MAX;
|
return SWAP_CLUSTER_MAX;
|
||||||
}
|
}
|
||||||
|
|
||||||
set_reclaim_mode(priority, sc);
|
|
||||||
|
|
||||||
lru_add_drain();
|
lru_add_drain();
|
||||||
|
|
||||||
if (!sc->may_unmap)
|
if (!sc->may_unmap)
|
||||||
|
@ -1433,7 +1394,7 @@ shrink_inactive_list(unsigned long nr_to_scan, struct mem_cgroup_zone *mz,
|
||||||
zone_idx(zone),
|
zone_idx(zone),
|
||||||
nr_scanned, nr_reclaimed,
|
nr_scanned, nr_reclaimed,
|
||||||
priority,
|
priority,
|
||||||
trace_shrink_flags(file, sc->reclaim_mode));
|
trace_shrink_flags(file));
|
||||||
return nr_reclaimed;
|
return nr_reclaimed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1512,8 +1473,6 @@ static void shrink_active_list(unsigned long nr_to_scan,
|
||||||
|
|
||||||
lru_add_drain();
|
lru_add_drain();
|
||||||
|
|
||||||
reset_reclaim_mode(sc);
|
|
||||||
|
|
||||||
if (!sc->may_unmap)
|
if (!sc->may_unmap)
|
||||||
isolate_mode |= ISOLATE_UNMAPPED;
|
isolate_mode |= ISOLATE_UNMAPPED;
|
||||||
if (!sc->may_writepage)
|
if (!sc->may_writepage)
|
||||||
|
@ -1826,23 +1785,35 @@ out:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Use reclaim/compaction for costly allocs or under memory pressure */
|
||||||
|
static bool in_reclaim_compaction(int priority, struct scan_control *sc)
|
||||||
|
{
|
||||||
|
if (COMPACTION_BUILD && sc->order &&
|
||||||
|
(sc->order > PAGE_ALLOC_COSTLY_ORDER ||
|
||||||
|
priority < DEF_PRIORITY - 2))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Reclaim/compaction depends on a number of pages being freed. To avoid
|
* Reclaim/compaction is used for high-order allocation requests. It reclaims
|
||||||
* disruption to the system, a small number of order-0 pages continue to be
|
* order-0 pages before compacting the zone. should_continue_reclaim() returns
|
||||||
* rotated and reclaimed in the normal fashion. However, by the time we get
|
* true if more pages should be reclaimed such that when the page allocator
|
||||||
* back to the allocator and call try_to_compact_zone(), we ensure that
|
* calls try_to_compact_zone() that it will have enough free pages to succeed.
|
||||||
* there are enough free pages for it to be likely successful
|
* It will give up earlier than that if there is difficulty reclaiming pages.
|
||||||
*/
|
*/
|
||||||
static inline bool should_continue_reclaim(struct mem_cgroup_zone *mz,
|
static inline bool should_continue_reclaim(struct mem_cgroup_zone *mz,
|
||||||
unsigned long nr_reclaimed,
|
unsigned long nr_reclaimed,
|
||||||
unsigned long nr_scanned,
|
unsigned long nr_scanned,
|
||||||
|
int priority,
|
||||||
struct scan_control *sc)
|
struct scan_control *sc)
|
||||||
{
|
{
|
||||||
unsigned long pages_for_compaction;
|
unsigned long pages_for_compaction;
|
||||||
unsigned long inactive_lru_pages;
|
unsigned long inactive_lru_pages;
|
||||||
|
|
||||||
/* If not in reclaim/compaction mode, stop */
|
/* If not in reclaim/compaction mode, stop */
|
||||||
if (!(sc->reclaim_mode & RECLAIM_MODE_COMPACTION))
|
if (!in_reclaim_compaction(priority, sc))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
/* Consider stopping depending on scan and reclaim activity */
|
/* Consider stopping depending on scan and reclaim activity */
|
||||||
|
@ -1944,7 +1915,8 @@ restart:
|
||||||
|
|
||||||
/* reclaim/compaction might need reclaim to continue */
|
/* reclaim/compaction might need reclaim to continue */
|
||||||
if (should_continue_reclaim(mz, nr_reclaimed,
|
if (should_continue_reclaim(mz, nr_reclaimed,
|
||||||
sc->nr_scanned - nr_scanned, sc))
|
sc->nr_scanned - nr_scanned,
|
||||||
|
priority, sc))
|
||||||
goto restart;
|
goto restart;
|
||||||
|
|
||||||
throttle_vm_writeout(sc->gfp_mask);
|
throttle_vm_writeout(sc->gfp_mask);
|
||||||
|
|
Loading…
Reference in a new issue