shmem.c (6b16f5d12202a23d875915349cc031c07fe1b3ec) shmem.c (2cf855837b89d92996cf264713f3bed2bf9b0b4f)
1/*
2 * Resizable virtual memory filesystem for Linux.
3 *
4 * Copyright (C) 2000 Linus Torvalds.
5 * 2000 Transmeta Corp.
6 * 2000-2001 Christoph Rohland
7 * 2000-2001 SAP AG
8 * 2002 Red Hat Inc.

--- 1225 unchanged lines hidden (view full) ---

1234 if (unlikely(!PageSwapCache(page) || page_private(page) != swap.val))
1235 goto out;
1236
1237 /*
1238 * Charge page using GFP_KERNEL while we can wait, before taking
1239 * the shmem_swaplist_mutex which might hold up shmem_writepage().
1240 * Charged back to the user (not to caller) when swap account is used.
1241 */
1/*
2 * Resizable virtual memory filesystem for Linux.
3 *
4 * Copyright (C) 2000 Linus Torvalds.
5 * 2000 Transmeta Corp.
6 * 2000-2001 Christoph Rohland
7 * 2000-2001 SAP AG
8 * 2002 Red Hat Inc.

--- 1225 unchanged lines hidden (view full) ---

1234 if (unlikely(!PageSwapCache(page) || page_private(page) != swap.val))
1235 goto out;
1236
1237 /*
1238 * Charge page using GFP_KERNEL while we can wait, before taking
1239 * the shmem_swaplist_mutex which might hold up shmem_writepage().
1240 * Charged back to the user (not to caller) when swap account is used.
1241 */
1242 error = mem_cgroup_try_charge(page, current->mm, GFP_KERNEL, &memcg,
1243 false);
1242 error = mem_cgroup_try_charge_delay(page, current->mm, GFP_KERNEL,
1243 &memcg, false);
1244 if (error)
1245 goto out;
1246 /* No radix_tree_preload: swap entry keeps a place for page in tree */
1247 error = -EAGAIN;
1248
1249 mutex_lock(&shmem_swaplist_mutex);
1250 list_for_each_safe(this, next, &shmem_swaplist) {
1251 info = list_entry(this, struct shmem_inode_info, swaplist);

--- 455 unchanged lines hidden (view full) ---

1707 wait_on_page_writeback(page);
1708
1709 if (shmem_should_replace_page(page, gfp)) {
1710 error = shmem_replace_page(&page, gfp, info, index);
1711 if (error)
1712 goto failed;
1713 }
1714
1244 if (error)
1245 goto out;
1246 /* No radix_tree_preload: swap entry keeps a place for page in tree */
1247 error = -EAGAIN;
1248
1249 mutex_lock(&shmem_swaplist_mutex);
1250 list_for_each_safe(this, next, &shmem_swaplist) {
1251 info = list_entry(this, struct shmem_inode_info, swaplist);

--- 455 unchanged lines hidden (view full) ---

1707 wait_on_page_writeback(page);
1708
1709 if (shmem_should_replace_page(page, gfp)) {
1710 error = shmem_replace_page(&page, gfp, info, index);
1711 if (error)
1712 goto failed;
1713 }
1714
1715 error = mem_cgroup_try_charge(page, charge_mm, gfp, &memcg,
1715 error = mem_cgroup_try_charge_delay(page, charge_mm, gfp, &memcg,
1716 false);
1717 if (!error) {
1718 error = shmem_add_to_page_cache(page, mapping, index,
1719 swp_to_radix_entry(swap));
1720 /*
1721 * We already confirmed swap under page lock, and make
1722 * no memory allocation here, so usually no possibility
1723 * of error; but free_swap_and_cache() only trylocks a

--- 89 unchanged lines hidden (view full) ---

1813 if (PageTransHuge(page))
1814 hindex = round_down(index, HPAGE_PMD_NR);
1815 else
1816 hindex = index;
1817
1818 if (sgp == SGP_WRITE)
1819 __SetPageReferenced(page);
1820
1716 false);
1717 if (!error) {
1718 error = shmem_add_to_page_cache(page, mapping, index,
1719 swp_to_radix_entry(swap));
1720 /*
1721 * We already confirmed swap under page lock, and make
1722 * no memory allocation here, so usually no possibility
1723 * of error; but free_swap_and_cache() only trylocks a

--- 89 unchanged lines hidden (view full) ---

1813 if (PageTransHuge(page))
1814 hindex = round_down(index, HPAGE_PMD_NR);
1815 else
1816 hindex = index;
1817
1818 if (sgp == SGP_WRITE)
1819 __SetPageReferenced(page);
1820
1821 error = mem_cgroup_try_charge(page, charge_mm, gfp, &memcg,
1821 error = mem_cgroup_try_charge_delay(page, charge_mm, gfp, &memcg,
1822 PageTransHuge(page));
1823 if (error)
1824 goto unacct;
1825 error = radix_tree_maybe_preload_order(gfp & GFP_RECLAIM_MASK,
1826 compound_order(page));
1827 if (!error) {
1828 error = shmem_add_to_page_cache(page, mapping, hindex,
1829 NULL);

--- 456 unchanged lines hidden (view full) ---

2286 *pagep = NULL;
2287 }
2288
2289 VM_BUG_ON(PageLocked(page) || PageSwapBacked(page));
2290 __SetPageLocked(page);
2291 __SetPageSwapBacked(page);
2292 __SetPageUptodate(page);
2293
1822 PageTransHuge(page));
1823 if (error)
1824 goto unacct;
1825 error = radix_tree_maybe_preload_order(gfp & GFP_RECLAIM_MASK,
1826 compound_order(page));
1827 if (!error) {
1828 error = shmem_add_to_page_cache(page, mapping, hindex,
1829 NULL);

--- 456 unchanged lines hidden (view full) ---

2286 *pagep = NULL;
2287 }
2288
2289 VM_BUG_ON(PageLocked(page) || PageSwapBacked(page));
2290 __SetPageLocked(page);
2291 __SetPageSwapBacked(page);
2292 __SetPageUptodate(page);
2293
2294 ret = mem_cgroup_try_charge(page, dst_mm, gfp, &memcg, false);
2294 ret = mem_cgroup_try_charge_delay(page, dst_mm, gfp, &memcg, false);
2295 if (ret)
2296 goto out_release;
2297
2298 ret = radix_tree_maybe_preload(gfp & GFP_RECLAIM_MASK);
2299 if (!ret) {
2300 ret = shmem_add_to_page_cache(page, mapping, pgoff, NULL);
2301 radix_tree_preload_end();
2302 }

--- 1769 unchanged lines hidden ---
2295 if (ret)
2296 goto out_release;
2297
2298 ret = radix_tree_maybe_preload(gfp & GFP_RECLAIM_MASK);
2299 if (!ret) {
2300 ret = shmem_add_to_page_cache(page, mapping, pgoff, NULL);
2301 radix_tree_preload_end();
2302 }

--- 1769 unchanged lines hidden ---