svn commit: r267550 - in user/attilio/rm_vmobj_cache/sys: amd64/amd64 arm/arm dev/drm2/i915 dev/drm2/ttm i386/i386 i386/xen ia64/ia64 kern mips/mips powerpc/aim powerpc/booke sparc64/sparc64 vm x86...

Attilio Rao attilio at FreeBSD.org
Mon Jun 16 18:33:38 UTC 2014


Author: attilio
Date: Mon Jun 16 18:33:32 2014
New Revision: 267550
URL: http://svnweb.freebsd.org/changeset/base/267550

Log:
  Parify with head.
  The patch for unmanaged pages is in the repository and we need to make
  progress on other items, but it can be re-evaluated later on.

Modified:
  user/attilio/rm_vmobj_cache/sys/amd64/amd64/pmap.c
  user/attilio/rm_vmobj_cache/sys/amd64/amd64/uma_machdep.c
  user/attilio/rm_vmobj_cache/sys/arm/arm/machdep.c
  user/attilio/rm_vmobj_cache/sys/dev/drm2/i915/i915_gem_gtt.c
  user/attilio/rm_vmobj_cache/sys/dev/drm2/ttm/ttm_page_alloc.c
  user/attilio/rm_vmobj_cache/sys/i386/i386/pmap.c
  user/attilio/rm_vmobj_cache/sys/i386/xen/pmap.c
  user/attilio/rm_vmobj_cache/sys/ia64/ia64/pmap.c
  user/attilio/rm_vmobj_cache/sys/ia64/ia64/uma_machdep.c
  user/attilio/rm_vmobj_cache/sys/kern/kern_sharedpage.c
  user/attilio/rm_vmobj_cache/sys/kern/vfs_bio.c
  user/attilio/rm_vmobj_cache/sys/mips/mips/pmap.c
  user/attilio/rm_vmobj_cache/sys/mips/mips/uma_machdep.c
  user/attilio/rm_vmobj_cache/sys/powerpc/aim/slb.c
  user/attilio/rm_vmobj_cache/sys/powerpc/aim/uma_machdep.c
  user/attilio/rm_vmobj_cache/sys/powerpc/booke/pmap.c
  user/attilio/rm_vmobj_cache/sys/sparc64/sparc64/pmap.c
  user/attilio/rm_vmobj_cache/sys/sparc64/sparc64/vm_machdep.c
  user/attilio/rm_vmobj_cache/sys/vm/uma_core.c
  user/attilio/rm_vmobj_cache/sys/vm/vm_fault.c
  user/attilio/rm_vmobj_cache/sys/vm/vm_kern.c
  user/attilio/rm_vmobj_cache/sys/vm/vm_object.c
  user/attilio/rm_vmobj_cache/sys/vm/vm_page.c
  user/attilio/rm_vmobj_cache/sys/vm/vm_page.h
  user/attilio/rm_vmobj_cache/sys/x86/iommu/intel_idpgtbl.c

Modified: user/attilio/rm_vmobj_cache/sys/amd64/amd64/pmap.c
==============================================================================
--- user/attilio/rm_vmobj_cache/sys/amd64/amd64/pmap.c	Mon Jun 16 18:29:05 2014	(r267549)
+++ user/attilio/rm_vmobj_cache/sys/amd64/amd64/pmap.c	Mon Jun 16 18:33:32 2014	(r267550)
@@ -2012,17 +2012,7 @@ pmap_free_zero_pages(struct spglist *fre
 
 	while ((m = SLIST_FIRST(free)) != NULL) {
 		SLIST_REMOVE_HEAD(free, plinks.s.ss);
-
-		/*
-		 * Preserve the page's PG_ZERO setting.
-		 * However, as the pages are unmanaged, fix-up the wired count
-		 * to perform a correct free.
-		 */
-		if (m->wire_count != 0)
-		panic("pmap_free_zero_pages: wrong wire count %u for page %p",
-			    m->wire_count, m);
-		m->wire_count = 1;
-		atomic_add_int(&vm_cnt.v_wire_count, 1);
+		/* Preserve the page's PG_ZERO setting. */
 		vm_page_free_toq(m);
 	}
 }
