svn commit: r250808 - in user/attilio/vmobj-readlock/sys: amd64/amd64 arm/arm i386/i386 i386/xen ia64/ia64 mips/mips powerpc/aim powerpc/booke sparc64/sparc64
Attilio Rao
attilio at FreeBSD.org
Sun May 19 15:26:18 UTC 2013
Author: attilio
Date: Sun May 19 15:26:15 2013
New Revision: 250808
URL: http://svnweb.freebsd.org/changeset/base/250808
Log:
Add vm object lock assertions to pmap_copy_page() which must
avoid mappings destruction and page freeing while performing the copy.
(Documentation will be filled promptly later about this).
Sponsored by: EMC / Isilon storage division
Modified:
user/attilio/vmobj-readlock/sys/amd64/amd64/pmap.c
user/attilio/vmobj-readlock/sys/arm/arm/pmap-v6.c
user/attilio/vmobj-readlock/sys/arm/arm/pmap.c
user/attilio/vmobj-readlock/sys/i386/i386/pmap.c
user/attilio/vmobj-readlock/sys/i386/xen/pmap.c
user/attilio/vmobj-readlock/sys/ia64/ia64/pmap.c
user/attilio/vmobj-readlock/sys/mips/mips/pmap.c
user/attilio/vmobj-readlock/sys/powerpc/aim/mmu_oea.c
user/attilio/vmobj-readlock/sys/powerpc/aim/mmu_oea64.c
user/attilio/vmobj-readlock/sys/powerpc/booke/pmap.c
user/attilio/vmobj-readlock/sys/sparc64/sparc64/pmap.c
Modified: user/attilio/vmobj-readlock/sys/amd64/amd64/pmap.c
==============================================================================
--- user/attilio/vmobj-readlock/sys/amd64/amd64/pmap.c Sun May 19 14:59:24 2013 (r250807)
+++ user/attilio/vmobj-readlock/sys/amd64/amd64/pmap.c Sun May 19 15:26:15 2013 (r250808)
@@ -4229,8 +4229,13 @@ pmap_zero_page_idle(vm_page_t m)
void
pmap_copy_page(vm_page_t msrc, vm_page_t mdst)
{
- vm_offset_t src = PHYS_TO_DMAP(VM_PAGE_TO_PHYS(msrc));
- vm_offset_t dst = PHYS_TO_DMAP(VM_PAGE_TO_PHYS(mdst));
+ vm_offset_t dst, src;
+
+ VM_OBJECT_ASSERT_LOCKED(msrc->object);
+ VM_OBJECT_ASSERT_LOCKED(mdst->object);
+
+ src = PHYS_TO_DMAP(VM_PAGE_TO_PHYS(msrc));
+ dst = PHYS_TO_DMAP(VM_PAGE_TO_PHYS(mdst));
pagecopy((void *)src, (void *)dst);
}
Modified: user/attilio/vmobj-readlock/sys/arm/arm/pmap-v6.c
==============================================================================
--- user/attilio/vmobj-readlock/sys/arm/arm/pmap-v6.c Sun May 19 14:59:24 2013 (r250807)
+++ user/attilio/vmobj-readlock/sys/arm/arm/pmap-v6.c Sun May 19 15:26:15 2013 (r250808)
@@ -3729,6 +3729,9 @@ void
pmap_copy_page(vm_page_t src, vm_page_t dst)
{
+ VM_OBJECT_ASSERT_LOCKED(src->object);
+ VM_OBJECT_ASSERT_LOCKED(dst->object);
+
if (_arm_memcpy && PAGE_SIZE >= _min_memcpy_size &&
_arm_memcpy((void *)VM_PAGE_TO_PHYS(dst),
(void *)VM_PAGE_TO_PHYS(src), PAGE_SIZE, IS_PHYSICAL) == 0)
Modified: user/attilio/vmobj-readlock/sys/arm/arm/pmap.c
==============================================================================
--- user/attilio/vmobj-readlock/sys/arm/arm/pmap.c Sun May 19 14:59:24 2013 (r250807)
+++ user/attilio/vmobj-readlock/sys/arm/arm/pmap.c Sun May 19 15:26:15 2013 (r250808)
@@ -4411,6 +4411,9 @@ pmap_copy_page(vm_page_t src, vm_page_t
vm_offset_t srcpg, dstpg;
#endif
+ VM_OBJECT_ASSERT_LOCKED(src->object);
+ VM_OBJECT_ASSERT_LOCKED(dst->object);
+
cpu_dcache_wbinv_all();
cpu_l2cache_wbinv_all();
if (_arm_memcpy && PAGE_SIZE >= _min_memcpy_size &&
Modified: user/attilio/vmobj-readlock/sys/i386/i386/pmap.c
==============================================================================
--- user/attilio/vmobj-readlock/sys/i386/i386/pmap.c Sun May 19 14:59:24 2013 (r250807)
+++ user/attilio/vmobj-readlock/sys/i386/i386/pmap.c Sun May 19 15:26:15 2013 (r250808)
@@ -4185,6 +4185,9 @@ pmap_copy_page(vm_page_t src, vm_page_t
{
struct sysmaps *sysmaps;
+ VM_OBJECT_ASSERT_LOCKED(src->object);
+ VM_OBJECT_ASSERT_LOCKED(dst->object);
+
sysmaps = &sysmaps_pcpu[PCPU_GET(cpuid)];
mtx_lock(&sysmaps->lock);
if (*sysmaps->CMAP1)
Modified: user/attilio/vmobj-readlock/sys/i386/xen/pmap.c
==============================================================================
--- user/attilio/vmobj-readlock/sys/i386/xen/pmap.c Sun May 19 14:59:24 2013 (r250807)
+++ user/attilio/vmobj-readlock/sys/i386/xen/pmap.c Sun May 19 15:26:15 2013 (r250808)
@@ -3432,6 +3432,9 @@ pmap_copy_page(vm_page_t src, vm_page_t
{
struct sysmaps *sysmaps;
+ VM_OBJECT_ASSERT_LOCKED(src->object);
+ VM_OBJECT_ASSERT_LOCKED(dst->object);
+
sysmaps = &sysmaps_pcpu[PCPU_GET(cpuid)];
mtx_lock(&sysmaps->lock);
if (*sysmaps->CMAP1)
Modified: user/attilio/vmobj-readlock/sys/ia64/ia64/pmap.c
==============================================================================
--- user/attilio/vmobj-readlock/sys/ia64/ia64/pmap.c Sun May 19 14:59:24 2013 (r250807)
+++ user/attilio/vmobj-readlock/sys/ia64/ia64/pmap.c Sun May 19 15:26:15 2013 (r250808)
@@ -2009,6 +2009,9 @@ pmap_copy_page(vm_page_t msrc, vm_page_t
{
void *dst, *src;
+ VM_OBJECT_ASSERT_LOCKED(msrc->object);
+ VM_OBJECT_ASSERT_LOCKED(mdst->object);
+
src = (void *)pmap_page_to_va(msrc);
dst = (void *)pmap_page_to_va(mdst);
bcopy(src, dst, PAGE_SIZE);
Modified: user/attilio/vmobj-readlock/sys/mips/mips/pmap.c
==============================================================================
--- user/attilio/vmobj-readlock/sys/mips/mips/pmap.c Sun May 19 14:59:24 2013 (r250807)
+++ user/attilio/vmobj-readlock/sys/mips/mips/pmap.c Sun May 19 15:26:15 2013 (r250808)
@@ -2551,8 +2551,13 @@ void
pmap_copy_page(vm_page_t src, vm_page_t dst)
{
vm_offset_t va_src, va_dst;
- vm_paddr_t phys_src = VM_PAGE_TO_PHYS(src);
- vm_paddr_t phys_dst = VM_PAGE_TO_PHYS(dst);
+ vm_paddr_t phys_dst, phys_src;
+
+ VM_OBJECT_ASSERT_LOCKED(src->object);
+ VM_OBJECT_ASSERT_LOCKED(dst->object);
+
+ phys_src = VM_PAGE_TO_PHYS(src);
+ phys_dst = VM_PAGE_TO_PHYS(dst);
if (MIPS_DIRECT_MAPPABLE(phys_src) && MIPS_DIRECT_MAPPABLE(phys_dst)) {
/* easy case, all can be accessed via KSEG0 */
Modified: user/attilio/vmobj-readlock/sys/powerpc/aim/mmu_oea.c
==============================================================================
--- user/attilio/vmobj-readlock/sys/powerpc/aim/mmu_oea.c Sun May 19 14:59:24 2013 (r250807)
+++ user/attilio/vmobj-readlock/sys/powerpc/aim/mmu_oea.c Sun May 19 15:26:15 2013 (r250808)
@@ -1050,6 +1050,9 @@ moea_copy_page(mmu_t mmu, vm_page_t msrc
vm_offset_t dst;
vm_offset_t src;
+ VM_OBJECT_ASSERT_LOCKED(msrc->object);
+ VM_OBJECT_ASSERT_LOCKED(mdst->object);
+
dst = VM_PAGE_TO_PHYS(mdst);
src = VM_PAGE_TO_PHYS(msrc);
Modified: user/attilio/vmobj-readlock/sys/powerpc/aim/mmu_oea64.c
==============================================================================
--- user/attilio/vmobj-readlock/sys/powerpc/aim/mmu_oea64.c Sun May 19 14:59:24 2013 (r250807)
+++ user/attilio/vmobj-readlock/sys/powerpc/aim/mmu_oea64.c Sun May 19 15:26:15 2013 (r250808)
@@ -1097,6 +1097,9 @@ moea64_copy_page(mmu_t mmu, vm_page_t ms
vm_offset_t dst;
vm_offset_t src;
+ VM_OBJECT_ASSERT_LOCKED(msrc->object);
+ VM_OBJECT_ASSERT_LOCKED(mdst->object);
+
dst = VM_PAGE_TO_PHYS(mdst);
src = VM_PAGE_TO_PHYS(msrc);
Modified: user/attilio/vmobj-readlock/sys/powerpc/booke/pmap.c
==============================================================================
--- user/attilio/vmobj-readlock/sys/powerpc/booke/pmap.c Sun May 19 14:59:24 2013 (r250807)
+++ user/attilio/vmobj-readlock/sys/powerpc/booke/pmap.c Sun May 19 15:26:15 2013 (r250808)
@@ -2127,6 +2127,9 @@ mmu_booke_copy_page(mmu_t mmu, vm_page_t
{
vm_offset_t sva, dva;
+ VM_OBJECT_ASSERT_LOCKED(sm->object);
+ VM_OBJECT_ASSERT_LOCKED(dm->object);
+
sva = copy_page_src_va;
dva = copy_page_dst_va;
Modified: user/attilio/vmobj-readlock/sys/sparc64/sparc64/pmap.c
==============================================================================
--- user/attilio/vmobj-readlock/sys/sparc64/sparc64/pmap.c Sun May 19 14:59:24 2013 (r250807)
+++ user/attilio/vmobj-readlock/sys/sparc64/sparc64/pmap.c Sun May 19 15:26:15 2013 (r250808)
@@ -1843,6 +1843,8 @@ pmap_copy_page(vm_page_t msrc, vm_page_t
vm_paddr_t psrc;
struct tte *tp;
+ VM_OBJECT_ASSERT_LOCKED(msrc->object);
+ VM_OBJECT_ASSERT_LOCKED(mdst->object);
KASSERT((mdst->flags & PG_FICTITIOUS) == 0,
("pmap_copy_page: fake dst page"));
KASSERT((msrc->flags & PG_FICTITIOUS) == 0,
More information about the svn-src-user
mailing list