1/*- 2 * Copyright (c) 1990 University of Utah. 3 * Copyright (c) 1991, 1993 4 * The Regents of the University of California. All rights reserved. 5 * 6 * This code is derived from software contributed to Berkeley by 7 * the Systems Programming Group of the University of Utah Computer 8 * Science Department. --- 21 unchanged lines hidden (view full) --- 30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32 * SUCH DAMAGE. 33 * 34 * @(#)device_pager.c 8.1 (Berkeley) 6/11/93 35 */ 36 37#include <sys/cdefs.h> |
38__FBSDID("$FreeBSD: head/sys/vm/device_pager.c 201223 2009-12-29 21:51:28Z rnoland $"); |
39 40#include <sys/param.h> 41#include <sys/systm.h> 42#include <sys/conf.h> 43#include <sys/lock.h> 44#include <sys/proc.h> 45#include <sys/mutex.h> 46#include <sys/mman.h> --- 41 unchanged lines hidden (view full) --- 88{ 89 TAILQ_INIT(&dev_pager_object_list); 90 mtx_init(&dev_pager_mtx, "dev_pager list", NULL, MTX_DEF); 91 fakepg_zone = uma_zcreate("DP fakepg", sizeof(struct vm_page), 92 NULL, NULL, NULL, NULL, UMA_ALIGN_PTR, 93 UMA_ZONE_NOFREE|UMA_ZONE_VM); 94} 95 |
96/* 97 * MPSAFE 98 */ 99static vm_object_t 100dev_pager_alloc(void *handle, vm_ooffset_t size, vm_prot_t prot, 101 vm_ooffset_t foff, struct ucred *cred) 102{ 103 struct cdev *dev; 104 vm_object_t object, object1; 105 vm_pindex_t pindex; 106 unsigned int npages; 107 vm_paddr_t paddr; |
108 vm_ooffset_t off; |
109 vm_memattr_t dummy; 110 struct cdevsw *csw; 111 112 /* 113 * Offset should be page aligned. 114 */ 115 if (foff & PAGE_MASK) 116 return (NULL); --- 12 unchanged lines hidden (view full) --- 129 /* 130 * Check that the specified range of the device allows the desired 131 * protection. 132 * 133 * XXX assumes VM_PROT_* == PROT_* 134 */ 135 npages = OFF_TO_IDX(size); 136 for (off = foff; npages--; off += PAGE_SIZE) |
137 if (csw->d_mmap(dev, off, &paddr, (int)prot, &dummy) != 0) { |
138 dev_relthread(dev); 139 return (NULL); 140 } 141 142 mtx_lock(&dev_pager_mtx); 143 144 /* 145 * Look up pager, creating as necessary. --- 80 unchanged lines hidden (view full) --- 226 memattr = object->memattr; 227 VM_OBJECT_UNLOCK(object); 228 csw = dev_refthread(dev); 229 if (csw == NULL) 230 panic("dev_pager_getpage: no cdevsw"); 231 td = curthread; 232 fpop = td->td_fpop; 233 td->td_fpop = NULL; |
234 ret = csw->d_mmap(dev, (vm_ooffset_t)offset << PAGE_SHIFT, &paddr, |
235 PROT_READ, &memattr); 236 KASSERT(ret == 0, ("dev_pager_getpage: map function returns error")); 237 td->td_fpop = fpop; 238 dev_relthread(dev); 239 /* If "paddr" is a real page, perform a sanity check on "memattr". */ 240 if ((m_paddr = vm_phys_paddr_to_vm_page(paddr)) != NULL && 241 pmap_page_get_memattr(m_paddr) != memattr) { 242 memattr = pmap_page_get_memattr(m_paddr); --- 108 unchanged lines hidden --- |