|
@@ -909,7 +909,8 @@ int isolate_lru_page(struct page *page)
|
|
|
* of reclaimed pages
|
|
|
*/
|
|
|
static unsigned long shrink_inactive_list(unsigned long max_scan,
|
|
|
- struct zone *zone, struct scan_control *sc, int file)
|
|
|
+ struct zone *zone, struct scan_control *sc,
|
|
|
+ int priority, int file)
|
|
|
{
|
|
|
LIST_HEAD(page_list);
|
|
|
struct pagevec pvec;
|
|
@@ -927,8 +928,19 @@ static unsigned long shrink_inactive_list(unsigned long max_scan,
|
|
|
unsigned long nr_freed;
|
|
|
unsigned long nr_active;
|
|
|
unsigned int count[NR_LRU_LISTS] = { 0, };
|
|
|
- int mode = (sc->order > PAGE_ALLOC_COSTLY_ORDER) ?
|
|
|
- ISOLATE_BOTH : ISOLATE_INACTIVE;
|
|
|
+ int mode = ISOLATE_INACTIVE;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * If we need a large contiguous chunk of memory, or have
|
|
|
+ * trouble getting a small set of contiguous pages, we
|
|
|
+ * will reclaim both active and inactive pages.
|
|
|
+ *
|
|
|
+ * We use the same threshold as pageout congestion_wait below.
|
|
|
+ */
|
|
|
+ if (sc->order > PAGE_ALLOC_COSTLY_ORDER)
|
|
|
+ mode = ISOLATE_BOTH;
|
|
|
+ else if (sc->order && priority < DEF_PRIORITY - 2)
|
|
|
+ mode = ISOLATE_BOTH;
|
|
|
|
|
|
nr_taken = sc->isolate_pages(sc->swap_cluster_max,
|
|
|
&page_list, &nr_scan, sc->order, mode,
|
|
@@ -1172,7 +1184,7 @@ static unsigned long shrink_list(enum lru_list lru, unsigned long nr_to_scan,
|
|
|
shrink_active_list(nr_to_scan, zone, sc, priority, file);
|
|
|
return 0;
|
|
|
}
|
|
|
- return shrink_inactive_list(nr_to_scan, zone, sc, file);
|
|
|
+ return shrink_inactive_list(nr_to_scan, zone, sc, priority, file);
|
|
|
}
|
|
|
|
|
|
/*
|