@@ -2339,6 +2329,8 @@ _pmap_allocpte(pmap_t pmap, vm_pindex_t 
 			/* Have to allocate a new pdp, recurse */
 			if (_pmap_allocpte(pmap, NUPDE + NUPDPE + pml4index,
 			    lockp) == NULL) {
+				--m->wire_count;
+				atomic_subtract_int(&vm_cnt.v_wire_count, 1);
 				vm_page_free_zero(m);
 				return (NULL);
 			}
@@ -2370,6 +2362,8 @@ _pmap_allocpte(pmap_t pmap, vm_pindex_t 
 			/* Have to allocate a new pd, recurse */
 			if (_pmap_allocpte(pmap, NUPDE + pdpindex,
 			    lockp) == NULL) {
+				--m->wire_count;
+				atomic_subtract_int(&vm_cnt.v_wire_count, 1);
 				vm_page_free_zero(m);
 				return (NULL);
 			}
@@ -2382,6 +2376,9 @@ _pmap_allocpte(pmap_t pmap, vm_pindex_t 
 				/* Have to allocate a new pd, recurse */
 				if (_pmap_allocpte(pmap, NUPDE + pdpindex,
 				    lockp) == NULL) {
+					--m->wire_count;
+					atomic_subtract_int(&vm_cnt.v_wire_count,
+					    1);
 					vm_page_free_zero(m);
 					return (NULL);
 				}
@@ -2519,6 +2516,8 @@ pmap_release(pmap_t pmap)
 		pmap->pm_pml4[DMPML4I + i] = 0;
 	pmap->pm_pml4[PML4PML4I] = 0;	/* Recursive Mapping */
 
+	m->wire_count--;
+	atomic_subtract_int(&vm_cnt.v_wire_count, 1);
 	vm_page_free_zero(m);
 	if (pmap->pm_pcid != -1)
 		free_unr(&pcid_unr, pmap->pm_pcid);
@@ -2816,9 +2815,6 @@ reclaim_pv_chunk(pmap_t locked_pmap, str
 		m_pc = SLIST_FIRST(&free);
 		SLIST_REMOVE_HEAD(&free, plinks.s.ss);
 		/* Recycle a freed page table page. */
-		KASSERT((m_pc->oflags & VPO_UNMANAGED) != 0,
-	    ("reclaim_pv_chunk: recycled page table page %p not unmanaged",
-		    m_pc));
 		m_pc->wire_count = 1;
 		atomic_add_int(&vm_cnt.v_wire_count, 1);
 	}

Modified: user/attilio/rm_vmobj_cache/sys/amd64/amd64/uma_machdep.c
==============================================================================
--- user/attilio/rm_vmobj_cache/sys/amd64/amd64/uma_machdep.c	Mon Jun 16 18:29:05 2014	(r267549)
+++ user/attilio/rm_vmobj_cache/sys/amd64/amd64/uma_machdep.c	Mon Jun 16 18:33:32 2014	(r267550)
@@ -78,5 +78,7 @@ uma_small_free(void *mem, int size, u_in
 	pa = DMAP_TO_PHYS((vm_offset_t)mem);
 	dump_drop_page(pa);
 	m = PHYS_TO_VM_PAGE(pa);
+	m->wire_count--;
 	vm_page_free(m);
+	atomic_subtract_int(&vm_cnt.v_wire_count, 1);
 }

Modified: user/attilio/rm_vmobj_cache/sys/arm/arm/machdep.c
==============================================================================
--- user/attilio/rm_vmobj_cache/sys/arm/arm/machdep.c	Mon Jun 16 18:29:05 2014	(r267549)
+++ user/attilio/rm_vmobj_cache/sys/arm/arm/machdep.c	Mon Jun 16 18:33:32 2014	(r267550)
@@ -387,8 +387,7 @@ cpu_startup(void *dummy)
 	pmap_kenter_user(ARM_TP_ADDRESS, ARM_TP_ADDRESS);
 	arm_lock_cache_line(ARM_TP_ADDRESS);
 #else
-	m = vm_page_alloc(NULL, 0, VM_ALLOC_NOOBJ | VM_ALLOC_ZERO |
-	    VM_ALLOC_WIRED);
+	m = vm_page_alloc(NULL, 0, VM_ALLOC_NOOBJ | VM_ALLOC_ZERO);
 	pmap_kenter_user(ARM_TP_ADDRESS, VM_PAGE_TO_PHYS(m));
 #endif
 	*(uint32_t *)ARM_RAS_START = 0;

Modified: user/attilio/rm_vmobj_cache/sys/dev/drm2/i915/i915_gem_gtt.c
==============================================================================
--- user/attilio/rm_vmobj_cache/sys/dev/drm2/i915/i915_gem_gtt.c	Mon Jun 16 18:29:05 2014	(r267549)
+++ user/attilio/rm_vmobj_cache/sys/dev/drm2/i915/i915_gem_gtt.c	Mon Jun 16 18:33:32 2014	(r267550)
@@ -208,6 +208,7 @@ i915_gem_cleanup_aliasing_ppgtt(struct d
 		if (m != NULL) {
 			vm_page_unwire(m, PQ_INACTIVE);
 			vm_page_free(m);
+		}
 	}
 	free(ppgtt->pt_pages, DRM_I915_GEM);
 	free(ppgtt, DRM_I915_GEM);

Modified: user/attilio/rm_vmobj_cache/sys/dev/drm2/ttm/ttm_page_alloc.c
==============================================================================
--- user/attilio/rm_vmobj_cache/sys/dev/drm2/ttm/ttm_page_alloc.c	Mon Jun 16 18:29:05 2014	(r267549)
+++ user/attilio/rm_vmobj_cache/sys/dev/drm2/ttm/ttm_page_alloc.c	Mon Jun 16 18:33:32 2014	(r267550)
@@ -492,7 +492,7 @@ static int ttm_alloc_new_pages(struct pg
 	unsigned max_cpages = min(count,
 			(unsigned)(PAGE_SIZE/sizeof(vm_page_t)));
 
-	aflags = VM_ALLOC_NORMAL | VM_ALLOC_NOOBJ |
+	aflags = VM_ALLOC_NORMAL | VM_ALLOC_WIRED | VM_ALLOC_NOOBJ |
 	    ((ttm_alloc_flags & TTM_PAGE_FLAG_ZERO_ALLOC) != 0 ?
 	    VM_ALLOC_ZERO : 0);
 	
@@ -708,7 +708,7 @@ static int ttm_get_pages(vm_page_t *page
 	unsigned count;
 	int r;
 
-	aflags = VM_ALLOC_NORMAL | VM_ALLOC_NOOBJ |
+	aflags = VM_ALLOC_NORMAL | VM_ALLOC_NOOBJ | VM_ALLOC_WIRED |
 	    ((flags & TTM_PAGE_FLAG_ZERO_ALLOC) != 0 ? VM_ALLOC_ZERO : 0);
 
 	/* No pool for cached pages */

Modified: user/attilio/rm_vmobj_cache/sys/i386/i386/pmap.c
==============================================================================
--- user/attilio/rm_vmobj_cache/sys/i386/i386/pmap.c	Mon Jun 16 18:29:05 2014	(r267549)
+++ user/attilio/rm_vmobj_cache/sys/i386/i386/pmap.c	Mon Jun 16 18:33:32 2014	(r267550)
@@ -1578,17 +1578,7 @@ pmap_free_zero_pages(struct spglist *fre
 
 	while ((m = SLIST_FIRST(free)) != NULL) {
 		SLIST_REMOVE_HEAD(free, plinks.s.ss);
-
-		/*
-		 * Preserve the page's PG_ZERO setting.
-		 * However, as the pages are unmanaged, fix-up the wired count
-		 * to perform a correct free.
-		 */
-		if (m->wire_count != 0)
-		panic("pmap_free_zero_pages: wrong wire count %u for page %p",
-			    m->wire_count, m);
-		m->wire_count = 1;
-		atomic_add_int(&vm_cnt.v_wire_count, 1);
+		/* Preserve the page's PG_ZERO setting. */
 		vm_page_free_toq(m);
 	}
 }
@@ -2059,6 +2049,8 @@ pmap_release(pmap_t pmap)
 		KASSERT(VM_PAGE_TO_PHYS(m) == (pmap->pm_pdpt[i] & PG_FRAME),
 		    ("pmap_release: got wrong ptd page"));
 #endif
+		m->wire_count--;
+		atomic_subtract_int(&vm_cnt.v_wire_count, 1);
 		vm_page_free_zero(m);
 	}
 }
@@ -2320,9 +2312,6 @@ out:
 		m_pc = SLIST_FIRST(&free);
 		SLIST_REMOVE_HEAD(&free, plinks.s.ss);
 		/* Recycle a freed page table page. */
-		KASSERT((m_pc->oflags & VPO_UNMANAGED) != 0,
-	    ("pmap_pv_reclaim: recycled page table page %p not unmanaged",
-		    m_pc));
 		m_pc->wire_count = 1;
 		atomic_add_int(&vm_cnt.v_wire_count, 1);
 	}

Modified: user/attilio/rm_vmobj_cache/sys/i386/xen/pmap.c
==============================================================================
--- user/attilio/rm_vmobj_cache/sys/i386/xen/pmap.c	Mon Jun 16 18:29:05 2014	(r267549)
+++ user/attilio/rm_vmobj_cache/sys/i386/xen/pmap.c	Mon Jun 16 18:33:32 2014	(r267550)
@@ -1336,16 +1336,6 @@ pmap_free_zero_pages(vm_page_t free)
 		m = free;
 		free = (void *)m->object;
 		m->object = NULL;
-
-		/*
-		 * As the pages are unmanaged, fix-up the wired count
-		 * to perform a correct free.
-		 */
-		if (m->wire_count != 0)
-		panic("pmap_free_zero_pages: wrong wire count %u for page %p",
-			    m->wire_count, m);
-		m->wire_count = 1;
-		atomic_add_int(&vm_cnt.v_wire_count, 1);
 		vm_page_free_zero(m);
 	}
 }
