device_pager.c (196615) | device_pager.c (201223) |
---|---|
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> | 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 196615 2009-08-28 14:06:55Z jhb $"); | 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 | 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 |
96static __inline int 97dev_mmap(struct cdevsw *csw, struct cdev *dev, vm_offset_t offset, 98 vm_paddr_t *paddr, int nprot, vm_memattr_t *memattr) 99{ 100 101 if (csw->d_flags & D_MMAP2) 102 return (csw->d_mmap2(dev, offset, paddr, nprot, memattr)); 103 else 104 return (csw->d_mmap(dev, offset, paddr, nprot)); 105} 106 | |
107/* 108 * MPSAFE 109 */ 110static vm_object_t 111dev_pager_alloc(void *handle, vm_ooffset_t size, vm_prot_t prot, 112 vm_ooffset_t foff, struct ucred *cred) 113{ 114 struct cdev *dev; 115 vm_object_t object, object1; 116 vm_pindex_t pindex; 117 unsigned int npages; 118 vm_paddr_t paddr; | 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; |
119 vm_offset_t off; | 108 vm_ooffset_t off; |
120 vm_memattr_t dummy; 121 struct cdevsw *csw; 122 123 /* 124 * Offset should be page aligned. 125 */ 126 if (foff & PAGE_MASK) 127 return (NULL); --- 12 unchanged lines hidden (view full) --- 140 /* 141 * Check that the specified range of the device allows the desired 142 * protection. 143 * 144 * XXX assumes VM_PROT_* == PROT_* 145 */ 146 npages = OFF_TO_IDX(size); 147 for (off = foff; npages--; off += PAGE_SIZE) | 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) |
148 if (dev_mmap(csw, dev, off, &paddr, (int)prot, &dummy) != 0) { | 137 if (csw->d_mmap(dev, off, &paddr, (int)prot, &dummy) != 0) { |
149 dev_relthread(dev); 150 return (NULL); 151 } 152 153 mtx_lock(&dev_pager_mtx); 154 155 /* 156 * Look up pager, creating as necessary. --- 80 unchanged lines hidden (view full) --- 237 memattr = object->memattr; 238 VM_OBJECT_UNLOCK(object); 239 csw = dev_refthread(dev); 240 if (csw == NULL) 241 panic("dev_pager_getpage: no cdevsw"); 242 td = curthread; 243 fpop = td->td_fpop; 244 td->td_fpop = NULL; | 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; |
245 ret = dev_mmap(csw, dev, (vm_offset_t)offset << PAGE_SHIFT, &paddr, | 234 ret = csw->d_mmap(dev, (vm_ooffset_t)offset << PAGE_SHIFT, &paddr, |
246 PROT_READ, &memattr); 247 KASSERT(ret == 0, ("dev_pager_getpage: map function returns error")); 248 td->td_fpop = fpop; 249 dev_relthread(dev); 250 /* If "paddr" is a real page, perform a sanity check on "memattr". */ 251 if ((m_paddr = vm_phys_paddr_to_vm_page(paddr)) != NULL && 252 pmap_page_get_memattr(m_paddr) != memattr) { 253 memattr = pmap_page_get_memattr(m_paddr); --- 108 unchanged lines hidden --- | 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 --- |