diff options
Diffstat (limited to 'mm/swapfile.c')
| -rw-r--r-- | mm/swapfile.c | 21 | 
1 files changed, 10 insertions, 11 deletions
diff --git a/mm/swapfile.c b/mm/swapfile.c index 4c524f7bd0bf..8798b2e0ac59 100644 --- a/mm/swapfile.c +++ b/mm/swapfile.c @@ -843,16 +843,13 @@ void swap_free(swp_entry_t entry)  /*   * Called after dropping swapcache to decrease refcnt to swap entries.   */ -void swapcache_free(swp_entry_t entry, struct page *page) +void swapcache_free(swp_entry_t entry)  {  	struct swap_info_struct *p; -	unsigned char count;  	p = swap_info_get(entry);  	if (p) { -		count = swap_entry_free(p, entry, SWAP_HAS_CACHE); -		if (page) -			mem_cgroup_uncharge_swapcache(page, entry, count != 0); +		swap_entry_free(p, entry, SWAP_HAS_CACHE);  		spin_unlock(&p->lock);  	}  } @@ -1106,15 +1103,14 @@ static int unuse_pte(struct vm_area_struct *vma, pmd_t *pmd,  	if (unlikely(!page))  		return -ENOMEM; -	if (mem_cgroup_try_charge_swapin(vma->vm_mm, page, -					 GFP_KERNEL, &memcg)) { +	if (mem_cgroup_try_charge(page, vma->vm_mm, GFP_KERNEL, &memcg)) {  		ret = -ENOMEM;  		goto out_nolock;  	}  	pte = pte_offset_map_lock(vma->vm_mm, pmd, addr, &ptl);  	if (unlikely(!maybe_same_pte(*pte, swp_entry_to_pte(entry)))) { -		mem_cgroup_cancel_charge_swapin(memcg); +		mem_cgroup_cancel_charge(page, memcg);  		ret = 0;  		goto out;  	} @@ -1124,11 +1120,14 @@ static int unuse_pte(struct vm_area_struct *vma, pmd_t *pmd,  	get_page(page);  	set_pte_at(vma->vm_mm, addr, pte,  		   pte_mkold(mk_pte(page, vma->vm_page_prot))); -	if (page == swapcache) +	if (page == swapcache) {  		page_add_anon_rmap(page, vma, addr); -	else /* ksm created a completely new copy */ +		mem_cgroup_commit_charge(page, memcg, true); +	} else { /* ksm created a completely new copy */  		page_add_new_anon_rmap(page, vma, addr); -	mem_cgroup_commit_charge_swapin(page, memcg); +		mem_cgroup_commit_charge(page, memcg, false); +		lru_cache_add_active_or_unevictable(page, vma); +	}  	swap_free(entry);  	/*  	 * Move the page to the active list so it is not  |