@@ -1822,6 +1812,8 @@ pmap_release(pmap_t pmap)
 			KASSERT(VM_PAGE_TO_MACH(m) == (pmap->pm_pdpt[i] & PG_FRAME),
 			    ("pmap_release: got wrong ptd page"));
 #endif
+		m->wire_count--;
+		atomic_subtract_int(&vm_cnt.v_wire_count, 1);
 		vm_page_free(m);
 	}
 #ifdef PAE
@@ -2096,9 +2088,6 @@ out:
 		m_pc = free;
 		free = (void *)m_pc->object;
 		/* Recycle a freed page table page. */
-		KASSERT((m_pc->oflags & VPO_UNMANAGED) != 0,
-	    ("pmap_pv_reclaim: recycled page table page %p not unmanaged",
-		    m_pc));
 		m_pc->wire_count = 1;
 		atomic_add_int(&vm_cnt.v_wire_count, 1);
 	}

Modified: user/attilio/rm_vmobj_cache/sys/ia64/ia64/pmap.c
==============================================================================
--- user/attilio/rm_vmobj_cache/sys/ia64/ia64/pmap.c	Mon Jun 16 18:29:05 2014	(r267549)
+++ user/attilio/rm_vmobj_cache/sys/ia64/ia64/pmap.c	Mon Jun 16 18:33:32 2014	(r267550)
@@ -293,8 +293,9 @@ pmap_alloc_vhpt(void)
 	vm_size_t size;
 
 	size = 1UL << pmap_vhpt_log2size;
-	m = vm_page_alloc_contig(NULL, 0, VM_ALLOC_SYSTEM | VM_ALLOC_NOOBJ,
-	    atop(size), 0UL, ~0UL, size, 0UL, VM_MEMATTR_DEFAULT);
+	m = vm_page_alloc_contig(NULL, 0, VM_ALLOC_SYSTEM | VM_ALLOC_NOOBJ |
+	    VM_ALLOC_WIRED, atop(size), 0UL, ~0UL, size, 0UL,
+	    VM_MEMATTR_DEFAULT);
 	if (m != NULL) {
 		vhpt = IA64_PHYS_TO_RR7(VM_PAGE_TO_PHYS(m));
 		pmap_initialize_vhpt(vhpt);

Modified: user/attilio/rm_vmobj_cache/sys/ia64/ia64/uma_machdep.c
==============================================================================
--- user/attilio/rm_vmobj_cache/sys/ia64/ia64/uma_machdep.c	Mon Jun 16 18:29:05 2014	(r267549)
+++ user/attilio/rm_vmobj_cache/sys/ia64/ia64/uma_machdep.c	Mon Jun 16 18:33:32 2014	(r267550)
@@ -71,5 +71,7 @@ uma_small_free(void *mem, int size, u_in
 	vm_page_t m;
 
 	m = PHYS_TO_VM_PAGE(IA64_RR_MASK((u_int64_t)mem));
+	m->wire_count--;
 	vm_page_free(m);
+	atomic_subtract_int(&vm_cnt.v_wire_count, 1);
 }

Modified: user/attilio/rm_vmobj_cache/sys/kern/kern_sharedpage.c
==============================================================================
--- user/attilio/rm_vmobj_cache/sys/kern/kern_sharedpage.c	Mon Jun 16 18:29:05 2014	(r267549)
+++ user/attilio/rm_vmobj_cache/sys/kern/kern_sharedpage.c	Mon Jun 16 18:33:32 2014	(r267550)
@@ -108,8 +108,7 @@ shared_page_init(void *dummy __unused)
 	shared_page_obj = vm_pager_allocate(OBJT_PHYS, 0, PAGE_SIZE,
 	    VM_PROT_DEFAULT, 0, NULL);
 	VM_OBJECT_WLOCK(shared_page_obj);
-	m = vm_page_grab(shared_page_obj, 0, VM_ALLOC_NOBUSY | VM_ALLOC_ZERO |
-	    VM_ALLOC_WIRED);
+	m = vm_page_grab(shared_page_obj, 0, VM_ALLOC_NOBUSY | VM_ALLOC_ZERO);
 	m->valid = VM_PAGE_BITS_ALL;
 	VM_OBJECT_WUNLOCK(shared_page_obj);
 	addr = kva_alloc(PAGE_SIZE);

Modified: user/attilio/rm_vmobj_cache/sys/kern/vfs_bio.c
==============================================================================
--- user/attilio/rm_vmobj_cache/sys/kern/vfs_bio.c	Mon Jun 16 18:29:05 2014	(r267549)
+++ user/attilio/rm_vmobj_cache/sys/kern/vfs_bio.c	Mon Jun 16 18:33:32 2014	(r267550)
@@ -4295,7 +4295,9 @@ vm_hold_free_pages(struct buf *bp, int n
 		if (vm_page_sbusied(p))
 			printf("vm_hold_free_pages: blkno: %jd, lblkno: %jd\n",
 			    (intmax_t)bp->b_blkno, (intmax_t)bp->b_lblkno);
+		p->wire_count--;
 		vm_page_free(p);
+		atomic_subtract_int(&vm_cnt.v_wire_count, 1);
 	}
 	bp->b_npages = newnpages;
 }

