Deleted Added
full compact
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 ---