diff options
author | alc <alc@FreeBSD.org> | 2011-03-11 07:07:48 +0000 |
---|---|---|
committer | alc <alc@FreeBSD.org> | 2011-03-11 07:07:48 +0000 |
commit | 9e6c31231192f42e2e7ef7c517968078924034de (patch) | |
tree | f38e7ae9369d58189815b91348c43b326cdb6944 /sys/vm/device_pager.c | |
parent | d268e58dd43207d9af61a36e076fae3fa4069bd6 (diff) | |
download | FreeBSD-src-9e6c31231192f42e2e7ef7c517968078924034de.zip FreeBSD-src-9e6c31231192f42e2e7ef7c517968078924034de.tar.gz |
Eliminate duplication of the fake page code and zone by the device and sg
pagers.
Reviewed by: jhb
Diffstat (limited to 'sys/vm/device_pager.c')
-rw-r--r-- | sys/vm/device_pager.c | 64 |
1 files changed, 3 insertions, 61 deletions
diff --git a/sys/vm/device_pager.c b/sys/vm/device_pager.c index 442eb80..f2131dd 100644 --- a/sys/vm/device_pager.c +++ b/sys/vm/device_pager.c @@ -67,13 +67,6 @@ static struct pagerlst dev_pager_object_list; /* 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, reqpage) * 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, reqpage) * 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) *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); -} |