在 2020/11/26 下午3:24, Yu Zhao 写道: > Oh, no, I'm not against your idea. I was saying it doesn't seem > necessary to sort -- a nested loop would just do the job given > pagevec is small. > > diff --git a/mm/swap.c b/mm/swap.c > index cb3794e13b48..1d238edc2907 100644 > --- a/mm/swap.c > +++ b/mm/swap.c > @@ -996,15 +996,26 @@ static void __pagevec_lru_add_fn(struct page *page, struct lruvec *lruvec) > */ > void __pagevec_lru_add(struct pagevec *pvec) > { > - int i; > + int i, j; > struct lruvec *lruvec = NULL; > unsigned long flags = 0; > > for (i = 0; i < pagevec_count(pvec); i++) { > struct page *page = pvec->pages[i]; > > + if (!page) > + continue; > + > lruvec = relock_page_lruvec_irqsave(page, lruvec, &flags); > - __pagevec_lru_add_fn(page, lruvec); > + > + for (j = i; j < pagevec_count(pvec); j++) { > + if (page_to_nid(pvec->pages[j]) != page_to_nid(page) || > + page_memcg(pvec->pages[j]) != page_memcg(page)) > + continue; > + > + __pagevec_lru_add_fn(pvec->pages[j], lruvec); > + pvec->pages[j] = NULL; > + } Uh, I have to say your method is more better than mine. And this could be reused for all relock_page_lruvec. I expect this could speed up lru performance a lot! > } > if (lruvec) > unlock_page_lruvec_irqrestore(lruvec, flags);