Re: [PATCH 4/4] mm: Generalize putback scan functions

From: Daniel Jordan
Date: Wed Feb 13 2019 - 14:20:06 EST


On Tue, Feb 12, 2019 at 06:14:16PM +0300, Kirill Tkhai wrote:
> +static unsigned noinline_for_stack move_pages_to_lru(struct lruvec *lruvec,
> + struct list_head *list)
> {
> struct pglist_data *pgdat = lruvec_pgdat(lruvec);
> + int nr_pages, nr_moved = 0;
> LIST_HEAD(pages_to_free);
> + struct page *page;
> + enum lru_list lru;
>
> - /*
> - * Put back any unfreeable pages.
> - */
> - while (!list_empty(page_list)) {
> - struct page *page = lru_to_page(page_list);
> - int lru;
> -
> - VM_BUG_ON_PAGE(PageLRU(page), page);
> - list_del(&page->lru);
> + while (!list_empty(list)) {
> + page = lru_to_page(list);
> if (unlikely(!page_evictable(page))) {
> + list_del_init(&page->lru);
> spin_unlock_irq(&pgdat->lru_lock);
> putback_lru_page(page);
> spin_lock_irq(&pgdat->lru_lock);
> continue;
> }
> -
> lruvec = mem_cgroup_page_lruvec(page, pgdat);
>
> + VM_BUG_ON_PAGE(PageLRU(page), page);

Nit, but moving the BUG down here weakens it a little bit since we miss
checking it if the page is unevictable.


Maybe worth pointing out in the changelog that the main difference from
combining these two functions is that we're now checking for !page_evictable
coming from shrink_active_list, which shouldn't change any behavior since that
path works with evictable pages only.