diff options
Diffstat (limited to 'sys/vm/device_pager.c')
| -rw-r--r-- | sys/vm/device_pager.c | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/sys/vm/device_pager.c b/sys/vm/device_pager.c index 0d762de07052..c7f559381fd0 100644 --- a/sys/vm/device_pager.c +++ b/sys/vm/device_pager.c @@ -93,6 +93,17 @@ dev_pager_init() UMA_ZONE_NOFREE|UMA_ZONE_VM); } +static __inline int +dev_mmap(struct cdevsw *csw, struct cdev *dev, vm_offset_t offset, + vm_paddr_t *paddr, int nprot, vm_memattr_t *memattr) +{ + + if (csw->d_flags & D_MMAP2) + return (csw->d_mmap2(dev, offset, paddr, nprot, memattr)); + else + return (csw->d_mmap(dev, offset, paddr, nprot)); +} + /* * MPSAFE */ @@ -106,6 +117,7 @@ dev_pager_alloc(void *handle, vm_ooffset_t size, vm_prot_t prot, unsigned int npages; vm_paddr_t paddr; vm_offset_t off; + vm_memattr_t dummy; struct cdevsw *csw; /* @@ -133,7 +145,7 @@ dev_pager_alloc(void *handle, vm_ooffset_t size, vm_prot_t prot, */ npages = OFF_TO_IDX(size); for (off = foff; npages--; off += PAGE_SIZE) - if ((*csw->d_mmap)(dev, off, &paddr, (int)prot) != 0) { + if (dev_mmap(csw, dev, off, &paddr, (int)prot, &dummy) != 0) { dev_relthread(dev); return (NULL); } @@ -214,7 +226,6 @@ dev_pager_getpages(object, m, count, reqpage) vm_memattr_t memattr; struct cdev *dev; int i, ret; - int prot; struct cdevsw *csw; struct thread *td; struct file *fpop; @@ -228,12 +239,11 @@ dev_pager_getpages(object, m, count, reqpage) csw = dev_refthread(dev); if (csw == NULL) panic("dev_pager_getpage: no cdevsw"); - prot = PROT_READ; /* XXX should pass in? */ - td = curthread; fpop = td->td_fpop; td->td_fpop = NULL; - ret = (*csw->d_mmap)(dev, (vm_offset_t)offset << PAGE_SHIFT, &paddr, prot); + ret = dev_mmap(csw, dev, (vm_offset_t)offset << PAGE_SHIFT, &paddr, + PROT_READ, &memattr); KASSERT(ret == 0, ("dev_pager_getpage: map function returns error")); td->td_fpop = fpop; dev_relthread(dev); |
