|
@@ -882,8 +882,13 @@ void do_page_add_anon_rmap(struct page *page,
|
|
|
struct vm_area_struct *vma, unsigned long address, int exclusive)
|
|
|
{
|
|
|
int first = atomic_inc_and_test(&page->_mapcount);
|
|
|
- if (first)
|
|
|
- __inc_zone_page_state(page, NR_ANON_PAGES);
|
|
|
+ if (first) {
|
|
|
+ if (!PageTransHuge(page))
|
|
|
+ __inc_zone_page_state(page, NR_ANON_PAGES);
|
|
|
+ else
|
|
|
+ __inc_zone_page_state(page,
|
|
|
+ NR_ANON_TRANSPARENT_HUGEPAGES);
|
|
|
+ }
|
|
|
if (unlikely(PageKsm(page)))
|
|
|
return;
|
|
|
|
|
@@ -911,7 +916,10 @@ void page_add_new_anon_rmap(struct page *page,
|
|
|
VM_BUG_ON(address < vma->vm_start || address >= vma->vm_end);
|
|
|
SetPageSwapBacked(page);
|
|
|
atomic_set(&page->_mapcount, 0); /* increment count (starts at -1) */
|
|
|
- __inc_zone_page_state(page, NR_ANON_PAGES);
|
|
|
+ if (!PageTransHuge(page))
|
|
|
+ __inc_zone_page_state(page, NR_ANON_PAGES);
|
|
|
+ else
|
|
|
+ __inc_zone_page_state(page, NR_ANON_TRANSPARENT_HUGEPAGES);
|
|
|
__page_set_anon_rmap(page, vma, address, 1);
|
|
|
if (page_evictable(page, vma))
|
|
|
lru_cache_add_lru(page, LRU_ACTIVE_ANON);
|
|
@@ -964,7 +972,11 @@ void page_remove_rmap(struct page *page)
|
|
|
return;
|
|
|
if (PageAnon(page)) {
|
|
|
mem_cgroup_uncharge_page(page);
|
|
|
- __dec_zone_page_state(page, NR_ANON_PAGES);
|
|
|
+ if (!PageTransHuge(page))
|
|
|
+ __dec_zone_page_state(page, NR_ANON_PAGES);
|
|
|
+ else
|
|
|
+ __dec_zone_page_state(page,
|
|
|
+ NR_ANON_TRANSPARENT_HUGEPAGES);
|
|
|
} else {
|
|
|
__dec_zone_page_state(page, NR_FILE_MAPPED);
|
|
|
mem_cgroup_update_file_mapped(page, -1);
|