|
@@ -2123,21 +2123,8 @@ static void get_scan_count(struct lruvec *lruvec, struct mem_cgroup *memcg,
|
|
|
unsigned long anon_prio, file_prio;
|
|
|
enum scan_balance scan_balance;
|
|
|
unsigned long anon, file;
|
|
|
- bool force_scan = false;
|
|
|
unsigned long ap, fp;
|
|
|
enum lru_list lru;
|
|
|
- bool some_scanned;
|
|
|
- int pass;
|
|
|
-
|
|
|
- /*
|
|
|
- * If the zone or memcg is small, nr[l] can be 0. When
|
|
|
- * reclaiming for a memcg, a priority drop can cause high
|
|
|
- * latencies, so it's better to scan a minimum amount. When a
|
|
|
- * cgroup has already been deleted, scrape out the remaining
|
|
|
- * cache forcefully to get rid of the lingering state.
|
|
|
- */
|
|
|
- if (!global_reclaim(sc) || !mem_cgroup_online(memcg))
|
|
|
- force_scan = true;
|
|
|
|
|
|
/* If we have no swap space, do not bother scanning anon pages. */
|
|
|
if (!sc->may_swap || mem_cgroup_get_nr_swap_pages(memcg) <= 0) {
|
|
@@ -2268,55 +2255,48 @@ static void get_scan_count(struct lruvec *lruvec, struct mem_cgroup *memcg,
|
|
|
fraction[1] = fp;
|
|
|
denominator = ap + fp + 1;
|
|
|
out:
|
|
|
- some_scanned = false;
|
|
|
- /* Only use force_scan on second pass. */
|
|
|
- for (pass = 0; !some_scanned && pass < 2; pass++) {
|
|
|
- *lru_pages = 0;
|
|
|
- for_each_evictable_lru(lru) {
|
|
|
- int file = is_file_lru(lru);
|
|
|
- unsigned long size;
|
|
|
- unsigned long scan;
|
|
|
-
|
|
|
- size = lruvec_lru_size(lruvec, lru, sc->reclaim_idx);
|
|
|
- scan = size >> sc->priority;
|
|
|
-
|
|
|
- if (!scan && pass && force_scan)
|
|
|
- scan = min(size, SWAP_CLUSTER_MAX);
|
|
|
-
|
|
|
- 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) {
|
|
|
- size = 0;
|
|
|
- scan = 0;
|
|
|
- }
|
|
|
- break;
|
|
|
- default:
|
|
|
- /* Look ma, no brain */
|
|
|
- BUG();
|
|
|
- }
|
|
|
+ *lru_pages = 0;
|
|
|
+ for_each_evictable_lru(lru) {
|
|
|
+ int file = is_file_lru(lru);
|
|
|
+ unsigned long size;
|
|
|
+ unsigned long scan;
|
|
|
|
|
|
- *lru_pages += size;
|
|
|
- nr[lru] = scan;
|
|
|
+ size = lruvec_lru_size(lruvec, lru, sc->reclaim_idx);
|
|
|
+ scan = size >> sc->priority;
|
|
|
+ /*
|
|
|
+ * If the cgroup's already been deleted, make sure to
|
|
|
+ * scrape out the remaining cache.
|
|
|
+ */
|
|
|
+ if (!scan && !mem_cgroup_online(memcg))
|
|
|
+ scan = min(size, SWAP_CLUSTER_MAX);
|
|
|
|
|
|
+ switch (scan_balance) {
|
|
|
+ case SCAN_EQUAL:
|
|
|
+ /* Scan lists relative to size */
|
|
|
+ break;
|
|
|
+ case SCAN_FRACT:
|
|
|
/*
|
|
|
- * Skip the second pass and don't force_scan,
|
|
|
- * if we found something to scan.
|
|
|
+ * Scan types proportional to swappiness and
|
|
|
+ * their relative recent reclaim efficiency.
|
|
|
*/
|
|
|
- some_scanned |= !!scan;
|
|
|
+ scan = div64_u64(scan * fraction[file],
|
|
|
+ denominator);
|
|
|
+ break;
|
|
|
+ case SCAN_FILE:
|
|
|
+ case SCAN_ANON:
|
|
|
+ /* Scan one type exclusively */
|
|
|
+ if ((scan_balance == SCAN_FILE) != file) {
|
|
|
+ size = 0;
|
|
|
+ scan = 0;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ /* Look ma, no brain */
|
|
|
+ BUG();
|
|
|
}
|
|
|
+
|
|
|
+ *lru_pages += size;
|
|
|
+ nr[lru] = scan;
|
|
|
}
|
|
|
}
|
|
|
|