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 ---