Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 272121
b: refs/heads/master
c: f11c0ca
h: refs/heads/master
i:
  272119: b409a0a
v: v3
  • Loading branch information
Johannes Weiner authored and Linus Torvalds committed Nov 1, 2011
1 parent 5604223 commit 56bc1be
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 25 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: 4f31888c104687078f8d88c2f11eca1080c88464
refs/heads/master: f11c0ca501af89fc07b0d9f17531ba3b68a4ef39
36 changes: 12 additions & 24 deletions trunk/mm/vmscan.c
Original file line number Diff line number Diff line change
Expand Up @@ -1817,12 +1817,19 @@ static void get_scan_count(struct zone *zone, struct scan_control *sc,
enum lru_list l;
int noswap = 0;
bool force_scan = false;
unsigned long nr_force_scan[2];

/* kswapd does zone balancing and needs to scan this zone */
/*
* If the zone or memcg is small, nr[l] can be 0. This
* results in no scanning on this priority and a potential
* priority drop. Global direct reclaim can go to the next
* zone and tends to have no problems. Global kswapd is for
* zone balancing and it needs to scan a minimum amount. When
* reclaiming for a memcg, a priority drop can cause high
* latencies, so it's better to scan a minimum amount there as
* well.
*/
if (scanning_global_lru(sc) && current_is_kswapd())
force_scan = true;
/* memcg may have small limit and need to avoid priority drop */
if (!scanning_global_lru(sc))
force_scan = true;

Expand All @@ -1832,8 +1839,6 @@ static void get_scan_count(struct zone *zone, struct scan_control *sc,
fraction[0] = 0;
fraction[1] = 1;
denominator = 1;
nr_force_scan[0] = 0;
nr_force_scan[1] = SWAP_CLUSTER_MAX;
goto out;
}

Expand All @@ -1850,8 +1855,6 @@ static void get_scan_count(struct zone *zone, struct scan_control *sc,
fraction[0] = 1;
fraction[1] = 0;
denominator = 1;
nr_force_scan[0] = SWAP_CLUSTER_MAX;
nr_force_scan[1] = 0;
goto out;
}
}
Expand Down Expand Up @@ -1900,11 +1903,6 @@ static void get_scan_count(struct zone *zone, struct scan_control *sc,
fraction[0] = ap;
fraction[1] = fp;
denominator = ap + fp + 1;
if (force_scan) {
unsigned long scan = SWAP_CLUSTER_MAX;
nr_force_scan[0] = div64_u64(scan * ap, denominator);
nr_force_scan[1] = div64_u64(scan * fp, denominator);
}
out:
for_each_evictable_lru(l) {
int file = is_file_lru(l);
Expand All @@ -1913,20 +1911,10 @@ static void get_scan_count(struct zone *zone, struct scan_control *sc,
scan = zone_nr_lru_pages(zone, sc, l);
if (priority || noswap) {
scan >>= priority;
if (!scan && force_scan)
scan = SWAP_CLUSTER_MAX;
scan = div64_u64(scan * fraction[file], denominator);
}

/*
* If zone is small or memcg is small, nr[l] can be 0.
* This results no-scan on this priority and priority drop down.
* For global direct reclaim, it can visit next zone and tend
* not to have problems. For global kswapd, it's for zone
* balancing and it need to scan a small amounts. When using
* memcg, priority drop can cause big latency. So, it's better
* to scan small amount. See may_noscan above.
*/
if (!scan && force_scan)
scan = nr_force_scan[file];
nr[l] = scan;
}
}
Expand Down

0 comments on commit 56bc1be

Please sign in to comment.