Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 19 May 2013 15:26:16 +0000 (UTC)
From:      Attilio Rao <attilio@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   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
Message-ID:  <201305191526.r4JFQG1X017928@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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,



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201305191526.r4JFQG1X017928>