Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 186218
b: refs/heads/master
c: dfc8d63
h: refs/heads/master
v: v3
  • Loading branch information
Johannes Weiner authored and Linus Torvalds committed Mar 6, 2010
1 parent f60705d commit 956f1ab
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 14 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: e7c84ee22b8321fa0130a53d4c9806474d62eff0
refs/heads/master: dfc8d636cdb95f7b792d5ba8c9f3b295809c125d
56 changes: 43 additions & 13 deletions trunk/mm/vmscan.c
Original file line number Diff line number Diff line change
Expand Up @@ -579,6 +579,40 @@ void putback_lru_page(struct page *page)
put_page(page); /* drop ref from isolate */
}

enum page_references {
PAGEREF_RECLAIM,
PAGEREF_RECLAIM_CLEAN,
PAGEREF_ACTIVATE,
};

static enum page_references page_check_references(struct page *page,
struct scan_control *sc)
{
unsigned long vm_flags;
int referenced;

referenced = page_referenced(page, 1, sc->mem_cgroup, &vm_flags);
if (!referenced)
return PAGEREF_RECLAIM;

/* Lumpy reclaim - ignore references */
if (sc->order > PAGE_ALLOC_COSTLY_ORDER)
return PAGEREF_RECLAIM;

/*
* Mlock lost the isolation race with us. Let try_to_unmap()
* move the page to the unevictable list.
*/
if (vm_flags & VM_LOCKED)
return PAGEREF_RECLAIM;

if (page_mapping_inuse(page))
return PAGEREF_ACTIVATE;

/* Reclaim if clean, defer dirty pages to writeback */
return PAGEREF_RECLAIM_CLEAN;
}

/*
* shrink_page_list() returns the number of reclaimed pages
*/
Expand All @@ -590,16 +624,15 @@ static unsigned long shrink_page_list(struct list_head *page_list,
struct pagevec freed_pvec;
int pgactivate = 0;
unsigned long nr_reclaimed = 0;
unsigned long vm_flags;

cond_resched();

pagevec_init(&freed_pvec, 1);
while (!list_empty(page_list)) {
enum page_references references;
struct address_space *mapping;
struct page *page;
int may_enter_fs;
int referenced;

cond_resched();

Expand Down Expand Up @@ -641,17 +674,14 @@ static unsigned long shrink_page_list(struct list_head *page_list,
goto keep_locked;
}

referenced = page_referenced(page, 1,
sc->mem_cgroup, &vm_flags);
/*
* In active use or really unfreeable? Activate it.
* If page which have PG_mlocked lost isoltation race,
* try_to_unmap moves it to unevictable list
*/
if (sc->order <= PAGE_ALLOC_COSTLY_ORDER &&
referenced && page_mapping_inuse(page)
&& !(vm_flags & VM_LOCKED))
references = page_check_references(page, sc);
switch (references) {
case PAGEREF_ACTIVATE:
goto activate_locked;
case PAGEREF_RECLAIM:
case PAGEREF_RECLAIM_CLEAN:
; /* try to reclaim the page below */
}

/*
* Anonymous process memory has backing store?
Expand Down Expand Up @@ -685,7 +715,7 @@ static unsigned long shrink_page_list(struct list_head *page_list,
}

if (PageDirty(page)) {
if (sc->order <= PAGE_ALLOC_COSTLY_ORDER && referenced)
if (references == PAGEREF_RECLAIM_CLEAN)
goto keep_locked;
if (!may_enter_fs)
goto keep_locked;
Expand Down

0 comments on commit 956f1ab

Please sign in to comment.