Modified: user/attilio/rm_vmobj_cache/sys/mips/mips/pmap.c
==============================================================================
--- user/attilio/rm_vmobj_cache/sys/mips/mips/pmap.c	Mon Jun 16 18:29:05 2014	(r267549)
+++ user/attilio/rm_vmobj_cache/sys/mips/mips/pmap.c	Mon Jun 16 18:33:32 2014	(r267550)
@@ -993,14 +993,9 @@ _pmap_unwire_ptp(pmap_t pmap, vm_offset_
 
 	/*
 	 * If the page is finally unwired, simply free it.
-	 * Fix-up the wire_count value to make the function to perform
-	 * the free correctly.
 	 */
-	if (m->wire_count != 0)
-		panic("_pmap_unwire_ptp: invalid wire count %u for the page %p",
-		    m->wire_count, m);
-	++m->wire_count;
 	vm_page_free_zero(m);
+	atomic_subtract_int(&vm_cnt.v_wire_count, 1);
 }
 
 /*
@@ -1052,7 +1047,8 @@ pmap_alloc_direct_page(unsigned int inde
 {
 	vm_page_t m;
 
-	m = vm_page_alloc_freelist(VM_FREELIST_DIRECT, req | VM_ALLOC_ZERO);
+	m = vm_page_alloc_freelist(VM_FREELIST_DIRECT, req | VM_ALLOC_WIRED |
+	    VM_ALLOC_ZERO);
 	if (m == NULL)
 		return (NULL);
 
@@ -1147,6 +1143,8 @@ _pmap_allocpte(pmap_t pmap, unsigned pte
 			if (_pmap_allocpte(pmap, NUPDE + segindex, 
 			    flags) == NULL) {
 				/* alloc failed, release current */
+				--m->wire_count;
+				atomic_subtract_int(&vm_cnt.v_wire_count, 1);
 				vm_page_free_zero(m);
 				return (NULL);
 			}
@@ -1228,6 +1226,8 @@ pmap_release(pmap_t pmap)
 	ptdva = (vm_offset_t)pmap->pm_segtab;
 	ptdpg = PHYS_TO_VM_PAGE(MIPS_DIRECT_TO_PHYS(ptdva));
 
+	ptdpg->wire_count--;
+	atomic_subtract_int(&vm_cnt.v_wire_count, 1);
 	vm_page_free_zero(ptdpg);
 }
 
@@ -1581,7 +1581,8 @@ retry:
 		}
 	}
 	/* No free items, allocate another chunk */
