mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-31 04:01:48 -04:00
tmpfs: convert mem_cgroup shmem to radix-swap
Remove mem_cgroup_shmem_charge_fallback(): it was only required when we had to move swappage to filecache with GFP_NOWAIT. Remove the GFP_NOWAIT special case from mem_cgroup_cache_charge(), by moving its call out from shmem_add_to_page_cache() to two of thats three callers. But leave it doing mem_cgroup_uncharge_cache_page() on error: although asymmetrical, it's easier for all 3 callers to handle. These two changes would also be appropriate if anyone were to start using shmem_read_mapping_page_gfp() with GFP_NOWAIT. Remove mem_cgroup_get_shmem_target(): mc_handle_file_pte() can test radix_tree_exceptional_entry() to get what it needs for itself. Signed-off-by: Hugh Dickins <[email protected]> Acked-by: Rik van Riel <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
This commit is contained in:
parent
54af604218
commit
aa3b189551
4 changed files with 20 additions and 139 deletions
|
|
@ -35,7 +35,6 @@
|
|||
#include <linux/limits.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/rbtree.h>
|
||||
#include <linux/shmem_fs.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/swap.h>
|
||||
#include <linux/swapops.h>
|
||||
|
|
@ -2873,30 +2872,6 @@ int mem_cgroup_cache_charge(struct page *page, struct mm_struct *mm,
|
|||
return 0;
|
||||
if (PageCompound(page))
|
||||
return 0;
|
||||
/*
|
||||
* Corner case handling. This is called from add_to_page_cache()
|
||||
* in usual. But some FS (shmem) precharges this page before calling it
|
||||
* and call add_to_page_cache() with GFP_NOWAIT.
|
||||
*
|
||||
* For GFP_NOWAIT case, the page may be pre-charged before calling
|
||||
* add_to_page_cache(). (See shmem.c) check it here and avoid to call
|
||||
* charge twice. (It works but has to pay a bit larger cost.)
|
||||
* And when the page is SwapCache, it should take swap information
|
||||
* into account. This is under lock_page() now.
|
||||
*/
|
||||
if (!(gfp_mask & __GFP_WAIT)) {
|
||||
struct page_cgroup *pc;
|
||||
|
||||
pc = lookup_page_cgroup(page);
|
||||
if (!pc)
|
||||
return 0;
|
||||
lock_page_cgroup(pc);
|
||||
if (PageCgroupUsed(pc)) {
|
||||
unlock_page_cgroup(pc);
|
||||
return 0;
|
||||
}
|
||||
unlock_page_cgroup(pc);
|
||||
}
|
||||
|
||||
if (unlikely(!mm))
|
||||
mm = &init_mm;
|
||||
|
|
@ -3486,31 +3461,6 @@ void mem_cgroup_end_migration(struct mem_cgroup *mem,
|
|||
cgroup_release_and_wakeup_rmdir(&mem->css);
|
||||
}
|
||||
|
||||
/*
|
||||
* A call to try to shrink memory usage on charge failure at shmem's swapin.
|
||||
* Calling hierarchical_reclaim is not enough because we should update
|
||||
* last_oom_jiffies to prevent pagefault_out_of_memory from invoking global OOM.
|
||||
* Moreover considering hierarchy, we should reclaim from the mem_over_limit,
|
||||
* not from the memcg which this page would be charged to.
|
||||
* try_charge_swapin does all of these works properly.
|
||||
*/
|
||||
int mem_cgroup_shmem_charge_fallback(struct page *page,
|
||||
struct mm_struct *mm,
|
||||
gfp_t gfp_mask)
|
||||
{
|
||||
struct mem_cgroup *mem;
|
||||
int ret;
|
||||
|
||||
if (mem_cgroup_disabled())
|
||||
return 0;
|
||||
|
||||
ret = mem_cgroup_try_charge_swapin(mm, page, gfp_mask, &mem);
|
||||
if (!ret)
|
||||
mem_cgroup_cancel_charge_swapin(mem); /* it does !mem check */
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_DEBUG_VM
|
||||
static struct page_cgroup *lookup_page_cgroup_used(struct page *page)
|
||||
{
|
||||
|
|
@ -5330,15 +5280,17 @@ static struct page *mc_handle_file_pte(struct vm_area_struct *vma,
|
|||
pgoff = pte_to_pgoff(ptent);
|
||||
|
||||
/* page is moved even if it's not RSS of this task(page-faulted). */
|
||||
if (!mapping_cap_swap_backed(mapping)) { /* normal file */
|
||||
page = find_get_page(mapping, pgoff);
|
||||
} else { /* shmem/tmpfs file. we should take account of swap too. */
|
||||
swp_entry_t ent;
|
||||
mem_cgroup_get_shmem_target(inode, pgoff, &page, &ent);
|
||||
if (do_swap_account)
|
||||
entry->val = ent.val;
|
||||
}
|
||||
page = find_get_page(mapping, pgoff);
|
||||
|
||||
#ifdef CONFIG_SWAP
|
||||
/* shmem/tmpfs may report page out on swap: account for that too. */
|
||||
if (radix_tree_exceptional_entry(page)) {
|
||||
swp_entry_t swap = radix_to_swp_entry(page);
|
||||
if (do_swap_account)
|
||||
*entry = swap;
|
||||
page = find_get_page(&swapper_space, swap.val);
|
||||
}
|
||||
#endif
|
||||
return page;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue