Lines Matching +full:dev +full:- +full:handle
1 /*-
2 * SPDX-License-Identifier: BSD-3-Clause
95 static int old_dev_pager_ctor(void *handle, vm_ooffset_t size, vm_prot_t prot,
97 static void old_dev_pager_dtor(void *handle);
116 cdev_pager_lookup(void *handle) in cdev_pager_lookup() argument
122 object = vm_pager_object_lookup(&dev_pager_object_list, handle); in cdev_pager_lookup()
123 if (object != NULL && object->un_pager.devp.handle == NULL) { in cdev_pager_lookup()
124 msleep(&object->un_pager.devp.handle, &dev_pager_mtx, in cdev_pager_lookup()
134 cdev_pager_allocate(void *handle, enum obj_type tp, in cdev_pager_allocate() argument
141 KASSERT(handle != NULL, ("device pager with NULL handle")); in cdev_pager_allocate()
145 KASSERT(tp == OBJT_MGTDEVICE || ops->cdev_pg_populate == NULL, in cdev_pager_allocate()
173 object = vm_pager_object_lookup(&dev_pager_object_list, handle); in cdev_pager_allocate()
185 object = vm_pager_object_lookup(&dev_pager_object_list, handle); in cdev_pager_allocate()
187 object1->type = OBJT_DEAD; in cdev_pager_allocate()
190 if (object->un_pager.devp.handle == NULL) { in cdev_pager_allocate()
191 msleep(&object->un_pager.devp.handle, in cdev_pager_allocate()
200 if (pindex > object->size) in cdev_pager_allocate()
201 object->size = pindex; in cdev_pager_allocate()
202 KASSERT(object->type == tp, in cdev_pager_allocate()
205 KASSERT(object->un_pager.devp.ops == ops, in cdev_pager_allocate()
212 object->handle = handle; in cdev_pager_allocate()
213 object->un_pager.devp.ops = ops; in cdev_pager_allocate()
214 TAILQ_INIT(&object->un_pager.devp.devp_pglist); in cdev_pager_allocate()
218 if (ops->cdev_pg_populate != NULL) in cdev_pager_allocate()
220 if (ops->cdev_pg_ctor(handle, size, prot, foff, in cdev_pager_allocate()
225 wakeup(&object->un_pager.devp.handle); in cdev_pager_allocate()
227 object->type = OBJT_DEAD; in cdev_pager_allocate()
233 object->flags |= OBJ_COLORED; in cdev_pager_allocate()
234 object->pg_color = color; in cdev_pager_allocate()
235 object->un_pager.devp.handle = handle; in cdev_pager_allocate()
236 wakeup(&object->un_pager.devp.handle); in cdev_pager_allocate()
241 if (object->un_pager.devp.handle == NULL) { in cdev_pager_allocate()
242 msleep(&object->un_pager.devp.handle, in cdev_pager_allocate()
247 if (pindex > object->size) in cdev_pager_allocate()
248 object->size = pindex; in cdev_pager_allocate()
249 KASSERT(object->type == tp, in cdev_pager_allocate()
257 dev_pager_alloc(void *handle, vm_ooffset_t size, vm_prot_t prot, in dev_pager_alloc() argument
261 return (cdev_pager_allocate(handle, OBJT_DEVICE, &old_dev_pager_ops, in dev_pager_alloc()
269 if (object->type == OBJT_MGTDEVICE) { in cdev_pager_free_page()
273 vm_radix_iter_lookup(&pages, m->pindex); in cdev_pager_free_page()
275 } else if (object->type == OBJT_DEVICE) in cdev_pager_free_page()
316 KASSERT((object->type == OBJT_DEVICE && in dev_pager_free_page()
317 (m->oflags & VPO_UNMANAGED) != 0), in dev_pager_free_page()
319 TAILQ_REMOVE(&object->un_pager.devp.devp_pglist, m, plinks.q); in dev_pager_free_page()
329 object->un_pager.devp.ops->cdev_pg_dtor(object->un_pager.devp.handle); in dev_pager_dealloc()
336 if (object->type == OBJT_DEVICE) { in dev_pager_dealloc()
340 while ((m = TAILQ_FIRST(&object->un_pager.devp.devp_pglist)) in dev_pager_dealloc()
348 object->handle = NULL; in dev_pager_dealloc()
349 object->type = OBJT_DEAD; in dev_pager_dealloc()
360 if (object->un_pager.devp.ops->cdev_pg_fault == NULL) in dev_pager_getpages()
363 error = object->un_pager.devp.ops->cdev_pg_fault(object, in dev_pager_getpages()
364 IDX_TO_OFF(ma[0]->pindex), PROT_READ, &ma[0]); in dev_pager_getpages()
369 KASSERT((object->type == OBJT_DEVICE && in dev_pager_getpages()
370 (ma[0]->oflags & VPO_UNMANAGED) != 0) || in dev_pager_getpages()
371 (object->type == OBJT_MGTDEVICE && in dev_pager_getpages()
372 (ma[0]->oflags & VPO_UNMANAGED) == 0), in dev_pager_getpages()
374 if (object->type == OBJT_DEVICE) { in dev_pager_getpages()
375 TAILQ_INSERT_TAIL(&object->un_pager.devp.devp_pglist, in dev_pager_getpages()
394 if (object->un_pager.devp.ops->cdev_pg_populate == NULL) in dev_pager_populate()
396 return (object->un_pager.devp.ops->cdev_pg_populate(object, pidx, in dev_pager_populate()
406 struct cdev *dev; in old_dev_pager_fault() local
413 memattr = object->memattr; in old_dev_pager_fault()
417 dev = object->handle; in old_dev_pager_fault()
418 csw = dev_refthread(dev, &ref); in old_dev_pager_fault()
424 fpop = td->td_fpop; in old_dev_pager_fault()
425 td->td_fpop = NULL; in old_dev_pager_fault()
426 ret = csw->d_mmap(dev, offset, &paddr, prot, &memattr); in old_dev_pager_fault()
427 td->td_fpop = fpop; in old_dev_pager_fault()
428 dev_relthread(dev, ref); in old_dev_pager_fault()
440 * For the /dev/mem d_mmap routine to return the in old_dev_pager_fault()
444 if ((csw->d_flags & D_MEM) == 0) { in old_dev_pager_fault()
447 csw->d_name, memattr, memattr1); in old_dev_pager_fault()
451 if (((*mres)->flags & PG_FICTITIOUS) != 0) { in old_dev_pager_fault()
466 vm_page_replace(page, object, (*mres)->pindex, *mres); in old_dev_pager_fault()
494 old_dev_pager_ctor(void *handle, vm_ooffset_t size, vm_prot_t prot, in old_dev_pager_ctor() argument
497 struct cdev *dev; in old_dev_pager_ctor() local
508 dev = handle; in old_dev_pager_ctor()
509 csw = dev_refthread(dev, &ref); in old_dev_pager_ctor()
521 for (off = foff; npages--; off += PAGE_SIZE) { in old_dev_pager_ctor()
522 if (csw->d_mmap(dev, off, &paddr, (int)prot, &dummy) != 0) { in old_dev_pager_ctor()
523 dev_relthread(dev, ref); in old_dev_pager_ctor()
528 dev_ref(dev); in old_dev_pager_ctor()
529 dev_relthread(dev, ref); in old_dev_pager_ctor()
530 *color = atop(paddr) - OFF_TO_IDX(off - PAGE_SIZE); in old_dev_pager_ctor()
535 old_dev_pager_dtor(void *handle) in old_dev_pager_dtor() argument
538 dev_rel(handle); in old_dev_pager_dtor()