Unverified Commit a91ec6de authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!10305 [OLK-6.6] Backport bugfixes for mm LRU from Linux upstream

Merge Pull Request from: @hanliyang 
 
Backport bugfixes for mm LRU from Linux upstream

issue:
https://gitee.com/open_euler/dashboard?issue_id=IAEY2C

- Fix the LRU flag setting and checking issue 
 
Link:https://gitee.com/openeuler/kernel/pulls/10305

 

Reviewed-by: default avatarKefeng Wang <wangkefeng.wang@huawei.com>
Reviewed-by: default avatarJackie Liu <liuyun01@kylinos.cn>
Signed-off-by: default avatarZhang Peng <zhangpeng362@huawei.com>
parents ea308216 c543ecb3
Loading
Loading
Loading
Loading
+31 −12
Original line number Diff line number Diff line
@@ -211,10 +211,6 @@ static void folio_batch_move_lru(struct folio_batch *fbatch, move_fn_t move_fn)
	for (i = 0; i < folio_batch_count(fbatch); i++) {
		struct folio *folio = fbatch->folios[i];

		/* block memcg migration while the folio moves between lru */
		if (move_fn != lru_add_fn && !folio_test_clear_lru(folio))
			continue;

		folio_lruvec_relock_irqsave(folio, &lruvec, &flags);
		move_fn(lruvec, folio);

@@ -255,11 +251,16 @@ static void lru_move_tail_fn(struct lruvec *lruvec, struct folio *folio)
void folio_rotate_reclaimable(struct folio *folio)
{
	if (!folio_test_locked(folio) && !folio_test_dirty(folio) &&
	    !folio_test_unevictable(folio) && folio_test_lru(folio)) {
	    !folio_test_unevictable(folio)) {
		struct folio_batch *fbatch;
		unsigned long flags;

		folio_get(folio);
		if (!folio_test_clear_lru(folio)) {
			folio_put(folio);
			return;
		}

		local_lock_irqsave(&lru_rotate.lock, flags);
		fbatch = this_cpu_ptr(&lru_rotate.fbatch);
		folio_batch_add_and_move(fbatch, folio, lru_move_tail_fn);
@@ -352,11 +353,15 @@ static void folio_activate_drain(int cpu)

void folio_activate(struct folio *folio)
{
	if (folio_test_lru(folio) && !folio_test_active(folio) &&
	    !folio_test_unevictable(folio)) {
	if (!folio_test_active(folio) && !folio_test_unevictable(folio)) {
		struct folio_batch *fbatch;

		folio_get(folio);
		if (!folio_test_clear_lru(folio)) {
			folio_put(folio);
			return;
		}

		local_lock(&cpu_fbatches.lock);
		fbatch = this_cpu_ptr(&cpu_fbatches.activate);
		folio_batch_add_and_move(fbatch, folio, folio_activate_fn);
@@ -697,6 +702,11 @@ void deactivate_file_folio(struct folio *folio)
		return;

	folio_get(folio);
	if (!folio_test_clear_lru(folio)) {
		folio_put(folio);
		return;
	}

	local_lock(&cpu_fbatches.lock);
	fbatch = this_cpu_ptr(&cpu_fbatches.lru_deactivate_file);
	folio_batch_add_and_move(fbatch, folio, lru_deactivate_file_fn);
@@ -713,11 +723,16 @@ void deactivate_file_folio(struct folio *folio)
 */
void folio_deactivate(struct folio *folio)
{
	if (folio_test_lru(folio) && !folio_test_unevictable(folio) &&
	    (folio_test_active(folio) || lru_gen_enabled())) {
	if (!folio_test_unevictable(folio) && (folio_test_active(folio) ||
	    lru_gen_enabled())) {
		struct folio_batch *fbatch;

		folio_get(folio);
		if (!folio_test_clear_lru(folio)) {
			folio_put(folio);
			return;
		}

		local_lock(&cpu_fbatches.lock);
		fbatch = this_cpu_ptr(&cpu_fbatches.lru_deactivate);
		folio_batch_add_and_move(fbatch, folio, lru_deactivate_fn);
@@ -734,12 +749,16 @@ void folio_deactivate(struct folio *folio)
 */
void folio_mark_lazyfree(struct folio *folio)
{
	if (folio_test_lru(folio) && folio_test_anon(folio) &&
	    folio_test_swapbacked(folio) && !folio_test_swapcache(folio) &&
	    !folio_test_unevictable(folio)) {
	if (folio_test_anon(folio) && folio_test_swapbacked(folio) &&
	    !folio_test_swapcache(folio) && !folio_test_unevictable(folio)) {
		struct folio_batch *fbatch;

		folio_get(folio);
		if (!folio_test_clear_lru(folio)) {
			folio_put(folio);
			return;
		}

		local_lock(&cpu_fbatches.lock);
		fbatch = this_cpu_ptr(&cpu_fbatches.lru_lazyfree);
		folio_batch_add_and_move(fbatch, folio, lru_lazyfree_fn);
+1 −1
Original line number Diff line number Diff line
@@ -5001,7 +5001,7 @@ static bool sort_folio(struct lruvec *lruvec, struct folio *folio, struct scan_c
	}

	/* ineligible */
	if (zone > sc->reclaim_idx) {
	if (!folio_test_lru(folio) || zone > sc->reclaim_idx) {
		gen = folio_inc_gen(lruvec, folio, false);
		list_move_tail(&folio->lru, &lrugen->folios[gen][type][zone]);
		return true;