From owner-svn-src-all@FreeBSD.ORG Fri Mar 11 07:07:49 2011 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 0E81C106566C; Fri, 11 Mar 2011 07:07:49 +0000 (UTC) (envelope-from alc@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id F04B28FC0A; Fri, 11 Mar 2011 07:07:48 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id p2B77mMQ069039; Fri, 11 Mar 2011 07:07:48 GMT (envelope-from alc@svn.freebsd.org) Received: (from alc@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p2B77mYx069034; Fri, 11 Mar 2011 07:07:48 GMT (envelope-from alc@svn.freebsd.org) Message-Id: <201103110707.p2B77mYx069034@svn.freebsd.org> From: Alan Cox Date: Fri, 11 Mar 2011 07:07:48 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r219476 - head/sys/vm X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 11 Mar 2011 07:07:49 -0000 Author: alc Date: Fri Mar 11 07:07:48 2011 New Revision: 219476 URL: http://svn.freebsd.org/changeset/base/219476 Log: Eliminate duplication of the fake page code and zone by the device and sg pagers. Reviewed by: jhb Modified: head/sys/vm/device_pager.c head/sys/vm/sg_pager.c head/sys/vm/vm_page.c head/sys/vm/vm_page.h Modified: head/sys/vm/device_pager.c ============================================================================== --- head/sys/vm/device_pager.c Fri Mar 11 04:31:00 2011 (r219475) +++ head/sys/vm/device_pager.c Fri Mar 11 07:07:48 2011 (r219476) @@ -67,13 +67,6 @@ static struct pagerlst dev_pager_object_ /* protect list manipulation */ static struct mtx dev_pager_mtx; - -static uma_zone_t fakepg_zone; - -static vm_page_t dev_pager_getfake(vm_paddr_t, vm_memattr_t); -static void dev_pager_putfake(vm_page_t); -static void dev_pager_updatefake(vm_page_t, vm_paddr_t, vm_memattr_t); - struct pagerops devicepagerops = { .pgo_init = dev_pager_init, .pgo_alloc = dev_pager_alloc, @@ -88,9 +81,6 @@ dev_pager_init() { TAILQ_INIT(&dev_pager_object_list); mtx_init(&dev_pager_mtx, "dev_pager list", NULL, MTX_DEF); - fakepg_zone = uma_zcreate("DP fakepg", sizeof(struct vm_page), - NULL, NULL, NULL, NULL, UMA_ALIGN_PTR, - UMA_ZONE_NOFREE|UMA_ZONE_VM); } /* @@ -199,7 +189,7 @@ dev_pager_dealloc(object) */ while ((m = TAILQ_FIRST(&object->un_pager.devp.devp_pglist)) != NULL) { TAILQ_REMOVE(&object->un_pager.devp.devp_pglist, m, pageq); - dev_pager_putfake(m); + vm_page_putfake(m); } } @@ -250,7 +240,7 @@ dev_pager_getpages(object, m, count, req * the new physical address. */ VM_OBJECT_LOCK(object); - dev_pager_updatefake(page, paddr, memattr); + vm_page_updatefake(page, paddr, memattr); if (count > 1) { for (i = 0; i < count; i++) { @@ -266,7 +256,7 @@ dev_pager_getpages(object, m, count, req * Replace the passed in reqpage page with our own fake page and * free up the all of the original pages. */ - page = dev_pager_getfake(paddr, memattr); + page = vm_page_getfake(paddr, memattr); VM_OBJECT_LOCK(object); TAILQ_INSERT_TAIL(&object->un_pager.devp.devp_pglist, page, pageq); for (i = 0; i < count; i++) { @@ -305,51 +295,3 @@ dev_pager_haspage(object, pindex, before *after = 0; return (TRUE); } - -/* - * Create a fictitious page with the specified physical address and memory - * attribute. The memory attribute is the only the machine-dependent aspect - * of a fictitious page that must be initialized. - */ -static vm_page_t -dev_pager_getfake(vm_paddr_t paddr, vm_memattr_t memattr) -{ - vm_page_t m; - - m = uma_zalloc(fakepg_zone, M_WAITOK | M_ZERO); - m->phys_addr = paddr; - m->queue = PQ_NONE; - /* Fictitious pages don't use "segind". */ - m->flags = PG_FICTITIOUS; - /* Fictitious pages don't use "order" or "pool". */ - m->oflags = VPO_BUSY; - m->wire_count = 1; - pmap_page_set_memattr(m, memattr); - return (m); -} - -/* - * Release a fictitious page. - */ -static void -dev_pager_putfake(vm_page_t m) -{ - - if (!(m->flags & PG_FICTITIOUS)) - panic("dev_pager_putfake: bad page"); - uma_zfree(fakepg_zone, m); -} - -/* - * Update the given fictitious page to the specified physical address and - * memory attribute. - */ -static void -dev_pager_updatefake(vm_page_t m, vm_paddr_t paddr, vm_memattr_t memattr) -{ - - if (!(m->flags & PG_FICTITIOUS)) - panic("dev_pager_updatefake: bad page"); - m->phys_addr = paddr; - pmap_page_set_memattr(m, memattr); -} Modified: head/sys/vm/sg_pager.c ============================================================================== --- head/sys/vm/sg_pager.c Fri Mar 11 04:31:00 2011 (r219475) +++ head/sys/vm/sg_pager.c Fri Mar 11 07:07:48 2011 (r219476) @@ -43,7 +43,6 @@ __FBSDID("$FreeBSD$"); #include #include -static void sg_pager_init(void); static vm_object_t sg_pager_alloc(void *, vm_ooffset_t, vm_prot_t, vm_ooffset_t, struct ucred *); static void sg_pager_dealloc(vm_object_t); @@ -53,13 +52,7 @@ static void sg_pager_putpages(vm_object_ static boolean_t sg_pager_haspage(vm_object_t, vm_pindex_t, int *, int *); -static uma_zone_t fakepg_zone; - -static vm_page_t sg_pager_getfake(vm_paddr_t, vm_memattr_t); -static void sg_pager_putfake(vm_page_t); - struct pagerops sgpagerops = { - .pgo_init = sg_pager_init, .pgo_alloc = sg_pager_alloc, .pgo_dealloc = sg_pager_dealloc, .pgo_getpages = sg_pager_getpages, @@ -67,15 +60,6 @@ struct pagerops sgpagerops = { .pgo_haspage = sg_pager_haspage, }; -static void -sg_pager_init(void) -{ - - fakepg_zone = uma_zcreate("SG fakepg", sizeof(struct vm_page), - NULL, NULL, NULL, NULL, UMA_ALIGN_PTR, - UMA_ZONE_NOFREE|UMA_ZONE_VM); -} - static vm_object_t sg_pager_alloc(void *handle, vm_ooffset_t size, vm_prot_t prot, vm_ooffset_t foff, struct ucred *cred) @@ -138,7 +122,7 @@ sg_pager_dealloc(vm_object_t object) */ while ((m = TAILQ_FIRST(&object->un_pager.sgp.sgp_pglist)) != 0) { TAILQ_REMOVE(&object->un_pager.sgp.sgp_pglist, m, pageq); - sg_pager_putfake(m); + vm_page_putfake(m); } sg = object->handle; @@ -193,7 +177,7 @@ sg_pager_getpages(vm_object_t object, vm ("backing page for SG is fake")); /* Construct a new fake page. */ - page = sg_pager_getfake(paddr, memattr); + page = vm_page_getfake(paddr, memattr); VM_OBJECT_LOCK(object); TAILQ_INSERT_TAIL(&object->un_pager.sgp.sgp_pglist, page, pageq); @@ -229,34 +213,3 @@ sg_pager_haspage(vm_object_t object, vm_ *after = 0; return (TRUE); } - -/* - * Create a fictitious page with the specified physical address and memory - * attribute. The memory attribute is the only the machine-dependent aspect - * of a fictitious page that must be initialized. - */ -static vm_page_t -sg_pager_getfake(vm_paddr_t paddr, vm_memattr_t memattr) -{ - vm_page_t m; - - m = uma_zalloc(fakepg_zone, M_WAITOK | M_ZERO); - m->phys_addr = paddr; - m->queue = PQ_NONE; - /* Fictitious pages don't use "segind". */ - m->flags = PG_FICTITIOUS; - /* Fictitious pages don't use "order" or "pool". */ - m->oflags = VPO_BUSY; - m->wire_count = 1; - pmap_page_set_memattr(m, memattr); - return (m); -} - -static void -sg_pager_putfake(vm_page_t m) -{ - - if (!(m->flags & PG_FICTITIOUS)) - panic("sg_pager_putfake: bad page"); - uma_zfree(fakepg_zone, m); -} Modified: head/sys/vm/vm_page.c ============================================================================== --- head/sys/vm/vm_page.c Fri Mar 11 04:31:00 2011 (r219475) +++ head/sys/vm/vm_page.c Fri Mar 11 07:07:48 2011 (r219476) @@ -156,9 +156,22 @@ static int pa_tryrelock_restart; SYSCTL_INT(_vm, OID_AUTO, tryrelock_restart, CTLFLAG_RD, &pa_tryrelock_restart, 0, "Number of tryrelock restarts"); +static uma_zone_t fakepg_zone; + static void vm_page_clear_dirty_mask(vm_page_t m, int pagebits); static void vm_page_queue_remove(int queue, vm_page_t m); static void vm_page_enqueue(int queue, vm_page_t m); +static void vm_page_init_fakepg(void *dummy); + +SYSINIT(vm_page, SI_SUB_VM, SI_ORDER_SECOND, vm_page_init_fakepg, NULL); + +static void +vm_page_init_fakepg(void *dummy) +{ + + fakepg_zone = uma_zcreate("fakepg", sizeof(struct vm_page), NULL, NULL, + NULL, NULL, UMA_ALIGN_PTR, UMA_ZONE_NOFREE | UMA_ZONE_VM); +} /* Make sure that u_long is at least 64 bits when PAGE_SIZE is 32K. */ #if PAGE_SIZE == 32768 @@ -606,6 +619,60 @@ vm_page_unhold_pages(vm_page_t *ma, int } /* + * vm_page_getfake: + * + * Create a fictitious page with the specified physical address and + * memory attribute. The memory attribute is the only the machine- + * dependent aspect of a fictitious page that must be initialized. + */ +vm_page_t +vm_page_getfake(vm_paddr_t paddr, vm_memattr_t memattr) +{ + vm_page_t m; + + m = uma_zalloc(fakepg_zone, M_WAITOK | M_ZERO); + m->phys_addr = paddr; + m->queue = PQ_NONE; + /* Fictitious pages don't use "segind". */ + m->flags = PG_FICTITIOUS; + /* Fictitious pages don't use "order" or "pool". */ + m->oflags = VPO_BUSY; + m->wire_count = 1; + pmap_page_set_memattr(m, memattr); + return (m); +} + +/* + * vm_page_putfake: + * + * Release a fictitious page. + */ +void +vm_page_putfake(vm_page_t m) +{ + + KASSERT((m->flags & PG_FICTITIOUS) != 0, + ("vm_page_putfake: bad page %p", m)); + uma_zfree(fakepg_zone, m); +} + +/* + * vm_page_updatefake: + * + * Update the given fictitious page to the specified physical address and + * memory attribute. + */ +void +vm_page_updatefake(vm_page_t m, vm_paddr_t paddr, vm_memattr_t memattr) +{ + + KASSERT((m->flags & PG_FICTITIOUS) != 0, + ("vm_page_updatefake: bad page %p", m)); + m->phys_addr = paddr; + pmap_page_set_memattr(m, memattr); +} + +/* * vm_page_free: * * Free a page. Modified: head/sys/vm/vm_page.h ============================================================================== --- head/sys/vm/vm_page.h Fri Mar 11 04:31:00 2011 (r219475) +++ head/sys/vm/vm_page.h Fri Mar 11 07:07:48 2011 (r219476) @@ -352,11 +352,13 @@ int vm_page_try_to_free (vm_page_t); void vm_page_dontneed(vm_page_t); void vm_page_deactivate (vm_page_t); vm_page_t vm_page_find_least(vm_object_t, vm_pindex_t); +vm_page_t vm_page_getfake(vm_paddr_t paddr, vm_memattr_t memattr); void vm_page_insert (vm_page_t, vm_object_t, vm_pindex_t); vm_page_t vm_page_lookup (vm_object_t, vm_pindex_t); vm_page_t vm_page_next(vm_page_t m); int vm_page_pa_tryrelock(pmap_t, vm_paddr_t, vm_paddr_t *); vm_page_t vm_page_prev(vm_page_t m); +void vm_page_putfake(vm_page_t m); void vm_page_remove (vm_page_t); void vm_page_rename (vm_page_t, vm_object_t, vm_pindex_t); void vm_page_requeue(vm_page_t m); @@ -366,6 +368,7 @@ vm_page_t vm_page_splay(vm_pindex_t, vm_ vm_offset_t vm_page_startup(vm_offset_t vaddr); void vm_page_unhold_pages(vm_page_t *ma, int count); void vm_page_unwire (vm_page_t, int); +void vm_page_updatefake(vm_page_t m, vm_paddr_t paddr, vm_memattr_t memattr); void vm_page_wire (vm_page_t); void vm_page_set_validclean (vm_page_t, int, int); void vm_page_clear_dirty (vm_page_t, int, int);