|
@@ -1048,6 +1048,9 @@ int __isolate_lru_page(struct page *page, isolate_mode_t mode, int file)
|
|
|
if ((mode & ISOLATE_CLEAN) && (PageDirty(page) || PageWriteback(page)))
|
|
|
return ret;
|
|
|
|
|
|
+ if ((mode & ISOLATE_UNMAPPED) && page_mapped(page))
|
|
|
+ return ret;
|
|
|
+
|
|
|
if (likely(get_page_unless_zero(page))) {
|
|
|
/*
|
|
|
* Be careful not to clear PageLRU until after we're
|
|
@@ -1471,6 +1474,12 @@ shrink_inactive_list(unsigned long nr_to_scan, struct zone *zone,
|
|
|
reclaim_mode |= ISOLATE_ACTIVE;
|
|
|
|
|
|
lru_add_drain();
|
|
|
+
|
|
|
+ if (!sc->may_unmap)
|
|
|
+ reclaim_mode |= ISOLATE_UNMAPPED;
|
|
|
+ if (!sc->may_writepage)
|
|
|
+ reclaim_mode |= ISOLATE_CLEAN;
|
|
|
+
|
|
|
spin_lock_irq(&zone->lru_lock);
|
|
|
|
|
|
if (scanning_global_lru(sc)) {
|
|
@@ -1588,19 +1597,26 @@ static void shrink_active_list(unsigned long nr_pages, struct zone *zone,
|
|
|
struct page *page;
|
|
|
struct zone_reclaim_stat *reclaim_stat = get_reclaim_stat(zone, sc);
|
|
|
unsigned long nr_rotated = 0;
|
|
|
+ isolate_mode_t reclaim_mode = ISOLATE_ACTIVE;
|
|
|
|
|
|
lru_add_drain();
|
|
|
+
|
|
|
+ if (!sc->may_unmap)
|
|
|
+ reclaim_mode |= ISOLATE_UNMAPPED;
|
|
|
+ if (!sc->may_writepage)
|
|
|
+ reclaim_mode |= ISOLATE_CLEAN;
|
|
|
+
|
|
|
spin_lock_irq(&zone->lru_lock);
|
|
|
if (scanning_global_lru(sc)) {
|
|
|
nr_taken = isolate_pages_global(nr_pages, &l_hold,
|
|
|
&pgscanned, sc->order,
|
|
|
- ISOLATE_ACTIVE, zone,
|
|
|
+ reclaim_mode, zone,
|
|
|
1, file);
|
|
|
zone->pages_scanned += pgscanned;
|
|
|
} else {
|
|
|
nr_taken = mem_cgroup_isolate_pages(nr_pages, &l_hold,
|
|
|
&pgscanned, sc->order,
|
|
|
- ISOLATE_ACTIVE, zone,
|
|
|
+ reclaim_mode, zone,
|
|
|
sc->mem_cgroup, 1, file);
|
|
|
/*
|
|
|
* mem_cgroup_isolate_pages() keeps track of
|