--- src/sys/vm/device_pager.c 2004/03/23 22:54:32 1.7 +++ src/sys/vm/device_pager.c 2004/07/21 01:25:18 1.8 @@ -45,6 +45,7 @@ #include #include #include +#include #include #include @@ -185,8 +186,8 @@ dev_pager_getpages(vm_object_t object, v vm_paddr_t paddr; vm_page_t page; dev_t dev; - int i, s; int prot; + int i; dev = object->handle; offset = m[reqpage]->pindex; @@ -194,19 +195,29 @@ dev_pager_getpages(vm_object_t object, v paddr = pmap_phys_address(dev_dmmap(dev, (vm_offset_t) offset << PAGE_SHIFT, prot)); KASSERT(paddr != -1,("dev_pager_getpage: map function returns error")); - /* - * 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); - TAILQ_INSERT_TAIL(&object->un_pager.devp.devp_pglist, page, pageq); + + if (m[reqpage]->flags & PG_FICTITIOUS) { + /* + * If the passed in reqpage page is a fake page, update it + * with the new physical address. + */ + m[reqpage]->phys_addr = paddr; + } else { + /* + * Replace the passed in reqpage page with our own fake page + * and free up all the original pages. + */ + page = dev_pager_getfake(paddr); + TAILQ_INSERT_TAIL(&object->un_pager.devp.devp_pglist, page, pageq); + crit_enter(); + vm_page_free(m[reqpage]); + vm_page_insert(page, object, offset); + crit_exit(); + } for (i = 0; i < count; i++) { - vm_page_free(m[i]); + if (i != reqpage) + vm_page_free(m[i]); } - s = splhigh(); - vm_page_insert(page, object, offset); - splx(s); - return (VM_PAGER_OK); }