|
@@ -2628,6 +2628,7 @@ static int do_swap_page(struct mm_struct *mm, struct vm_area_struct *vma,
|
|
swp_entry_t entry;
|
|
swp_entry_t entry;
|
|
pte_t pte;
|
|
pte_t pte;
|
|
struct mem_cgroup *ptr = NULL;
|
|
struct mem_cgroup *ptr = NULL;
|
|
|
|
+ int exclusive = 0;
|
|
int ret = 0;
|
|
int ret = 0;
|
|
|
|
|
|
if (!pte_unmap_same(mm, pmd, page_table, orig_pte))
|
|
if (!pte_unmap_same(mm, pmd, page_table, orig_pte))
|
|
@@ -2722,10 +2723,11 @@ static int do_swap_page(struct mm_struct *mm, struct vm_area_struct *vma,
|
|
if ((flags & FAULT_FLAG_WRITE) && reuse_swap_page(page)) {
|
|
if ((flags & FAULT_FLAG_WRITE) && reuse_swap_page(page)) {
|
|
pte = maybe_mkwrite(pte_mkdirty(pte), vma);
|
|
pte = maybe_mkwrite(pte_mkdirty(pte), vma);
|
|
flags &= ~FAULT_FLAG_WRITE;
|
|
flags &= ~FAULT_FLAG_WRITE;
|
|
|
|
+ exclusive = 1;
|
|
}
|
|
}
|
|
flush_icache_page(vma, page);
|
|
flush_icache_page(vma, page);
|
|
set_pte_at(mm, address, page_table, pte);
|
|
set_pte_at(mm, address, page_table, pte);
|
|
- page_add_anon_rmap(page, vma, address);
|
|
|
|
|
|
+ do_page_add_anon_rmap(page, vma, address, exclusive);
|
|
/* It's better to call commit-charge after rmap is established */
|
|
/* It's better to call commit-charge after rmap is established */
|
|
mem_cgroup_commit_charge_swapin(page, ptr);
|
|
mem_cgroup_commit_charge_swapin(page, ptr);
|
|
|
|
|