From bb589f37a68703412e9271cb70b75d3fe22df992 Mon Sep 17 00:00:00 2001 From: Bin Lai Date: Mon, 5 Sep 2022 20:55:51 +0800 Subject: [PATCH] Revert " mm/lru: revise the comments of lru_lock" This reverts commit 3df720cae4581375b877b9289e295dfff384db33. --- include/linux/memcontrol.h | 51 -------------------------------------- mm/mlock.c | 10 +++++++- mm/swap.c | 30 +++++++++++++++++----- mm/vmscan.c | 12 +++++++-- 4 files changed, 43 insertions(+), 60 deletions(-) diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h index 99a14cb55..8f37c46f8 100644 --- a/include/linux/memcontrol.h +++ b/include/linux/memcontrol.h @@ -450,22 +450,6 @@ out: struct lruvec *mem_cgroup_page_lruvec(struct page *, struct pglist_data *); -static inline bool lruvec_holds_page_lru_lock(struct page *page, - struct lruvec *lruvec) -{ - pg_data_t *pgdat = page_pgdat(page); - const struct mem_cgroup *memcg; - struct mem_cgroup_per_node *mz; - - if (mem_cgroup_disabled()) - return lruvec == &pgdat->lruvec; - - mz = container_of(lruvec, struct mem_cgroup_per_node, lruvec); - memcg = page->mem_cgroup ? : root_mem_cgroup; - - return lruvec->pgdat == pgdat && mz->memcg == memcg; -} - struct mem_cgroup *mem_cgroup_from_task(struct task_struct *p); struct mem_cgroup *get_mem_cgroup_from_mm(struct mm_struct *mm); @@ -971,13 +955,6 @@ static inline struct lruvec *mem_cgroup_page_lruvec(struct page *page, return &pgdat->lruvec; } -static inline bool lruvec_holds_page_lru_lock(struct page *page, - struct lruvec *lruvec) -{ - pg_data_t *pgdat = page_pgdat(page); - return lruvec == &pgdat->__lruvec; -} - static inline bool mm_match_cgroup(struct mm_struct *mm, struct mem_cgroup *memcg) { @@ -1393,34 +1370,6 @@ static inline void unlock_page_lruvec_irqrestore(struct lruvec *lruvec, spin_unlock_irqrestore(&lruvec->lru_lock, flags); } -/* Don't lock again iff page's lruvec locked */ -static inline struct lruvec *relock_page_lruvec_irq(struct page *page, - struct lruvec *locked_lruvec) -{ - if (locked_lruvec) { - if (lruvec_holds_page_lru_lock(page, locked_lruvec)) - return locked_lruvec; - - unlock_page_lruvec_irq(locked_lruvec); - } - - return lock_page_lruvec_irq(page); -} - -/* Don't lock again iff page's lruvec locked */ -static inline struct lruvec *relock_page_lruvec_irqsave(struct page *page, - struct lruvec *locked_lruvec, unsigned long *flags) -{ - if (locked_lruvec) { - if (lruvec_holds_page_lru_lock(page, locked_lruvec)) - return locked_lruvec; - - unlock_page_lruvec_irqrestore(locked_lruvec, *flags); - } - - return lock_page_lruvec_irqsave(page, flags); -} - #ifdef CONFIG_CGROUP_WRITEBACK struct wb_domain *mem_cgroup_wb_domain(struct bdi_writeback *wb); diff --git a/mm/mlock.c b/mm/mlock.c index fd750b75c..6b1c2c229 100644 --- a/mm/mlock.c +++ b/mm/mlock.c @@ -273,7 +273,15 @@ static void __munlock_pagevec(struct pagevec *pvec, struct zone *zone) * so we can spare the get_page() here. */ if (TestClearPageLRU(page)) { - lruvec = relock_page_lruvec_irq(page, lruvec); + struct lruvec *new_lruvec; + + new_lruvec = mem_cgroup_page_lruvec(page, + page_pgdat(page)); + if (new_lruvec != lruvec) { + if (lruvec) + unlock_page_lruvec_irq(lruvec); + lruvec = lock_page_lruvec_irq(page); + } del_page_from_lru_list(page, lruvec, page_lru(page)); continue; diff --git a/mm/swap.c b/mm/swap.c index cfb7357fa..e39fd3ef6 100644 --- a/mm/swap.c +++ b/mm/swap.c @@ -194,12 +194,17 @@ static void pagevec_lru_move_fn(struct pagevec *pvec, for (i = 0; i < pagevec_count(pvec); i++) { struct page *page = pvec->pages[i]; + struct lruvec *new_lruvec; /* block memcg migration during page moving between lru */ if (!TestClearPageLRU(page)) continue; - - lruvec = relock_page_lruvec_irqsave(page, lruvec, &flags); + new_lruvec = mem_cgroup_page_lruvec(page, page_pgdat(page)); + if (lruvec != new_lruvec) { + if (lruvec) + unlock_page_lruvec_irqrestore(lruvec, flags); + lruvec = lock_page_lruvec_irqsave(page, &flags); + } (*move_fn)(page, lruvec); SetPageLRU(page); @@ -785,10 +790,15 @@ void release_pages(struct page **pages, int nr) } if (PageLRU(page)) { - struct lruvec *prev_lruvec = lruvec; - lruvec = relock_page_lruvec_irqsave(page, lruvec, &flags); - if (prev_lruvec != lruvec) + struct lruvec *new_lruvec; + + new_lruvec = mem_cgroup_page_lruvec(page, page_pgdat(page)); + if (new_lruvec != lruvec) { + if (lruvec) + unlock_page_lruvec_irqrestore(lruvec, flags); lock_batch = 0; + lruvec = lock_page_lruvec_irqsave(page, &flags); + } VM_BUG_ON_PAGE(!PageLRU(page), page); __ClearPageLRU(page); @@ -923,7 +933,15 @@ void __pagevec_lru_add(struct pagevec *pvec) for (i = 0; i < pagevec_count(pvec); i++) { struct page *page = pvec->pages[i]; - lruvec = relock_page_lruvec_irqsave(page, lruvec, &flags); + struct lruvec *new_lruvec; + + new_lruvec = mem_cgroup_page_lruvec(page, page_pgdat(page)); + if (lruvec != new_lruvec) { + if (lruvec) + unlock_page_lruvec_irqrestore(lruvec, flags); + lruvec = lock_page_lruvec_irqsave(page, &flags); + } + __pagevec_lru_add_fn(page, lruvec); } if (lruvec) diff --git a/mm/vmscan.c b/mm/vmscan.c index 74edaa631..3adf652af 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -1936,7 +1936,8 @@ static unsigned noinline_for_stack move_pages_to_lru(struct lruvec *lruvec, list_add(&page->lru, &pages_to_free); continue; } - VM_BUG_ON_PAGE(!lruvec_holds_page_lru_lock(page, lruvec), page); + VM_BUG_ON_PAGE(mem_cgroup_page_lruvec(page, page_pgdat(page)) + != lruvec, page); lru = page_lru(page); nr_pages = hpage_nr_pages(page); @@ -4758,6 +4759,7 @@ void check_move_unevictable_pages(struct pagevec *pvec) for (i = 0; i < pvec->nr; i++) { struct page *page = pvec->pages[i]; + struct lruvec *new_lruvec; pgscanned++; @@ -4765,7 +4767,13 @@ void check_move_unevictable_pages(struct pagevec *pvec) if (!TestClearPageLRU(page)) continue; - lruvec = relock_page_lruvec_irq(page, lruvec); + new_lruvec = mem_cgroup_page_lruvec(page, page_pgdat(page)); + if (lruvec != new_lruvec) { + if (lruvec) + unlock_page_lruvec_irq(lruvec); + lruvec = lock_page_lruvec_irq(page); + } + if (page_evictable(page) && PageUnevictable(page)) { enum lru_list lru = page_lru_base_type(page);