Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 356489
b: refs/heads/master
c: 9a26511
h: refs/heads/master
i:
  356487: 8d37749
v: v3
  • Loading branch information
Johannes Weiner authored and Linus Torvalds committed Feb 24, 2013
1 parent a2698c3 commit 9f53283
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 22 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: 11d16c25bbf7a3b7a43d7472e175cdd52961757d
refs/heads/master: 9a2651140ef740b3b67ad47ea3d0af75581aacc6
65 changes: 44 additions & 21 deletions trunk/mm/vmscan.c
Original file line number Diff line number Diff line change
Expand Up @@ -1638,6 +1638,13 @@ static int vmscan_swappiness(struct scan_control *sc)
return mem_cgroup_swappiness(sc->target_mem_cgroup);
}

enum scan_balance {
SCAN_EQUAL,
SCAN_FRACT,
SCAN_ANON,
SCAN_FILE,
};

/*
* Determine how aggressively the anon and file LRU lists should be
* scanned. The relative value of each set of LRU lists is determined
Expand All @@ -1650,14 +1657,16 @@ static int vmscan_swappiness(struct scan_control *sc)
static void get_scan_count(struct lruvec *lruvec, struct scan_control *sc,
unsigned long *nr)
{
unsigned long anon, file, free;
struct zone_reclaim_stat *reclaim_stat = &lruvec->reclaim_stat;
u64 fraction[2];
u64 denominator = 0; /* gcc */
struct zone *zone = lruvec_zone(lruvec);
unsigned long anon_prio, file_prio;
enum scan_balance scan_balance;
unsigned long anon, file, free;
bool force_scan = false;
unsigned long ap, fp;
struct zone_reclaim_stat *reclaim_stat = &lruvec->reclaim_stat;
u64 fraction[2], denominator;
enum lru_list lru;
bool force_scan = false;
struct zone *zone = lruvec_zone(lruvec);

/*
* If the zone or memcg is small, nr[l] can be 0. This
Expand All @@ -1676,9 +1685,7 @@ static void get_scan_count(struct lruvec *lruvec, struct scan_control *sc,

/* If we have no swap space, do not bother scanning anon pages. */
if (!sc->may_swap || (nr_swap_pages <= 0)) {
fraction[0] = 0;
fraction[1] = 1;
denominator = 1;
scan_balance = SCAN_FILE;
goto out;
}

Expand All @@ -1690,9 +1697,7 @@ static void get_scan_count(struct lruvec *lruvec, struct scan_control *sc,
* too expensive.
*/
if (!global_reclaim(sc) && !vmscan_swappiness(sc)) {
fraction[0] = 0;
fraction[1] = 1;
denominator = 1;
scan_balance = SCAN_FILE;
goto out;
}

Expand All @@ -1702,9 +1707,7 @@ static void get_scan_count(struct lruvec *lruvec, struct scan_control *sc,
* (unless the swappiness setting disagrees with swapping).
*/
if (!sc->priority && vmscan_swappiness(sc)) {
fraction[0] = 1;
fraction[1] = 1;
denominator = 1;
scan_balance = SCAN_EQUAL;
goto out;
}

Expand All @@ -1722,9 +1725,7 @@ static void get_scan_count(struct lruvec *lruvec, struct scan_control *sc,
if (global_reclaim(sc)) {
free = zone_page_state(zone, NR_FREE_PAGES);
if (unlikely(file + free <= high_wmark_pages(zone))) {
fraction[0] = 1;
fraction[1] = 0;
denominator = 1;
scan_balance = SCAN_ANON;
goto out;
}
}
Expand All @@ -1734,12 +1735,12 @@ static void get_scan_count(struct lruvec *lruvec, struct scan_control *sc,
* anything from the anonymous working set right now.
*/
if (!inactive_file_is_low(lruvec)) {
fraction[0] = 0;
fraction[1] = 1;
denominator = 1;
scan_balance = SCAN_FILE;
goto out;
}

scan_balance = SCAN_FRACT;

/*
* With swappiness at 100, anonymous and file have the same priority.
* This scanning priority is essentially the inverse of IO cost.
Expand Down Expand Up @@ -1792,9 +1793,31 @@ static void get_scan_count(struct lruvec *lruvec, struct scan_control *sc,

size = get_lru_size(lruvec, lru);
scan = size >> sc->priority;

if (!scan && force_scan)
scan = min(size, SWAP_CLUSTER_MAX);
scan = div64_u64(scan * fraction[file], denominator);

switch (scan_balance) {
case SCAN_EQUAL:
/* Scan lists relative to size */
break;
case SCAN_FRACT:
/*
* Scan types proportional to swappiness and
* their relative recent reclaim efficiency.
*/
scan = div64_u64(scan * fraction[file], denominator);
break;
case SCAN_FILE:
case SCAN_ANON:
/* Scan one type exclusively */
if ((scan_balance == SCAN_FILE) != file)
scan = 0;
break;
default:
/* Look ma, no brain */
BUG();
}
nr[lru] = scan;
}
}
Expand Down

0 comments on commit 9f53283

Please sign in to comment.