| @@ -605,11 +605,13 @@ static inline bool is_huge_enabled(struct shmem_sb_info *sbinfo) · 604 unmodified lines |
| 605 | */ | 605 | */ |
| 606 | static int shmem_add_to_page_cache(struct page *page, | 606 | static int shmem_add_to_page_cache(struct page *page, |
| 607 | struct address_space *mapping, | 607 | struct address_space *mapping, |
| 608 | pgoff_t index, void *expected, gfp_t gfp) | 608 | pgoff_t index, void *expected, gfp_t gfp, |
| | 609 | struct mm_struct *charge_mm) |
| 609 | { | 610 | { |
| 610 | XA_STATE_ORDER(xas, &mapping->i_pages, index, compound_order(page)); | 611 | XA_STATE_ORDER(xas, &mapping->i_pages, index, compound_order(page)); |
| 611 | unsigned long i = 0; | 612 | unsigned long i = 0; |
| 612 | unsigned long nr = compound_nr(page); | 613 | unsigned long nr = compound_nr(page); |
| | 614 | int error; |
| 613 | | 615 | |
| 614 | VM_BUG_ON_PAGE(PageTail(page), page); | 616 | VM_BUG_ON_PAGE(PageTail(page), page); |
| 615 | VM_BUG_ON_PAGE(index != round_down(index, nr), page); | 617 | VM_BUG_ON_PAGE(index != round_down(index, nr), page); |
| @@ -621,6 +623,16 @@ static int shmem_add_to_page_cache(struct page *page, · 5 unmodified lines |
| 621 | page->mapping = mapping; | 623 | page->mapping = mapping; |
| 622 | page->index = index; | 624 | page->index = index; |
| 623 | | 625 | |
| | 626 | error = mem_cgroup_charge(page, charge_mm, gfp, PageSwapCache(page)); |
| | 627 | if (error) { |
| | 628 | if (!PageSwapCache(page) && PageTransHuge(page)) { |
| | 629 | count_vm_event(THP_FILE_FALLBACK); |
| | 630 | count_vm_event(THP_FILE_FALLBACK_CHARGE); |
| | 631 | } |
| | 632 | goto error; |
| | 633 | } |
| | 634 | cgroup_throttle_swaprate(page, gfp); |
| | 635 | |
| 624 | do { | 636 | do { |
| 625 | void *entry; | 637 | void *entry; |
| 626 | xas_lock_irq(&xas); | 638 | xas_lock_irq(&xas); |
| @@ -648,12 +660,15 @@ unlock: · 21 unmodified lines |
| 648 | } while (xas_nomem(&xas, gfp)); | 660 | } while (xas_nomem(&xas, gfp)); |
| 649 | | 661 | |
| 650 | if (xas_error(&xas)) { | 662 | if (xas_error(&xas)) { |
| 651 | page->mapping = NULL; | 663 | error = xas_error(&xas); |
| 652 | page_ref_sub(page, nr); | 664 | goto error; |
| 653 | return xas_error(&xas); | | |
| 654 | } | 665 | } |
| 655 | | 666 | |
| 656 | return 0; | 667 | return 0; |
| | 668 | error: |
| | 669 | page->mapping = NULL; |
| | 670 | page_ref_sub(page, nr); |
| | 671 | return error; |
| 657 | } | 672 | } |
| 658 | | 673 | |
| 659 | /* | 674 | /* |
| @@ -1619,7 +1634,6 @@ static int shmem_swapin_page(struct inode *inode, pgoff_t index, · 959 unmodified lines |
| 1619 | struct address_space *mapping = inode->i_mapping; | 1634 | struct address_space *mapping = inode->i_mapping; |
| 1620 | struct shmem_inode_info *info = SHMEM_I(inode); | 1635 | struct shmem_inode_info *info = SHMEM_I(inode); |
| 1621 | struct mm_struct *charge_mm = vma ? vma->vm_mm : current->mm; | 1636 | struct mm_struct *charge_mm = vma ? vma->vm_mm : current->mm; |
| 1622 | struct mem_cgroup *memcg; | | |
| 1623 | struct page *page; | 1637 | struct page *page; |
| 1624 | swp_entry_t swap; | 1638 | swp_entry_t swap; |
| 1625 | int error; | 1639 | int error; |
| @@ -1664,18 +1678,11 @@ static int shmem_swapin_page(struct inode *inode, pgoff_t index, · 38 unmodified lines |
| 1664 | goto failed; | 1678 | goto failed; |
| 1665 | } | 1679 | } |
| 1666 | | 1680 | |
| 1667 | error = mem_cgroup_try_charge_delay(page, charge_mm, gfp, &memcg); | | |
| 1668 | if (error) | | |
| 1669 | goto failed; | | |
| 1670 | | | |
| 1671 | error = shmem_add_to_page_cache(page, mapping, index, | 1681 | error = shmem_add_to_page_cache(page, mapping, index, |
| 1672 | swp_to_radix_entry(swap), gfp); | 1682 | swp_to_radix_entry(swap), gfp, |
| 1673 | if (error) { | 1683 | charge_mm); |
| 1674 | mem_cgroup_cancel_charge(page, memcg); | 1684 | if (error) |
| 1675 | goto failed; | 1685 | goto failed; |
| 1676 | } | | |
| 1677 | | | |
| 1678 | mem_cgroup_commit_charge(page, memcg, true); | | |
| 1679 | | 1686 | |
| 1680 | spin_lock_irq(&info->lock); | 1687 | spin_lock_irq(&info->lock); |
| 1681 | info->swapped--; | 1688 | info->swapped--; |
| @@ -1722,7 +1729,6 @@ static int shmem_getpage_gfp(struct inode *inode, pgoff_t index, · 40 unmodified lines |
| 1722 | struct shmem_inode_info *info = SHMEM_I(inode); | 1729 | struct shmem_inode_info *info = SHMEM_I(inode); |
| 1723 | struct shmem_sb_info *sbinfo; | 1730 | struct shmem_sb_info *sbinfo; |
| 1724 | struct mm_struct *charge_mm; | 1731 | struct mm_struct *charge_mm; |
| 1725 | struct mem_cgroup *memcg; | | |
| 1726 | struct page *page; | 1732 | struct page *page; |
| 1727 | enum sgp_type sgp_huge = sgp; | 1733 | enum sgp_type sgp_huge = sgp; |
| 1728 | pgoff_t hindex = index; | 1734 | pgoff_t hindex = index; |
| @@ -1847,21 +1853,11 @@ alloc_nohuge: · 118 unmodified lines |
| 1847 | if (sgp == SGP_WRITE) | 1853 | if (sgp == SGP_WRITE) |
| 1848 | __SetPageReferenced(page); | 1854 | __SetPageReferenced(page); |
| 1849 | | 1855 | |
| 1850 | error = mem_cgroup_try_charge_delay(page, charge_mm, gfp, &memcg); | | |
| 1851 | if (error) { | | |
| 1852 | if (PageTransHuge(page)) { | | |
| 1853 | count_vm_event(THP_FILE_FALLBACK); | | |
| 1854 | count_vm_event(THP_FILE_FALLBACK_CHARGE); | | |
| 1855 | } | | |
| 1856 | goto unacct; | | |
| 1857 | } | | |
| 1858 | error = shmem_add_to_page_cache(page, mapping, hindex, | 1856 | error = shmem_add_to_page_cache(page, mapping, hindex, |
| 1859 | NULL, gfp & GFP_RECLAIM_MASK); | 1857 | NULL, gfp & GFP_RECLAIM_MASK, |
| 1860 | if (error) { | 1858 | charge_mm); |
| 1861 | mem_cgroup_cancel_charge(page, memcg); | 1859 | if (error) |
| 1862 | goto unacct; | 1860 | goto unacct; |
| 1863 | } | | |
| 1864 | mem_cgroup_commit_charge(page, memcg, false); | | |
| 1865 | lru_cache_add_anon(page); | 1861 | lru_cache_add_anon(page); |
| 1866 | | 1862 | |
| 1867 | spin_lock_irq(&info->lock); | 1863 | spin_lock_irq(&info->lock); |
| @@ -2299,7 +2295,6 @@ static int shmem_mfill_atomic_pte(struct mm_struct *dst_mm, · 431 unmodified lines |
| 2299 | struct address_space *mapping = inode->i_mapping; | 2295 | struct address_space *mapping = inode->i_mapping; |
| 2300 | gfp_t gfp = mapping_gfp_mask(mapping); | 2296 | gfp_t gfp = mapping_gfp_mask(mapping); |
| 2301 | pgoff_t pgoff = linear_page_index(dst_vma, dst_addr); | 2297 | pgoff_t pgoff = linear_page_index(dst_vma, dst_addr); |
| 2302 | struct mem_cgroup *memcg; | | |
| 2303 | spinlock_t *ptl; | 2298 | spinlock_t *ptl; |
| 2304 | void *page_kaddr; | 2299 | void *page_kaddr; |
| 2305 | struct page *page; | 2300 | struct page *page; |
| @@ -2349,16 +2344,10 @@ static int shmem_mfill_atomic_pte(struct mm_struct *dst_mm, · 43 unmodified lines |
| 2349 | if (unlikely(offset >= max_off)) | 2344 | if (unlikely(offset >= max_off)) |
| 2350 | goto out_release; | 2345 | goto out_release; |
| 2351 | | 2346 | |
| 2352 | ret = mem_cgroup_try_charge_delay(page, dst_mm, gfp, &memcg); | | |
| 2353 | if (ret) | | |
| 2354 | goto out_release; | | |
| 2355 | | | |
| 2356 | ret = shmem_add_to_page_cache(page, mapping, pgoff, NULL, | 2347 | ret = shmem_add_to_page_cache(page, mapping, pgoff, NULL, |
| 2357 | gfp & GFP_RECLAIM_MASK); | 2348 | gfp & GFP_RECLAIM_MASK, dst_mm); |
| 2358 | if (ret) | 2349 | if (ret) |
| 2359 | goto out_release_uncharge; | 2350 | goto out_release; |
| 2360 | | | |
| 2361 | mem_cgroup_commit_charge(page, memcg, false); | | |
| 2362 | | 2351 | |
| 2363 | _dst_pte = mk_pte(page, dst_vma->vm_page_prot); | 2352 | _dst_pte = mk_pte(page, dst_vma->vm_page_prot); |
| 2364 | if (dst_vma->vm_flags & VM_WRITE) | 2353 | if (dst_vma->vm_flags & VM_WRITE) |
| @@ -2379,11 +2368,11 @@ static int shmem_mfill_atomic_pte(struct mm_struct *dst_mm, · 14 unmodified lines |
| 2379 | ret = -EFAULT; | 2368 | ret = -EFAULT; |
| 2380 | max_off = DIV_ROUND_UP(i_size_read(inode), PAGE_SIZE); | 2369 | max_off = DIV_ROUND_UP(i_size_read(inode), PAGE_SIZE); |
| 2381 | if (unlikely(offset >= max_off)) | 2370 | if (unlikely(offset >= max_off)) |
| 2382 | goto out_release_uncharge_unlock; | 2371 | goto out_release_unlock; |
| 2383 | | 2372 | |
| 2384 | ret = -EEXIST; | 2373 | ret = -EEXIST; |
| 2385 | if (!pte_none(*dst_pte)) | 2374 | if (!pte_none(*dst_pte)) |
| 2386 | goto out_release_uncharge_unlock; | 2375 | goto out_release_unlock; |
| 2387 | | 2376 | |
| 2388 | lru_cache_add_anon(page); | 2377 | lru_cache_add_anon(page); |
| 2389 | | 2378 | |
| @@ -2404,12 +2393,10 @@ static int shmem_mfill_atomic_pte(struct mm_struct *dst_mm, · 14 unmodified lines |
| 2404 | ret = 0; | 2393 | ret = 0; |
| 2405 | out: | 2394 | out: |
| 2406 | return ret; | 2395 | return ret; |
| 2407 | out_release_uncharge_unlock: | 2396 | out_release_unlock: |
| 2408 | pte_unmap_unlock(dst_pte, ptl); | 2397 | pte_unmap_unlock(dst_pte, ptl); |
| 2409 | ClearPageDirty(page); | 2398 | ClearPageDirty(page); |
| 2410 | delete_from_page_cache(page); | 2399 | delete_from_page_cache(page); |
| 2411 | out_release_uncharge: | | |
| 2412 | mem_cgroup_cancel_charge(page, memcg); | | |
| 2413 | out_release: | 2400 | out_release: |
| 2414 | unlock_page(page); | 2401 | unlock_page(page); |
| 2415 | put_page(page); | 2402 | put_page(page); |