Hi Johannes, Michal,

>From page to its lruvec, a few memory access under lock cause extra cost.
Would you like to save the per memcg lruvec pointer to page->private?

Thanks
Alex



在 2020/7/25 下午8:59, Alex Shi 写道:
>  /**
>   * mem_cgroup_page_lruvec - return lruvec for isolating/putting an LRU page
>   * @page: the page
> @@ -1215,7 +1228,8 @@ struct lruvec *mem_cgroup_page_lruvec(struct page 
> *page, struct pglist_data *pgd
>               goto out;
>       }
>  
> -     memcg = page->mem_cgroup;
> +     VM_BUG_ON_PAGE(PageTail(page), page);
> +     memcg = READ_ONCE(page->mem_cgroup);
>       /*
>        * Swapcache readahead pages are added to the LRU - and
>        * possibly migrated - before they are charged.
> @@ -1236,6 +1250,51 @@ struct lruvec *mem_cgroup_page_lruvec(struct page 
> *page, struct pglist_data *pgd
>       return lruvec;
>  }
>  
> +struct lruvec *lock_page_lruvec(struct page *page)
> +{
> +     struct lruvec *lruvec;
> +     struct pglist_data *pgdat = page_pgdat(page);
> +
> +     rcu_read_lock();
> +     lruvec = mem_cgroup_page_lruvec(page, pgdat);
> +     spin_lock(&lruvec->lru_lock);
> +     rcu_read_unlock();
> +
> +     lruvec_memcg_debug(lruvec, page);
> +
> +     return lruvec;
> +}
> +

Reply via email to