Deleted Added
full compact
device_pager.c (207728) device_pager.c (210923)
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 207728 2010-05-06 18:58:32Z alc $");
38__FBSDID("$FreeBSD: head/sys/vm/device_pager.c 210923 2010-08-06 09:42:15Z kib $");
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>

--- 56 unchanged lines hidden (view full) ---

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;
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>

--- 56 unchanged lines hidden (view full) ---

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 int ref;
111
112 /*
113 * Offset should be page aligned.
114 */
115 if (foff & PAGE_MASK)
116 return (NULL);
117
118 size = round_page(size);
119 pindex = OFF_TO_IDX(foff + size);
120
121 /*
122 * Make sure this device can be mapped.
123 */
124 dev = handle;
112
113 /*
114 * Offset should be page aligned.
115 */
116 if (foff & PAGE_MASK)
117 return (NULL);
118
119 size = round_page(size);
120 pindex = OFF_TO_IDX(foff + size);
121
122 /*
123 * Make sure this device can be mapped.
124 */
125 dev = handle;
125 csw = dev_refthread(dev);
126 csw = dev_refthread(dev, &ref);
126 if (csw == NULL)
127 return (NULL);
128
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) {
127 if (csw == NULL)
128 return (NULL);
129
130 /*
131 * Check that the specified range of the device allows the desired
132 * protection.
133 *
134 * XXX assumes VM_PROT_* == PROT_*
135 */
136 npages = OFF_TO_IDX(size);
137 for (off = foff; npages--; off += PAGE_SIZE)
138 if (csw->d_mmap(dev, off, &paddr, (int)prot, &dummy) != 0) {
138 dev_relthread(dev);
139 dev_relthread(dev, ref);
139 return (NULL);
140 }
141
142 mtx_lock(&dev_pager_mtx);
143
144 /*
145 * Look up pager, creating as necessary.
146 */

--- 25 unchanged lines hidden (view full) ---

172 TAILQ_INSERT_TAIL(&dev_pager_object_list, object,
173 pager_object_list);
174 }
175 } else {
176 if (pindex > object->size)
177 object->size = pindex;
178 }
179 mtx_unlock(&dev_pager_mtx);
140 return (NULL);
141 }
142
143 mtx_lock(&dev_pager_mtx);
144
145 /*
146 * Look up pager, creating as necessary.
147 */

--- 25 unchanged lines hidden (view full) ---

173 TAILQ_INSERT_TAIL(&dev_pager_object_list, object,
174 pager_object_list);
175 }
176 } else {
177 if (pindex > object->size)
178 object->size = pindex;
179 }
180 mtx_unlock(&dev_pager_mtx);
180 dev_relthread(dev);
181 dev_relthread(dev, ref);
181 vm_object_deallocate(object1);
182 return (object);
183}
184
185static void
186dev_pager_dealloc(object)
187 vm_object_t object;
188{

--- 20 unchanged lines hidden (view full) ---

209 int count;
210 int reqpage;
211{
212 vm_pindex_t offset;
213 vm_paddr_t paddr;
214 vm_page_t m_paddr, page;
215 vm_memattr_t memattr;
216 struct cdev *dev;
182 vm_object_deallocate(object1);
183 return (object);
184}
185
186static void
187dev_pager_dealloc(object)
188 vm_object_t object;
189{

--- 20 unchanged lines hidden (view full) ---

210 int count;
211 int reqpage;
212{
213 vm_pindex_t offset;
214 vm_paddr_t paddr;
215 vm_page_t m_paddr, page;
216 vm_memattr_t memattr;
217 struct cdev *dev;
217 int i, ret;
218 int i, ref, ret;
218 struct cdevsw *csw;
219 struct thread *td;
220 struct file *fpop;
221
222 VM_OBJECT_LOCK_ASSERT(object, MA_OWNED);
223 dev = object->handle;
224 page = m[reqpage];
225 offset = page->pindex;
226 memattr = object->memattr;
227 VM_OBJECT_UNLOCK(object);
219 struct cdevsw *csw;
220 struct thread *td;
221 struct file *fpop;
222
223 VM_OBJECT_LOCK_ASSERT(object, MA_OWNED);
224 dev = object->handle;
225 page = m[reqpage];
226 offset = page->pindex;
227 memattr = object->memattr;
228 VM_OBJECT_UNLOCK(object);
228 csw = dev_refthread(dev);
229 csw = dev_refthread(dev, &ref);
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;
230 if (csw == NULL)
231 panic("dev_pager_getpage: no cdevsw");
232 td = curthread;
233 fpop = td->td_fpop;
234 td->td_fpop = NULL;
235 ret = csw->d_mmap(dev, (vm_ooffset_t)offset << PAGE_SHIFT, &paddr,
236 PROT_READ, &memattr);
237 KASSERT(ret == 0, ("dev_pager_getpage: map function returns error"));
238 td->td_fpop = fpop;
238 dev_relthread(dev);
239 dev_relthread(dev, ref);
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);
243 printf(
244 "WARNING: A device driver has set \"memattr\" inconsistently.\n");
245 }
246 if ((page->flags & PG_FICTITIOUS) != 0) {

--- 107 unchanged lines hidden ---
240 /* If "paddr" is a real page, perform a sanity check on "memattr". */
241 if ((m_paddr = vm_phys_paddr_to_vm_page(paddr)) != NULL &&
242 pmap_page_get_memattr(m_paddr) != memattr) {
243 memattr = pmap_page_get_memattr(m_paddr);
244 printf(
245 "WARNING: A device driver has set \"memattr\" inconsistently.\n");
246 }
247 if ((page->flags & PG_FICTITIOUS) != 0) {

--- 107 unchanged lines hidden ---