Revert " mm/lru: revise the comments of lru_lock"

This reverts commit 3df720cae4.
This commit is contained in:
Bin Lai 2022-09-05 20:55:51 +08:00
parent 704259482e
commit bb589f37a6
4 changed files with 43 additions and 60 deletions

View File

@ -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);

View File

@ -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;

View File

@ -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)

View File

@ -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);