-	m = vm_page_alloc_freelist(VM_FREELIST_DIRECT, VM_ALLOC_NORMAL);
+	m = vm_page_alloc_freelist(VM_FREELIST_DIRECT, VM_ALLOC_NORMAL |
+	    VM_ALLOC_WIRED);
 	if (m == NULL) {
 		if (try) {
 			pv_entry_count--;

Modified: user/attilio/rm_vmobj_cache/sys/mips/mips/uma_machdep.c
==============================================================================
--- user/attilio/rm_vmobj_cache/sys/mips/mips/uma_machdep.c	Mon Jun 16 18:29:05 2014	(r267549)
+++ user/attilio/rm_vmobj_cache/sys/mips/mips/uma_machdep.c	Mon Jun 16 18:33:32 2014	(r267550)
@@ -49,7 +49,7 @@ uma_small_alloc(uma_zone_t zone, int byt
 	void *va;
 
 	*flags = UMA_SLAB_PRIV;
-	pflags = malloc2vm_flags(wait);
+	pflags = malloc2vm_flags(wait) | VM_ALLOC_WIRED;
 
 	for (;;) {
 		m = vm_page_alloc_freelist(VM_FREELIST_DIRECT, pflags);
@@ -77,5 +77,7 @@ uma_small_free(void *mem, int size, u_in
 
 	pa = MIPS_DIRECT_TO_PHYS((vm_offset_t)mem);
 	m = PHYS_TO_VM_PAGE(pa);
+	m->wire_count--;
 	vm_page_free(m);
+	atomic_subtract_int(&vm_cnt.v_wire_count, 1);
 }

Modified: user/attilio/rm_vmobj_cache/sys/powerpc/aim/slb.c
==============================================================================
--- user/attilio/rm_vmobj_cache/sys/powerpc/aim/slb.c	Mon Jun 16 18:29:05 2014	(r267549)
+++ user/attilio/rm_vmobj_cache/sys/powerpc/aim/slb.c	Mon Jun 16 18:33:32 2014	(r267550)
@@ -484,7 +484,7 @@ slb_uma_real_alloc(uma_zone_t zone, int 
 		realmax = platform_real_maxaddr();
 
 	*flags = UMA_SLAB_PRIV;
-	pflags = malloc2vm_flags(wait) | VM_ALLOC_NOOBJ;
+	pflags = malloc2vm_flags(wait) | VM_ALLOC_NOOBJ | VM_ALLOC_WIRED;
 
 	for (;;) {
 		m = vm_page_alloc_contig(NULL, 0, pflags, 1, 0, realmax,

Modified: user/attilio/rm_vmobj_cache/sys/powerpc/aim/uma_machdep.c
==============================================================================
--- user/attilio/rm_vmobj_cache/sys/powerpc/aim/uma_machdep.c	Mon Jun 16 18:29:05 2014	(r267549)
+++ user/attilio/rm_vmobj_cache/sys/powerpc/aim/uma_machdep.c	Mon Jun 16 18:33:32 2014	(r267550)
@@ -91,6 +91,8 @@ uma_small_free(void *mem, int size, u_in
 		    (vm_offset_t)mem + PAGE_SIZE);
 
 	m = PHYS_TO_VM_PAGE((vm_offset_t)mem);
+	m->wire_count--;
 	vm_page_free(m);
+	atomic_subtract_int(&vm_cnt.v_wire_count, 1);
 	atomic_subtract_int(&hw_uma_mdpages, 1);
 }

Modified: user/attilio/rm_vmobj_cache/sys/powerpc/booke/pmap.c
==============================================================================
--- user/attilio/rm_vmobj_cache/sys/powerpc/booke/pmap.c	Mon Jun 16 18:29:05 2014	(r267549)
+++ user/attilio/rm_vmobj_cache/sys/powerpc/booke/pmap.c	Mon Jun 16 18:33:32 2014	(r267550)
@@ -648,13 +648,8 @@ ptbl_free(mmu_t mmu, pmap_t pmap, unsign
 		va = ((vm_offset_t)ptbl + (i * PAGE_SIZE));
 		pa = pte_vatopa(mmu, kernel_pmap, va);
 		m = PHYS_TO_VM_PAGE(pa);
-
-		/* Fix-up the wire_count to make free perform correctly. */
-		if (m->wire_count != 0)
-			panic("ptbl_free: invalid wire count %u for page %p",
-			    m->wire_count, m);
-		++m->wire_count;
 		vm_page_free_zero(m);
+		atomic_subtract_int(&vm_cnt.v_wire_count, 1);
 		mmu_booke_kremove(mmu, va);
 	}
 

Modified: user/attilio/rm_vmobj_cache/sys/sparc64/sparc64/pmap.c
==============================================================================
--- user/attilio/rm_vmobj_cache/sys/sparc64/sparc64/pmap.c	Mon Jun 16 18:29:05 2014	(r267549)
+++ user/attilio/rm_vmobj_cache/sys/sparc64/sparc64/pmap.c	Mon Jun 16 18:33:32 2014	(r267550)
@@ -1292,6 +1292,8 @@ pmap_release(pmap_t pm)
 	while (!TAILQ_EMPTY(&obj->memq)) {
 		m = TAILQ_FIRST(&obj->memq);
 		m->md.pmap = NULL;
+		m->wire_count--;
+		atomic_subtract_int(&vm_cnt.v_wire_count, 1);
 		vm_page_free_zero(m);
 	}
 	VM_OBJECT_WUNLOCK(obj);

Modified: user/attilio/rm_vmobj_cache/sys/sparc64/sparc64/vm_machdep.c
==============================================================================
--- user/attilio/rm_vmobj_cache/sys/sparc64/sparc64/vm_machdep.c	Mon Jun 16 18:29:05 2014	(r267549)
+++ user/attilio/rm_vmobj_cache/sys/sparc64/sparc64/vm_machdep.c	Mon Jun 16 18:33:32 2014	(r267550)
@@ -546,5 +546,7 @@ uma_small_free(void *mem, int size, u_in
 
 	PMAP_STATS_INC(uma_nsmall_free);
 	m = PHYS_TO_VM_PAGE(TLB_DIRECT_TO_PHYS((vm_offset_t)mem));
+	m->wire_count--;
 	vm_page_free(m);
+	atomic_subtract_int(&vm_cnt.v_wire_count, 1);
 }

Modified: user/attilio/rm_vmobj_cache/sys/vm/uma_core.c
==============================================================================
--- user/attilio/rm_vmobj_cache/sys/vm/uma_core.c	Mon Jun 16 18:29:05 2014	(r267549)
+++ user/attilio/rm_vmobj_cache/sys/vm/uma_core.c	Mon Jun 16 18:33:32 2014	(r267550)
@@ -1155,7 +1155,7 @@ noobj_alloc(uma_zone_t zone, int bytes, 
 		 */
 		TAILQ_FOREACH_SAFE(p, &alloctail, listq, p_next) {
 			vm_page_unwire(p, PQ_INACTIVE);
-			vm_page_free(p);
+			vm_page_free(p); 
 		}
 		return (NULL);
 	}

Modified: user/attilio/rm_vmobj_cache/sys/vm/vm_fault.c
==============================================================================
--- user/attilio/rm_vmobj_cache/sys/vm/vm_fault.c	Mon Jun 16 18:29:05 2014	(r267549)
+++ user/attilio/rm_vmobj_cache/sys/vm/vm_fault.c	Mon Jun 16 18:33:32 2014	(r267550)
@@ -426,8 +426,6 @@ RetryFault:;
 				if (fs.object->type != OBJT_VNODE &&
 				    fs.object->backing_object == NULL)
 					alloc_req |= VM_ALLOC_ZERO;
-				if ((fs.object->flags & OBJ_UNMANAGED) != 0)
-					alloc_req |= VM_ALLOC_WIRED;
 				fs.m = vm_page_alloc(fs.object, fs.pindex,
 				    alloc_req);
 			}
@@ -1442,7 +1440,7 @@ vm_fault_additional_pages(m, rbehind, ra
 	vm_object_t object;
 	vm_pindex_t pindex, startpindex, endpindex, tpindex;
 	vm_page_t rtm;
-	int alloc_req, cbehind, cahead;
+	int cbehind, cahead;
 
 	VM_OBJECT_ASSERT_WLOCKED(m->object);
 
@@ -1471,10 +1469,6 @@ vm_fault_additional_pages(m, rbehind, ra
 		rbehind = cbehind;
 	}
 
-	alloc_req = VM_ALLOC_NORMAL | VM_ALLOC_IFNOTCACHED;
-	if ((object->flags & OBJ_UNMANAGED) != 0)
-		alloc_req |= VM_ALLOC_WIRED;
-
 	/*
 	 * scan backward for the read behind pages -- in memory 
 	 */
@@ -1494,7 +1488,8 @@ vm_fault_additional_pages(m, rbehind, ra
 		for (i = 0, tpindex = pindex - 1; tpindex >= startpindex &&
 		    tpindex < pindex; i++, tpindex--) {
 
-			rtm = vm_page_alloc(object, tpindex, alloc_req);
+			rtm = vm_page_alloc(object, tpindex, VM_ALLOC_NORMAL |
+			    VM_ALLOC_IFNOTCACHED);
 			if (rtm == NULL) {
 				/*
 				 * Shift the allocated pages to the
@@ -1532,7 +1527,8 @@ vm_fault_additional_pages(m, rbehind, ra
 
 	for (; tpindex < endpindex; i++, tpindex++) {
 
-		rtm = vm_page_alloc(object, tpindex, alloc_req);
+		rtm = vm_page_alloc(object, tpindex, VM_ALLOC_NORMAL |
+		    VM_ALLOC_IFNOTCACHED);
 		if (rtm == NULL) {
 			break;
 		}

Modified: user/attilio/rm_vmobj_cache/sys/vm/vm_kern.c
==============================================================================
--- user/attilio/rm_vmobj_cache/sys/vm/vm_kern.c	Mon Jun 16 18:29:05 2014	(r267549)
+++ user/attilio/rm_vmobj_cache/sys/vm/vm_kern.c	Mon Jun 16 18:33:32 2014	(r267550)
@@ -169,7 +169,7 @@ kmem_alloc_attr(vmem_t *vmem, vm_size_t 
 	if (vmem_alloc(vmem, size, M_BESTFIT | flags, &addr))
 		return (0);
 	offset = addr - VM_MIN_KERNEL_ADDRESS;
-	pflags = malloc2vm_flags(flags) | VM_ALLOC_NOBUSY;
+	pflags = malloc2vm_flags(flags) | VM_ALLOC_NOBUSY | VM_ALLOC_WIRED;
 	VM_OBJECT_WLOCK(object);
 	for (i = 0; i < size; i += PAGE_SIZE) {
 		tries = 0;
@@ -232,7 +232,7 @@ kmem_alloc_contig(struct vmem *vmem, vm_
 	if (vmem_alloc(vmem, size, flags | M_BESTFIT, &addr))
 		return (0);
 	offset = addr - VM_MIN_KERNEL_ADDRESS;
-	pflags = malloc2vm_flags(flags) | VM_ALLOC_NOBUSY;
+	pflags = malloc2vm_flags(flags) | VM_ALLOC_NOBUSY | VM_ALLOC_WIRED;
 	VM_OBJECT_WLOCK(object);
 	tries = 0;
 retry:

Modified: user/attilio/rm_vmobj_cache/sys/vm/vm_object.c
==============================================================================
--- user/attilio/rm_vmobj_cache/sys/vm/vm_object.c	Mon Jun 16 18:29:05 2014	(r267549)
+++ user/attilio/rm_vmobj_cache/sys/vm/vm_object.c	Mon Jun 16 18:33:32 2014	(r267550)
@@ -1951,10 +1951,7 @@ again:
 			if ((options & OBJPR_NOTWIRED) != 0 && wirings != 0)
 				goto next;
 			pmap_remove_all(p);
-			/*
-			 * Account for removal of wired mappings.
-			 * The object will not contain unmanaged pages.
-			 */
+			/* Account for removal of wired mappings. */
 			if (wirings != 0) {
 				KASSERT(p->wire_count == wirings,
 				    ("inconsistent wire count %d %d %p",
@@ -2044,12 +2041,8 @@ vm_object_populate(vm_object_t object, v
 	int rv;
 
 	VM_OBJECT_ASSERT_WLOCKED(object);
-	KASSERT((object->flags & OBJ_UNMANAGED) != 0,
-            ("vm_object_populate: object %p cannot contain unmanaged pages",
-	    object));
 	for (pindex = start; pindex < end; pindex++) {
-		m = vm_page_grab(object, pindex, VM_ALLOC_NORMAL |
-		    VM_ALLOC_WIRED);
+		m = vm_page_grab(object, pindex, VM_ALLOC_NORMAL);
 		if (m->valid != VM_PAGE_BITS_ALL) {
 			ma[0] = m;
 			rv = vm_pager_get_pages(object, ma, 1, 0);

Modified: user/attilio/rm_vmobj_cache/sys/vm/vm_page.c
==============================================================================
--- user/attilio/rm_vmobj_cache/sys/vm/vm_page.c	Mon Jun 16 18:29:05 2014	(r267549)
+++ user/attilio/rm_vmobj_cache/sys/vm/vm_page.c	Mon Jun 16 18:33:32 2014	(r267550)
@@ -1450,7 +1450,7 @@ vm_page_alloc(vm_object_t object, vm_pin
 	struct vnode *vp = NULL;
 	vm_object_t m_object;
 	vm_page_t m, mpred;
-	int flags, req_class, unmanaged;
+	int flags, req_class;
 
 	mpred = 0;	/* XXX: pacify gcc */
 	KASSERT((object != NULL) == ((req & VM_ALLOC_NOOBJ) == 0) &&
@@ -1462,10 +1462,6 @@ vm_page_alloc(vm_object_t object, vm_pin
 	if (object != NULL)
 		VM_OBJECT_ASSERT_WLOCKED(object);
 
-	unmanaged = (object == NULL || (object->flags & OBJ_UNMANAGED) != 0);
-	KASSERT(unmanaged == 0 || (req & VM_ALLOC_WIRED) != 0,
-	    ("vm_page_alloc: unmanaged but unwired request req(%x)", req));
-
 	req_class = req & VM_ALLOC_CLASS_MASK;
 
 	/*
@@ -1589,7 +1585,8 @@ vm_page_alloc(vm_object_t object, vm_pin
 		flags |= PG_NODUMP;
 	m->flags = flags;
 	m->aflags = 0;
-	m->oflags = (unmanaged != 0) ? VPO_UNMANAGED : 0;
+	m->oflags = object == NULL || (object->flags & OBJ_UNMANAGED) != 0 ?
+	    VPO_UNMANAGED : 0;
 	m->busy_lock = VPB_UNBUSIED;
 	if ((req & (VM_ALLOC_NOBUSY | VM_ALLOC_NOOBJ | VM_ALLOC_SBUSY)) == 0)
 		m->busy_lock = VPB_SINGLE_EXCLUSIVER;
@@ -1611,7 +1608,7 @@ vm_page_alloc(vm_object_t object, vm_pin
 			if (vp != NULL)
 				vdrop(vp);
 			pagedaemon_wakeup();
-			if ((req & VM_ALLOC_WIRED) != 0 && unmanaged == 0) {
+			if (req & VM_ALLOC_WIRED) {
 				atomic_subtract_int(&vm_cnt.v_wire_count, 1);
 				m->wire_count = 0;
 			}
@@ -1679,8 +1676,6 @@ vm_page_alloc_contig_vdrop(struct spglis
  *
  *	The caller must always specify an allocation class.
  *
- *	The returned pages will all be wired.
- *
  *	allocation classes:
  *	VM_ALLOC_NORMAL		normal process request
  *	VM_ALLOC_SYSTEM		system *really* needs a page
@@ -1691,6 +1686,7 @@ vm_page_alloc_contig_vdrop(struct spglis
  *	VM_ALLOC_NOOBJ		page is not associated with an object and
  *				should not be exclusive busy 
  *	VM_ALLOC_SBUSY		shared busy the allocated page
+ *	VM_ALLOC_WIRED		wire the allocated page
  *	VM_ALLOC_ZERO		prefer a zeroed page
  *
  *	This routine may not sleep.
@@ -1712,8 +1708,6 @@ vm_page_alloc_contig(vm_object_t object,
 	    (VM_ALLOC_NOBUSY | VM_ALLOC_SBUSY)),
 	    ("vm_page_alloc: inconsistent object(%p)/req(%x)", (void *)object,
 	    req));
-	KASSERT((req & VM_ALLOC_WIRED) == 0,
-	    ("vm_page_alloc_contig: VM_ALLOC_WIRED passed in req (%x)", req));
 	if (object != NULL) {
 		VM_OBJECT_ASSERT_WLOCKED(object);
 		KASSERT(object->type == OBJT_PHYS,
@@ -1781,7 +1775,8 @@ retry:
 		flags = PG_ZERO;
 	if ((req & VM_ALLOC_NODUMP) != 0)
 		flags |= PG_NODUMP;
-	atomic_add_int(&vm_cnt.v_wire_count, npages);
+	if ((req & VM_ALLOC_WIRED) != 0)
+		atomic_add_int(&vm_cnt.v_wire_count, npages);
 	if (object != NULL) {
 		if (object->memattr != VM_MEMATTR_DEFAULT &&
 		    memattr == VM_MEMATTR_DEFAULT)
@@ -1797,8 +1792,8 @@ retry:
 			if ((req & VM_ALLOC_SBUSY) != 0)
 				m->busy_lock = VPB_SHARERS_WORD(1);
 		}
-		m->wire_count = 1;
-
+		if ((req & VM_ALLOC_WIRED) != 0)
+			m->wire_count = 1;
 		/* Unmanaged pages don't use "act_count". */
 		m->oflags = VPO_UNMANAGED;
 		if (object != NULL) {
@@ -1807,10 +1802,13 @@ retry:
 				    &deferred_vdrop_list);
 				if (vm_paging_needed())
 					pagedaemon_wakeup();
+				if ((req & VM_ALLOC_WIRED) != 0)
+					atomic_subtract_int(&vm_cnt.v_wire_count,
+					    npages);
 				for (m_tmp = m, m = m_ret;
 				    m < &m_ret[npages]; m++) {
-					m->wire_count = 1;
-					m->oflags = VPO_UNMANAGED;
+					if ((req & VM_ALLOC_WIRED) != 0)
+						m->wire_count = 0;
 					if (m >= m_tmp)
 						m->object = NULL;
 					vm_page_free(m);
@@ -1885,8 +1883,6 @@ vm_page_alloc_init(vm_page_t m)
  *
  *	The caller must always specify an allocation class.
  *
- *	The returned page will be wired.
- *
  *	allocation classes:
  *	VM_ALLOC_NORMAL		normal process request
  *	VM_ALLOC_SYSTEM		system *really* needs a page
@@ -1895,6 +1891,7 @@ vm_page_alloc_init(vm_page_t m)
  *	optional allocation flags:
  *	VM_ALLOC_COUNT(number)	the number of additional pages that the caller
  *				intends to allocate
+ *	VM_ALLOC_WIRED		wire the allocated page
  *	VM_ALLOC_ZERO		prefer a zeroed page
  *
  *	This routine may not sleep.
@@ -1907,10 +1904,6 @@ vm_page_alloc_freelist(int flind, int re
 	u_int flags;
 	int req_class;
 
-	KASSERT((req & VM_ALLOC_WIRED) == 0,
-	    ("vm_page_alloc_freelist: VM_ALLOC_WIRED passed in req (%x)",
-	    req));
-
 	req_class = req & VM_ALLOC_CLASS_MASK;
 
 	/*
@@ -1951,14 +1944,14 @@ vm_page_alloc_freelist(int flind, int re
 	if ((req & VM_ALLOC_ZERO) != 0)
 		flags = PG_ZERO;
 	m->flags &= flags;
-
-	/*
-	 * The page lock is not required for wiring a page that does
-	 * not belong to an object.
-	 */
-	atomic_add_int(&vm_cnt.v_wire_count, 1);
-	m->wire_count = 1;
-
+	if ((req & VM_ALLOC_WIRED) != 0) {
+		/*
+		 * The page lock is not required for wiring a page that does
+		 * not belong to an object.
+		 */
+		atomic_add_int(&vm_cnt.v_wire_count, 1);
+		m->wire_count = 1;
+	}
 	/* Unmanaged pages don't use "act_count". */
 	m->oflags = VPO_UNMANAGED;
 	if (drop != NULL)
@@ -2234,15 +2227,9 @@ vm_page_free_toq(vm_page_t m)
 		vm_page_lock_assert(m, MA_OWNED);
 		KASSERT(!pmap_page_is_mapped(m),
 		    ("vm_page_free_toq: freeing mapped page %p", m));
-	} else {
+	} else
 		KASSERT(m->queue == PQ_NONE,
 		    ("vm_page_free_toq: unmanaged page %p is queued", m));
-		KASSERT(m->wire_count == 1,
-	    ("vm_page_free_toq: invalid wired count %u for unmanaged page %p",
-		    m->wire_count, m));
-		m->wire_count--;
-		atomic_subtract_int(&vm_cnt.v_wire_count, 1);
-	}
 	PCPU_INC(cnt.v_tfree);
 
 	if (vm_page_sbusied(m))
@@ -2348,7 +2335,10 @@ vm_page_wire(vm_page_t m)
  * paged again.  If paging is enabled, then the value of the parameter
  * "queue" determines the queue to which the page is added.
  *
- * If a page is fictitious or managed, then its wire count must always be one.
+ * However, unless the page belongs to an object, it is not enqueued because
+ * it cannot be paged out.
+ *
+ * If a page is fictitious, then its wire count must always be one.
  *
  * A managed page must be locked.
  */
@@ -2369,6 +2359,7 @@ vm_page_unwire(vm_page_t m, uint8_t queu
 	if (m->wire_count > 0) {
 		m->wire_count--;
 		if (m->wire_count == 0) {
+			atomic_subtract_int(&vm_cnt.v_wire_count, 1);
 			if ((m->oflags & VPO_UNMANAGED) != 0 ||
 			    m->object == NULL)
 				return;

Modified: user/attilio/rm_vmobj_cache/sys/vm/vm_page.h
==============================================================================
--- user/attilio/rm_vmobj_cache/sys/vm/vm_page.h	Mon Jun 16 18:29:05 2014	(r267549)
+++ user/attilio/rm_vmobj_cache/sys/vm/vm_page.h	Mon Jun 16 18:33:32 2014	(r267550)
@@ -172,7 +172,6 @@ struct vm_page {
  * 	 under PV management cannot be paged out via the
  * 	 object/vm_page_t because there is no knowledge of their pte
  * 	 mappings, and such pages are also not on any PQ queue.
- *	 VPO_UNMANAGED pages are also mandatory wired.
  *
  */
 #define	VPO_UNUSED01	0x01		/* --available-- */

Modified: user/attilio/rm_vmobj_cache/sys/x86/iommu/intel_idpgtbl.c
==============================================================================
--- user/attilio/rm_vmobj_cache/sys/x86/iommu/intel_idpgtbl.c	Mon Jun 16 18:29:05 2014	(r267549)
+++ user/attilio/rm_vmobj_cache/sys/x86/iommu/intel_idpgtbl.c	Mon Jun 16 18:33:32 2014	(r267550)
@@ -373,18 +373,17 @@ retry:
 			 */
 			m = dmar_pgalloc(ctx->pgtbl_obj, idx, flags |
 			    DMAR_PGF_ZERO);
+			if (m == NULL)
+				return (NULL);
 
 			/*
-			 * If a page is successfully returned, it is assumed
-			 * that the page is properly wired already.  This
-			 * prevent potential free while pgtbl_obj is
+			 * Prevent potential free while pgtbl_obj is
 			 * unlocked in the recursive call to
 			 * ctx_pgtbl_map_pte(), if other thread did
 			 * pte write and clean while the lock if
 			 * dropped.
 			 */
-			if (m == NULL)
-				return (NULL);
+			m->wire_count++;
 
 			sfp = NULL;
 			ptep = ctx_pgtbl_map_pte(ctx, base, lvl - 1, flags,
@@ -392,12 +391,14 @@ retry:
 			if (ptep == NULL) {
 				KASSERT(m->pindex != 0,
 				    ("loosing root page %p", ctx));
+				m->wire_count--;
 				dmar_pgfree(ctx->pgtbl_obj, m->pindex, flags);
 				return (NULL);
 			}
 			dmar_pte_store(&ptep->pte, DMAR_PTE_R | DMAR_PTE_W |
 			    VM_PAGE_TO_PHYS(m));
 			sf_buf_page(sfp)->wire_count += 1;
+			m->wire_count--;
 			dmar_unmap_pgtbl(sfp, DMAR_IS_COHERENT(ctx->dmar));
 			/* Only executed once. */
 			goto retry;
@@ -572,7 +573,7 @@ ctx_unmap_clear_pte(struct dmar_ctx *ctx
 		*sf = NULL;
 	}
 	m->wire_count--;
-	if (m->wire_count != 1)
+	if (m->wire_count != 0)
 		return;
 	KASSERT(lvl != 0,
 	    ("lost reference (lvl) on root pg ctx %p base %jx lvl %d",
@@ -684,6 +685,8 @@ ctx_alloc_pgtbl(struct dmar_ctx *ctx)
 	DMAR_CTX_PGLOCK(ctx);
 	m = dmar_pgalloc(ctx->pgtbl_obj, 0, DMAR_PGF_WAITOK |
 	    DMAR_PGF_ZERO | DMAR_PGF_OBJL);
+	/* No implicit free of the top level page table page. */
+	m->wire_count = 1;
 	DMAR_CTX_PGUNLOCK(ctx);
 	return (0);
 }
@@ -713,7 +716,7 @@ ctx_free_pgtbl(struct dmar_ctx *ctx)
 	/* Obliterate wire_counts */
 	VM_OBJECT_ASSERT_WLOCKED(obj);
 	for (m = vm_page_lookup(obj, 0); m != NULL; m = vm_page_next(m))
-		m->wire_count = 1;
+		m->wire_count = 0;
 	VM_OBJECT_WUNLOCK(obj);
 	vm_object_deallocate(obj);
 }


More information about the svn-src-user mailing list