@@ -1037,7 +1037,6 @@ static void collapse_huge_page(struct mm_struct *mm,
10371037 struct page * new_page ;
10381038 spinlock_t * pmd_ptl , * pte_ptl ;
10391039 int isolated = 0 , result = 0 ;
1040- struct mem_cgroup * memcg ;
10411040 struct vm_area_struct * vma ;
10421041 struct mmu_notifier_range range ;
10431042 gfp_t gfp ;
@@ -1060,23 +1059,22 @@ static void collapse_huge_page(struct mm_struct *mm,
10601059 goto out_nolock ;
10611060 }
10621061
1063- if (unlikely (mem_cgroup_try_charge (new_page , mm , gfp , & memcg ))) {
1062+ if (unlikely (mem_cgroup_charge (new_page , mm , gfp , false ))) {
10641063 result = SCAN_CGROUP_CHARGE_FAIL ;
10651064 goto out_nolock ;
10661065 }
1066+ count_memcg_page_event (new_page , THP_COLLAPSE_ALLOC );
10671067
10681068 down_read (& mm -> mmap_sem );
10691069 result = hugepage_vma_revalidate (mm , address , & vma );
10701070 if (result ) {
1071- mem_cgroup_cancel_charge (new_page , memcg );
10721071 up_read (& mm -> mmap_sem );
10731072 goto out_nolock ;
10741073 }
10751074
10761075 pmd = mm_find_pmd (mm , address );
10771076 if (!pmd ) {
10781077 result = SCAN_PMD_NULL ;
1079- mem_cgroup_cancel_charge (new_page , memcg );
10801078 up_read (& mm -> mmap_sem );
10811079 goto out_nolock ;
10821080 }
@@ -1088,7 +1086,6 @@ static void collapse_huge_page(struct mm_struct *mm,
10881086 */
10891087 if (unmapped && !__collapse_huge_page_swapin (mm , vma , address ,
10901088 pmd , referenced )) {
1091- mem_cgroup_cancel_charge (new_page , memcg );
10921089 up_read (& mm -> mmap_sem );
10931090 goto out_nolock ;
10941091 }
@@ -1175,9 +1172,7 @@ static void collapse_huge_page(struct mm_struct *mm,
11751172
11761173 spin_lock (pmd_ptl );
11771174 BUG_ON (!pmd_none (* pmd ));
1178- mem_cgroup_commit_charge (new_page , memcg , false);
11791175 page_add_new_anon_rmap (new_page , vma , address , true);
1180- count_memcg_events (memcg , THP_COLLAPSE_ALLOC , 1 );
11811176 lru_cache_add_active_or_unevictable (new_page , vma );
11821177 pgtable_trans_huge_deposit (mm , pmd , pgtable );
11831178 set_pmd_at (mm , address , pmd , _pmd );
@@ -1191,10 +1186,11 @@ static void collapse_huge_page(struct mm_struct *mm,
11911186out_up_write :
11921187 up_write (& mm -> mmap_sem );
11931188out_nolock :
1189+ if (!IS_ERR_OR_NULL (* hpage ))
1190+ mem_cgroup_uncharge (* hpage );
11941191 trace_mm_collapse_huge_page (mm , isolated , result );
11951192 return ;
11961193out :
1197- mem_cgroup_cancel_charge (new_page , memcg );
11981194 goto out_up_write ;
11991195}
12001196
@@ -1618,7 +1614,6 @@ static void collapse_file(struct mm_struct *mm,
16181614 struct address_space * mapping = file -> f_mapping ;
16191615 gfp_t gfp ;
16201616 struct page * new_page ;
1621- struct mem_cgroup * memcg ;
16221617 pgoff_t index , end = start + HPAGE_PMD_NR ;
16231618 LIST_HEAD (pagelist );
16241619 XA_STATE_ORDER (xas , & mapping -> i_pages , start , HPAGE_PMD_ORDER );
@@ -1637,10 +1632,11 @@ static void collapse_file(struct mm_struct *mm,
16371632 goto out ;
16381633 }
16391634
1640- if (unlikely (mem_cgroup_try_charge (new_page , mm , gfp , & memcg ))) {
1635+ if (unlikely (mem_cgroup_charge (new_page , mm , gfp , false ))) {
16411636 result = SCAN_CGROUP_CHARGE_FAIL ;
16421637 goto out ;
16431638 }
1639+ count_memcg_page_event (new_page , THP_COLLAPSE_ALLOC );
16441640
16451641 /* This will be less messy when we use multi-index entries */
16461642 do {
@@ -1650,7 +1646,6 @@ static void collapse_file(struct mm_struct *mm,
16501646 break ;
16511647 xas_unlock_irq (& xas );
16521648 if (!xas_nomem (& xas , GFP_KERNEL )) {
1653- mem_cgroup_cancel_charge (new_page , memcg );
16541649 result = SCAN_FAIL ;
16551650 goto out ;
16561651 }
@@ -1844,18 +1839,9 @@ static void collapse_file(struct mm_struct *mm,
18441839 }
18451840
18461841 if (nr_none ) {
1847- struct lruvec * lruvec ;
1848- /*
1849- * XXX: We have started try_charge and pinned the
1850- * memcg, but the page isn't committed yet so we
1851- * cannot use mod_lruvec_page_state(). This hackery
1852- * will be cleaned up when remove the page->mapping
1853- * dependency from memcg and fully charge above.
1854- */
1855- lruvec = mem_cgroup_lruvec (memcg , page_pgdat (new_page ));
1856- __mod_lruvec_state (lruvec , NR_FILE_PAGES , nr_none );
1842+ __mod_lruvec_page_state (new_page , NR_FILE_PAGES , nr_none );
18571843 if (is_shmem )
1858- __mod_lruvec_state ( lruvec , NR_SHMEM , nr_none );
1844+ __mod_lruvec_page_state ( new_page , NR_SHMEM , nr_none );
18591845 }
18601846
18611847xa_locked :
@@ -1893,15 +1879,13 @@ static void collapse_file(struct mm_struct *mm,
18931879
18941880 SetPageUptodate (new_page );
18951881 page_ref_add (new_page , HPAGE_PMD_NR - 1 );
1896- mem_cgroup_commit_charge (new_page , memcg , false);
18971882
18981883 if (is_shmem ) {
18991884 set_page_dirty (new_page );
19001885 lru_cache_add_anon (new_page );
19011886 } else {
19021887 lru_cache_add_file (new_page );
19031888 }
1904- count_memcg_events (memcg , THP_COLLAPSE_ALLOC , 1 );
19051889
19061890 /*
19071891 * Remove pte page tables, so we can re-fault the page as huge.
@@ -1948,13 +1932,14 @@ static void collapse_file(struct mm_struct *mm,
19481932 VM_BUG_ON (nr_none );
19491933 xas_unlock_irq (& xas );
19501934
1951- mem_cgroup_cancel_charge (new_page , memcg );
19521935 new_page -> mapping = NULL ;
19531936 }
19541937
19551938 unlock_page (new_page );
19561939out :
19571940 VM_BUG_ON (!list_empty (& pagelist ));
1941+ if (!IS_ERR_OR_NULL (* hpage ))
1942+ mem_cgroup_uncharge (* hpage );
19581943 /* TODO: tracepoints */
19591944}
19601945
0 commit comments