Messages in this thread | | | Date | Wed, 10 Jun 2015 16:34:26 +0200 | From | Vlastimil Babka <> | Subject | Re: [PATCHv6 27/36] mm: differentiate page_mapped() from page_mapcount() for compound pages |
| |
On 06/03/2015 07:05 PM, Kirill A. Shutemov wrote: > Let's define page_mapped() to be true for compound pages if any > sub-pages of the compound page is mapped (with PMD or PTE). > > On other hand page_mapcount() return mapcount for this particular small > page. > > This will make cases like page_get_anon_vma() behave correctly once we > allow huge pages to be mapped with PTE. > > Most users outside core-mm should use page_mapcount() instead of > page_mapped(). > > Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> > Tested-by: Sasha Levin <sasha.levin@oracle.com>
[...]
> @@ -917,10 +917,21 @@ static inline pgoff_t page_file_index(struct page *page) > > /* > * Return true if this page is mapped into pagetables. > + * For compound page it returns true if any subpage of compound page is mapped. > */ > -static inline int page_mapped(struct page *page) > +static inline bool page_mapped(struct page *page) > { > - return atomic_read(&(page)->_mapcount) + compound_mapcount(page) >= 0; > + int i; > + if (likely(!PageCompound(page))) > + return atomic_read(&page->_mapcount) >= 0; > + page = compound_head(page); > + if (compound_mapcount(page))
Same optimization opportunity as I pointed out in previous patch for page_mapcount().
> + return true; > + for (i = 0; i < hpage_nr_pages(page); i++) { > + if (atomic_read(&page[i]._mapcount) >= 0) > + return true; > + } > + return true; > } > > /* > diff --git a/mm/filemap.c b/mm/filemap.c > index cb41cf3069d2..c6cf03303ded 100644 > --- a/mm/filemap.c > +++ b/mm/filemap.c > @@ -202,7 +202,7 @@ void __delete_from_page_cache(struct page *page, void *shadow) > __dec_zone_page_state(page, NR_FILE_PAGES); > if (PageSwapBacked(page)) > __dec_zone_page_state(page, NR_SHMEM); > - BUG_ON(page_mapped(page)); > + VM_BUG_ON_PAGE(page_mapped(page), page); > > /* > * At this point page must be either written or cleaned by truncate. >
| |