ksm.c (6f84981772535e670e4e2df051a672af229b6694) | ksm.c (7d4a8be0c4b2b7ffb367929d2b352651f083806b) |
---|---|
1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * Memory merging support. 4 * 5 * This code enables dynamic sharing of identical pages found in different 6 * memory areas, even if they are not shared by fork() 7 * 8 * Copyright (C) 2008-2009 Red Hat, Inc. --- 1043 unchanged lines hidden (view full) --- 1052 bool anon_exclusive; 1053 1054 pvmw.address = page_address_in_vma(page, vma); 1055 if (pvmw.address == -EFAULT) 1056 goto out; 1057 1058 BUG_ON(PageTransCompound(page)); 1059 | 1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * Memory merging support. 4 * 5 * This code enables dynamic sharing of identical pages found in different 6 * memory areas, even if they are not shared by fork() 7 * 8 * Copyright (C) 2008-2009 Red Hat, Inc. --- 1043 unchanged lines hidden (view full) --- 1052 bool anon_exclusive; 1053 1054 pvmw.address = page_address_in_vma(page, vma); 1055 if (pvmw.address == -EFAULT) 1056 goto out; 1057 1058 BUG_ON(PageTransCompound(page)); 1059 |
1060 mmu_notifier_range_init(&range, MMU_NOTIFY_CLEAR, 0, vma, mm, 1061 pvmw.address, | 1060 mmu_notifier_range_init(&range, MMU_NOTIFY_CLEAR, 0, mm, pvmw.address, |
1062 pvmw.address + PAGE_SIZE); 1063 mmu_notifier_invalidate_range_start(&range); 1064 1065 if (!page_vma_mapped_walk(&pvmw)) 1066 goto out_mn; 1067 if (WARN_ONCE(!pvmw.pte, "Unexpected PMD mapping?")) 1068 goto out_unlock; 1069 --- 89 unchanged lines hidden (view full) --- 1159 * without holding anon_vma lock for write. So when looking for a 1160 * genuine pmde (in which to find pte), test present and !THP together. 1161 */ 1162 pmde = *pmd; 1163 barrier(); 1164 if (!pmd_present(pmde) || pmd_trans_huge(pmde)) 1165 goto out; 1166 | 1061 pvmw.address + PAGE_SIZE); 1062 mmu_notifier_invalidate_range_start(&range); 1063 1064 if (!page_vma_mapped_walk(&pvmw)) 1065 goto out_mn; 1066 if (WARN_ONCE(!pvmw.pte, "Unexpected PMD mapping?")) 1067 goto out_unlock; 1068 --- 89 unchanged lines hidden (view full) --- 1158 * without holding anon_vma lock for write. So when looking for a 1159 * genuine pmde (in which to find pte), test present and !THP together. 1160 */ 1161 pmde = *pmd; 1162 barrier(); 1163 if (!pmd_present(pmde) || pmd_trans_huge(pmde)) 1164 goto out; 1165 |
1167 mmu_notifier_range_init(&range, MMU_NOTIFY_CLEAR, 0, vma, mm, addr, | 1166 mmu_notifier_range_init(&range, MMU_NOTIFY_CLEAR, 0, mm, addr, |
1168 addr + PAGE_SIZE); 1169 mmu_notifier_invalidate_range_start(&range); 1170 1171 ptep = pte_offset_map_lock(mm, pmd, addr, &ptl); 1172 if (!pte_same(*ptep, orig_pte)) { 1173 pte_unmap_unlock(ptep, ptl); 1174 goto out_mn; 1175 } --- 2075 unchanged lines hidden --- | 1167 addr + PAGE_SIZE); 1168 mmu_notifier_invalidate_range_start(&range); 1169 1170 ptep = pte_offset_map_lock(mm, pmd, addr, &ptl); 1171 if (!pte_same(*ptep, orig_pte)) { 1172 pte_unmap_unlock(ptep, ptl); 1173 goto out_mn; 1174 } --- 2075 unchanged lines hidden --- |