linux-5.15/shrink_lruvec()
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
*参照元 [#z00e1a5a]
#backlinks
*説明 [#d0ac65b6]
-パス: [[linux-5.15/mm/vmscan.c]]
-FIXME: これは何?
--説明
**引数 [#s6e4c7d7]
-pg_data_t *pgdat
--メモリノード。
--[[linux-5.15/pg_data_t]]
-struct scan_control *sc
--
--[[linux-5.15/scan_control]]
**返り値 [#ibdfbde8]
-なし
**参考 [#e6875063]
*実装 [#e4e3b372]
static void shrink_lruvec(struct lruvec *lruvec, struct ...
{
unsigned long nr[NR_LRU_LISTS];
unsigned long targets[NR_LRU_LISTS];
unsigned long nr_to_scan;
enum lru_list lru;
unsigned long nr_reclaimed = 0;
unsigned long nr_to_reclaim = sc->nr_to_reclaim;
struct blk_plug plug;
bool scan_adjusted;
get_scan_count(lruvec, sc, nr);
/* Record the original scan target for proportional adj...
memcpy(targets, nr, sizeof(nr));
-
--[[linux-5.15/lru_list]]
--[[linux-5.15/blk_plug]]
--[[linux-5.15/get_scan_count()]]
/*
* Global reclaiming within direct reclaim at DEF_PRIOR...
* event that can occur when there is little memory pre...
* multiple streaming readers/writers. Hence, we do not...
* when the requested number of pages are reclaimed whe...
* DEF_PRIORITY on the assumption that the fact we are ...
* reclaiming implies that kswapd is not keeping up and...
* do a batch of work at once. For memcg reclaim one ch...
* abort proportional reclaim if either the file or ano...
* dropped to zero at the first pass.
*/
scan_adjusted = (!cgroup_reclaim(sc) && !current_is_ksw...
sc->priority == DEF_PRIORITY);
blk_start_plug(&plug);
-
--[[linux-5.15/cgroup_reclaim()]]
--[[linux-5.15/current_is_kswapd()]]
--[[linux-5.15/blk_start_plug()]]
while (nr[LRU_INACTIVE_ANON] || nr[LRU_ACTIVE_FILE] ||
nr[LRU_INACTIVE_FILE]) {
unsigned long nr_anon, nr_file, percentage;
unsigned long nr_scanned;
for_each_evictable_lru(lru) {
if (nr[lru]) {
nr_to_scan = min(nr[lru], SWAP_CLUSTER_MAX);
nr[lru] -= nr_to_scan;
nr_reclaimed += shrink_list(lru, nr_to_scan,
lruvec, sc);
}
}
cond_resched();
-
--[[linux-5.15/for_each_evictable_lru()]]
--[[linux-5.15/shrink_list()]]
--[[linux-5.15/cond_resched()]]
if (nr_reclaimed < nr_to_reclaim || scan_adjusted)
continue;
/*
* For kswapd and memcg, reclaim at least the number o...
* requested. Ensure that the anon and file LRUs are s...
* proportionally what was requested by get_scan_count...
* stop reclaiming one LRU and reduce the amount scann...
* proportional to the original scan target.
*/
nr_file = nr[LRU_INACTIVE_FILE] + nr[LRU_ACTIVE_FILE];
nr_anon = nr[LRU_INACTIVE_ANON] + nr[LRU_ACTIVE_ANON];
/*
* It's just vindictive to attack the larger once the ...
* has gone to zero. And given the way we stop scanni...
* smaller below, this makes sure that we only make on...
* towards proportionality once we've got nr_to_reclaim.
*/
if (!nr_file || !nr_anon)
break;
if (nr_file > nr_anon) {
unsigned long scan_target = targets[LRU_INACTIVE_ANON...
targets[LRU_ACTIVE_ANON] + 1;
lru = LRU_BASE;
percentage = nr_anon * 100 / scan_target;
} else {
unsigned long scan_target = targets[LRU_INACTIVE_FILE...
targets[LRU_ACTIVE_FILE] + 1;
lru = LRU_FILE;
percentage = nr_file * 100 / scan_target;
}
/* Stop scanning the smaller of the LRU */
nr[lru] = 0;
nr[lru + LRU_ACTIVE] = 0;
/*
* Recalculate the other LRU scan count based on its o...
* scan target and the percentage scanning already com...
*/
lru = (lru == LRU_FILE) ? LRU_BASE : LRU_FILE;
nr_scanned = targets[lru] - nr[lru];
nr[lru] = targets[lru] * (100 - percentage) / 100;
nr[lru] -= min(nr[lru], nr_scanned);
lru += LRU_ACTIVE;
nr_scanned = targets[lru] - nr[lru];
nr[lru] = targets[lru] * (100 - percentage) / 100;
nr[lru] -= min(nr[lru], nr_scanned);
scan_adjusted = true;
}
blk_finish_plug(&plug);
sc->nr_reclaimed += nr_reclaimed;
-
--[[linux-5.15/blk_finish_plug()]]
/*
* Even if we did not try to evict anon pages at all, w...
* rebalance the anon lru active/inactive ratio.
*/
if (can_age_anon_pages(lruvec_pgdat(lruvec), sc) &&
inactive_is_low(lruvec, LRU_INACTIVE_ANON))
shrink_active_list(SWAP_CLUSTER_MAX, lruvec,
sc, LRU_ACTIVE_ANON);
}
-
--[[linux-5.15/can_age_anon_pages()]]
--[[linux-5.15/lruvec_pgdat()]]
--[[linux-5.15/inactive_is_low()]]
--[[linux-5.15/shrink_active_list()]]
*コメント [#v11949b8]
終了行:
*参照元 [#z00e1a5a]
#backlinks
*説明 [#d0ac65b6]
-パス: [[linux-5.15/mm/vmscan.c]]
-FIXME: これは何?
--説明
**引数 [#s6e4c7d7]
-pg_data_t *pgdat
--メモリノード。
--[[linux-5.15/pg_data_t]]
-struct scan_control *sc
--
--[[linux-5.15/scan_control]]
**返り値 [#ibdfbde8]
-なし
**参考 [#e6875063]
*実装 [#e4e3b372]
static void shrink_lruvec(struct lruvec *lruvec, struct ...
{
unsigned long nr[NR_LRU_LISTS];
unsigned long targets[NR_LRU_LISTS];
unsigned long nr_to_scan;
enum lru_list lru;
unsigned long nr_reclaimed = 0;
unsigned long nr_to_reclaim = sc->nr_to_reclaim;
struct blk_plug plug;
bool scan_adjusted;
get_scan_count(lruvec, sc, nr);
/* Record the original scan target for proportional adj...
memcpy(targets, nr, sizeof(nr));
-
--[[linux-5.15/lru_list]]
--[[linux-5.15/blk_plug]]
--[[linux-5.15/get_scan_count()]]
/*
* Global reclaiming within direct reclaim at DEF_PRIOR...
* event that can occur when there is little memory pre...
* multiple streaming readers/writers. Hence, we do not...
* when the requested number of pages are reclaimed whe...
* DEF_PRIORITY on the assumption that the fact we are ...
* reclaiming implies that kswapd is not keeping up and...
* do a batch of work at once. For memcg reclaim one ch...
* abort proportional reclaim if either the file or ano...
* dropped to zero at the first pass.
*/
scan_adjusted = (!cgroup_reclaim(sc) && !current_is_ksw...
sc->priority == DEF_PRIORITY);
blk_start_plug(&plug);
-
--[[linux-5.15/cgroup_reclaim()]]
--[[linux-5.15/current_is_kswapd()]]
--[[linux-5.15/blk_start_plug()]]
while (nr[LRU_INACTIVE_ANON] || nr[LRU_ACTIVE_FILE] ||
nr[LRU_INACTIVE_FILE]) {
unsigned long nr_anon, nr_file, percentage;
unsigned long nr_scanned;
for_each_evictable_lru(lru) {
if (nr[lru]) {
nr_to_scan = min(nr[lru], SWAP_CLUSTER_MAX);
nr[lru] -= nr_to_scan;
nr_reclaimed += shrink_list(lru, nr_to_scan,
lruvec, sc);
}
}
cond_resched();
-
--[[linux-5.15/for_each_evictable_lru()]]
--[[linux-5.15/shrink_list()]]
--[[linux-5.15/cond_resched()]]
if (nr_reclaimed < nr_to_reclaim || scan_adjusted)
continue;
/*
* For kswapd and memcg, reclaim at least the number o...
* requested. Ensure that the anon and file LRUs are s...
* proportionally what was requested by get_scan_count...
* stop reclaiming one LRU and reduce the amount scann...
* proportional to the original scan target.
*/
nr_file = nr[LRU_INACTIVE_FILE] + nr[LRU_ACTIVE_FILE];
nr_anon = nr[LRU_INACTIVE_ANON] + nr[LRU_ACTIVE_ANON];
/*
* It's just vindictive to attack the larger once the ...
* has gone to zero. And given the way we stop scanni...
* smaller below, this makes sure that we only make on...
* towards proportionality once we've got nr_to_reclaim.
*/
if (!nr_file || !nr_anon)
break;
if (nr_file > nr_anon) {
unsigned long scan_target = targets[LRU_INACTIVE_ANON...
targets[LRU_ACTIVE_ANON] + 1;
lru = LRU_BASE;
percentage = nr_anon * 100 / scan_target;
} else {
unsigned long scan_target = targets[LRU_INACTIVE_FILE...
targets[LRU_ACTIVE_FILE] + 1;
lru = LRU_FILE;
percentage = nr_file * 100 / scan_target;
}
/* Stop scanning the smaller of the LRU */
nr[lru] = 0;
nr[lru + LRU_ACTIVE] = 0;
/*
* Recalculate the other LRU scan count based on its o...
* scan target and the percentage scanning already com...
*/
lru = (lru == LRU_FILE) ? LRU_BASE : LRU_FILE;
nr_scanned = targets[lru] - nr[lru];
nr[lru] = targets[lru] * (100 - percentage) / 100;
nr[lru] -= min(nr[lru], nr_scanned);
lru += LRU_ACTIVE;
nr_scanned = targets[lru] - nr[lru];
nr[lru] = targets[lru] * (100 - percentage) / 100;
nr[lru] -= min(nr[lru], nr_scanned);
scan_adjusted = true;
}
blk_finish_plug(&plug);
sc->nr_reclaimed += nr_reclaimed;
-
--[[linux-5.15/blk_finish_plug()]]
/*
* Even if we did not try to evict anon pages at all, w...
* rebalance the anon lru active/inactive ratio.
*/
if (can_age_anon_pages(lruvec_pgdat(lruvec), sc) &&
inactive_is_low(lruvec, LRU_INACTIVE_ANON))
shrink_active_list(SWAP_CLUSTER_MAX, lruvec,
sc, LRU_ACTIVE_ANON);
}
-
--[[linux-5.15/can_age_anon_pages()]]
--[[linux-5.15/lruvec_pgdat()]]
--[[linux-5.15/inactive_is_low()]]
--[[linux-5.15/shrink_active_list()]]
*コメント [#v11949b8]
ページ名: