Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 164457
b: refs/heads/master
c: f862963
h: refs/heads/master
i:
  164455: 15952aa
v: v3
  • Loading branch information
Wu Fengguang authored and Linus Torvalds committed Sep 22, 2009
1 parent bf0609d commit 717c632
Show file tree
Hide file tree
Showing 4 changed files with 18 additions and 12 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: 1a8670a29b5277cbe601f74ab63d2c5211fb3005
refs/heads/master: f86296317434b21585e229f6c49a33cb9ebab4d3
6 changes: 5 additions & 1 deletion trunk/include/linux/mmzone.h
Original file line number Diff line number Diff line change
Expand Up @@ -273,6 +273,11 @@ struct zone_reclaim_stat {
*/
unsigned long recent_rotated[2];
unsigned long recent_scanned[2];

/*
* accumulated for batching
*/
unsigned long nr_saved_scan[NR_LRU_LISTS];
};

struct zone {
Expand Down Expand Up @@ -327,7 +332,6 @@ struct zone {
spinlock_t lru_lock;
struct zone_lru {
struct list_head list;
unsigned long nr_saved_scan; /* accumulated for batching */
} lru[NR_LRU_LISTS];

struct zone_reclaim_stat reclaim_stat;
Expand Down
2 changes: 1 addition & 1 deletion trunk/mm/page_alloc.c
Original file line number Diff line number Diff line change
Expand Up @@ -3809,7 +3809,7 @@ static void __paginginit free_area_init_core(struct pglist_data *pgdat,
zone_pcp_init(zone);
for_each_lru(l) {
INIT_LIST_HEAD(&zone->lru[l].list);
zone->lru[l].nr_saved_scan = 0;
zone->reclaim_stat.nr_saved_scan[l] = 0;
}
zone->reclaim_stat.recent_rotated[0] = 0;
zone->reclaim_stat.recent_rotated[1] = 0;
Expand Down
20 changes: 11 additions & 9 deletions trunk/mm/vmscan.c
Original file line number Diff line number Diff line change
Expand Up @@ -1586,6 +1586,7 @@ static void shrink_zone(int priority, struct zone *zone,
enum lru_list l;
unsigned long nr_reclaimed = sc->nr_reclaimed;
unsigned long swap_cluster_max = sc->swap_cluster_max;
struct zone_reclaim_stat *reclaim_stat = get_reclaim_stat(zone, sc);
int noswap = 0;

/* If we have no swap space, do not bother scanning anon pages. */
Expand All @@ -1605,12 +1606,9 @@ static void shrink_zone(int priority, struct zone *zone,
scan >>= priority;
scan = (scan * percent[file]) / 100;
}
if (scanning_global_lru(sc))
nr[l] = nr_scan_try_batch(scan,
&zone->lru[l].nr_saved_scan,
swap_cluster_max);
else
nr[l] = scan;
nr[l] = nr_scan_try_batch(scan,
&reclaim_stat->nr_saved_scan[l],
swap_cluster_max);
}

while (nr[LRU_INACTIVE_ANON] || nr[LRU_ACTIVE_FILE] ||
Expand Down Expand Up @@ -2220,6 +2218,7 @@ static void shrink_all_zones(unsigned long nr_pages, int prio,
{
struct zone *zone;
unsigned long nr_reclaimed = 0;
struct zone_reclaim_stat *reclaim_stat;

for_each_populated_zone(zone) {
enum lru_list l;
Expand All @@ -2236,11 +2235,14 @@ static void shrink_all_zones(unsigned long nr_pages, int prio,
l == LRU_ACTIVE_FILE))
continue;

zone->lru[l].nr_saved_scan += (lru_pages >> prio) + 1;
if (zone->lru[l].nr_saved_scan >= nr_pages || pass > 3) {
reclaim_stat = get_reclaim_stat(zone, sc);
reclaim_stat->nr_saved_scan[l] +=
(lru_pages >> prio) + 1;
if (reclaim_stat->nr_saved_scan[l]
>= nr_pages || pass > 3) {
unsigned long nr_to_scan;

zone->lru[l].nr_saved_scan = 0;
reclaim_stat->nr_saved_scan[l] = 0;
nr_to_scan = min(nr_pages, lru_pages);
nr_reclaimed += shrink_list(l, nr_to_scan, zone,
sc, prio);
Expand Down

0 comments on commit 717c632

Please sign in to comment.