|
@@ -2048,11 +2048,11 @@ static void shrink_active_list(unsigned long nr_to_scan,
|
|
* 10TB 320 32GB
|
|
* 10TB 320 32GB
|
|
*/
|
|
*/
|
|
static bool inactive_list_is_low(struct lruvec *lruvec, bool file,
|
|
static bool inactive_list_is_low(struct lruvec *lruvec, bool file,
|
|
- struct scan_control *sc)
|
|
|
|
|
|
+ struct scan_control *sc, bool trace)
|
|
{
|
|
{
|
|
unsigned long inactive_ratio;
|
|
unsigned long inactive_ratio;
|
|
- unsigned long inactive;
|
|
|
|
- unsigned long active;
|
|
|
|
|
|
+ unsigned long total_inactive, inactive;
|
|
|
|
+ unsigned long total_active, active;
|
|
unsigned long gb;
|
|
unsigned long gb;
|
|
struct pglist_data *pgdat = lruvec_pgdat(lruvec);
|
|
struct pglist_data *pgdat = lruvec_pgdat(lruvec);
|
|
int zid;
|
|
int zid;
|
|
@@ -2064,8 +2064,8 @@ static bool inactive_list_is_low(struct lruvec *lruvec, bool file,
|
|
if (!file && !total_swap_pages)
|
|
if (!file && !total_swap_pages)
|
|
return false;
|
|
return false;
|
|
|
|
|
|
- inactive = lruvec_lru_size(lruvec, file * LRU_FILE);
|
|
|
|
- active = lruvec_lru_size(lruvec, file * LRU_FILE + LRU_ACTIVE);
|
|
|
|
|
|
+ total_inactive = inactive = lruvec_lru_size(lruvec, file * LRU_FILE);
|
|
|
|
+ total_active = active = lruvec_lru_size(lruvec, file * LRU_FILE + LRU_ACTIVE);
|
|
|
|
|
|
/*
|
|
/*
|
|
* For zone-constrained allocations, it is necessary to check if
|
|
* For zone-constrained allocations, it is necessary to check if
|
|
@@ -2092,6 +2092,11 @@ static bool inactive_list_is_low(struct lruvec *lruvec, bool file,
|
|
else
|
|
else
|
|
inactive_ratio = 1;
|
|
inactive_ratio = 1;
|
|
|
|
|
|
|
|
+ if (trace)
|
|
|
|
+ trace_mm_vmscan_inactive_list_is_low(pgdat->node_id,
|
|
|
|
+ sc->reclaim_idx,
|
|
|
|
+ total_inactive, inactive,
|
|
|
|
+ total_active, active, inactive_ratio, file);
|
|
return inactive * inactive_ratio < active;
|
|
return inactive * inactive_ratio < active;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -2099,7 +2104,7 @@ static unsigned long shrink_list(enum lru_list lru, unsigned long nr_to_scan,
|
|
struct lruvec *lruvec, struct scan_control *sc)
|
|
struct lruvec *lruvec, struct scan_control *sc)
|
|
{
|
|
{
|
|
if (is_active_lru(lru)) {
|
|
if (is_active_lru(lru)) {
|
|
- if (inactive_list_is_low(lruvec, is_file_lru(lru), sc))
|
|
|
|
|
|
+ if (inactive_list_is_low(lruvec, is_file_lru(lru), sc, true))
|
|
shrink_active_list(nr_to_scan, lruvec, sc, lru);
|
|
shrink_active_list(nr_to_scan, lruvec, sc, lru);
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
@@ -2230,7 +2235,7 @@ static void get_scan_count(struct lruvec *lruvec, struct mem_cgroup *memcg,
|
|
* lruvec even if it has plenty of old anonymous pages unless the
|
|
* lruvec even if it has plenty of old anonymous pages unless the
|
|
* system is under heavy pressure.
|
|
* system is under heavy pressure.
|
|
*/
|
|
*/
|
|
- if (!inactive_list_is_low(lruvec, true, sc) &&
|
|
|
|
|
|
+ if (!inactive_list_is_low(lruvec, true, sc, false) &&
|
|
lruvec_lru_size(lruvec, LRU_INACTIVE_FILE) >> sc->priority) {
|
|
lruvec_lru_size(lruvec, LRU_INACTIVE_FILE) >> sc->priority) {
|
|
scan_balance = SCAN_FILE;
|
|
scan_balance = SCAN_FILE;
|
|
goto out;
|
|
goto out;
|
|
@@ -2455,7 +2460,7 @@ static void shrink_node_memcg(struct pglist_data *pgdat, struct mem_cgroup *memc
|
|
* Even if we did not try to evict anon pages at all, we want to
|
|
* Even if we did not try to evict anon pages at all, we want to
|
|
* rebalance the anon lru active/inactive ratio.
|
|
* rebalance the anon lru active/inactive ratio.
|
|
*/
|
|
*/
|
|
- if (inactive_list_is_low(lruvec, false, sc))
|
|
|
|
|
|
+ if (inactive_list_is_low(lruvec, false, sc, true))
|
|
shrink_active_list(SWAP_CLUSTER_MAX, lruvec,
|
|
shrink_active_list(SWAP_CLUSTER_MAX, lruvec,
|
|
sc, LRU_ACTIVE_ANON);
|
|
sc, LRU_ACTIVE_ANON);
|
|
}
|
|
}
|
|
@@ -3105,7 +3110,7 @@ static void age_active_anon(struct pglist_data *pgdat,
|
|
do {
|
|
do {
|
|
struct lruvec *lruvec = mem_cgroup_lruvec(pgdat, memcg);
|
|
struct lruvec *lruvec = mem_cgroup_lruvec(pgdat, memcg);
|
|
|
|
|
|
- if (inactive_list_is_low(lruvec, false, sc))
|
|
|
|
|
|
+ if (inactive_list_is_low(lruvec, false, sc, true))
|
|
shrink_active_list(SWAP_CLUSTER_MAX, lruvec,
|
|
shrink_active_list(SWAP_CLUSTER_MAX, lruvec,
|
|
sc, LRU_ACTIVE_ANON);
|
|
sc, LRU_ACTIVE_ANON);
|
|
|
|
|