Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 186220
b: refs/heads/master
c: 6457474
h: refs/heads/master
v: v3
  • Loading branch information
Johannes Weiner authored and Linus Torvalds committed Mar 6, 2010
1 parent 18bbb59 commit 37d1c79
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 15 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: 31c0569c3b0b6cc8a867ac6665ca081553f7984c
refs/heads/master: 645747462435d84c6c6a64269ed49cc3015f753d
2 changes: 1 addition & 1 deletion trunk/include/linux/rmap.h
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,7 @@ static inline int page_referenced(struct page *page, int is_locked,
unsigned long *vm_flags)
{
*vm_flags = 0;
return TestClearPageReferenced(page);
return 0;
}

#define try_to_unmap(page, refs) SWAP_FAIL
Expand Down
3 changes: 0 additions & 3 deletions trunk/mm/rmap.c
Original file line number Diff line number Diff line change
Expand Up @@ -601,9 +601,6 @@ int page_referenced(struct page *page,
int referenced = 0;
int we_locked = 0;

if (TestClearPageReferenced(page))
referenced++;

*vm_flags = 0;
if (page_mapped(page) && page_rmapping(page)) {
if (!is_locked && (!PageAnon(page) || PageKsm(page))) {
Expand Down
45 changes: 35 additions & 10 deletions trunk/mm/vmscan.c
Original file line number Diff line number Diff line change
Expand Up @@ -561,18 +561,18 @@ void putback_lru_page(struct page *page)
enum page_references {
PAGEREF_RECLAIM,
PAGEREF_RECLAIM_CLEAN,
PAGEREF_KEEP,
PAGEREF_ACTIVATE,
};

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

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

/* Lumpy reclaim - ignore references */
if (sc->order > PAGE_ALLOC_COSTLY_ORDER)
Expand All @@ -585,11 +585,36 @@ static enum page_references page_check_references(struct page *page,
if (vm_flags & VM_LOCKED)
return PAGEREF_RECLAIM;

if (page_mapped(page))
return PAGEREF_ACTIVATE;
if (referenced_ptes) {
if (PageAnon(page))
return PAGEREF_ACTIVATE;
/*
* All mapped pages start out with page table
* references from the instantiating fault, so we need
* to look twice if a mapped file page is used more
* than once.
*
* Mark it and spare it for another trip around the
* inactive list. Another page table reference will
* lead to its activation.
*
* Note: the mark is set for activated pages as well
* so that recently deactivated but used pages are
* quickly recovered.
*/
SetPageReferenced(page);

if (referenced_page)
return PAGEREF_ACTIVATE;

return PAGEREF_KEEP;
}

/* Reclaim if clean, defer dirty pages to writeback */
return PAGEREF_RECLAIM_CLEAN;
if (referenced_page)
return PAGEREF_RECLAIM_CLEAN;

return PAGEREF_RECLAIM;
}

/*
Expand Down Expand Up @@ -657,6 +682,8 @@ static unsigned long shrink_page_list(struct list_head *page_list,
switch (references) {
case PAGEREF_ACTIVATE:
goto activate_locked;
case PAGEREF_KEEP:
goto keep_locked;
case PAGEREF_RECLAIM:
case PAGEREF_RECLAIM_CLEAN:
; /* try to reclaim the page below */
Expand Down Expand Up @@ -1359,9 +1386,7 @@ static void shrink_active_list(unsigned long nr_pages, struct zone *zone,
continue;
}

/* page_referenced clears PageReferenced */
if (page_mapped(page) &&
page_referenced(page, 0, sc->mem_cgroup, &vm_flags)) {
if (page_referenced(page, 0, sc->mem_cgroup, &vm_flags)) {
nr_rotated++;
/*
* Identify referenced, file-backed active pages and
Expand Down

0 comments on commit 37d1c79

Please sign in to comment.