49#include <sys/rwlock.h>
52#include <sys/vmmeter.h>
64 vm_ooffset_t,
struct ucred *);
71 int fault_type,
vm_prot_t, vm_pindex_t *first, vm_pindex_t *last);
99 vm_ooffset_t foff,
struct ucred *cred, u_short *color);
102 int prot, vm_page_t *mres);
132 vm_ooffset_t foff,
struct ucred *cred)
141 (
"populate on unmanaged device pager"));
146 if (foff & PAGE_MASK)
156 size = round_page(size);
162 if (ops->
cdev_pg_ctor(handle, size, prot, foff, cred, &color) != 0)
171 if (
object == NULL) {
187 if (
object != NULL) {
191 if (pindex > object->
size)
192 object->size = pindex;
193 KASSERT(object->
type == tp,
194 (
"Inconsistent device pager type %p %d",
197 (
"Inconsistent devops %p %p",
object, ops));
208 if (pindex > object->
size)
209 object->size = pindex;
210 KASSERT(object->
type == tp,
211 (
"Inconsistent device pager type %p %d",
object, tp));
214 if (object1 != NULL) {
215 object1->
handle = object1;
227 vm_ooffset_t foff,
struct ucred *cred)
231 size, prot, foff, cred));
240 KASSERT((m->oflags &
VPO_UNMANAGED) == 0, (
"unmanaged %p", m));
254 (
"Managed device or page obj %p m %p",
object, m));
255 TAILQ_REMOVE(&object->
un_pager.
devp.devp_pglist, m, plinks.q);
276 while ((m = TAILQ_FIRST(&object->
un_pager.
devp.devp_pglist))
284 object->handle = NULL;
295 KASSERT(count == 1, (
"%s: count %d", __func__, count));
299 error =
object->un_pager.devp.ops->cdev_pg_fault(
object,
300 IDX_TO_OFF(ma[0]->pindex), PROT_READ, &ma[0]);
309 (
"Wrong page type %p %p", ma[0],
object));
326 vm_prot_t max_prot, vm_pindex_t *first, vm_pindex_t *last)
333 fault_type, max_prot, first, last));
341 vm_page_t m_paddr, page;
346 vm_memattr_t memattr, memattr1;
349 memattr =
object->memattr;
353 dev =
object->handle;
354 csw = dev_refthread(dev, &ref);
362 ret = csw->d_mmap(dev, offset, &paddr, prot, &memattr);
364 dev_relthread(dev, ref);
367 "WARNING: dev_pager_getpage: map function returns error %d", ret);
374 (memattr1 = pmap_page_get_memattr(m_paddr)) != memattr) {
380 if ((csw->d_flags & D_MEM) == 0) {
381 printf(
"WARNING: Device driver %s has set "
382 "\"memattr\" inconsistently (drv %u pmap %u).\n",
383 csw->d_name, memattr, memattr1);
414 panic(
"dev_pager_putpage called");
431 vm_ooffset_t foff,
struct ucred *cred, u_short *color)
445 csw = dev_refthread(dev, &ref);
457 for (off = foff; npages--; off += PAGE_SIZE) {
458 if (csw->d_mmap(dev, off, &paddr, (
int)prot, &dummy) != 0) {
459 dev_relthread(dev, ref);
465 dev_relthread(dev, ref);
466 *color = atop(paddr) -
OFF_TO_IDX(off - PAGE_SIZE);
void pmap_remove_all(vm_page_t m)
const struct cdev_pager_ops * ops
struct vm_object::@0::@2 devp
union vm_object::@0 un_pager
vm_object_t vm_object_allocate(objtype_t type, vm_pindex_t size)
void vm_object_deallocate(vm_object_t object)
#define VM_OBJECT_WLOCK(object)
static __inline void vm_object_set_flag(vm_object_t object, u_short bits)
#define VM_OBJECT_WUNLOCK(object)
#define VM_OBJECT_ASSERT_WLOCKED(object)
vm_page_t vm_page_getfake(vm_paddr_t paddr, vm_memattr_t memattr)
void vm_page_replace(vm_page_t mnew, vm_object_t object, vm_pindex_t pindex, vm_page_t mold)
bool vm_page_busy_acquire(vm_page_t m, int allocflags)
void vm_page_putfake(vm_page_t m)
bool vm_page_remove(vm_page_t m)
void vm_page_valid(vm_page_t m)
void vm_page_updatefake(vm_page_t m, vm_paddr_t paddr, vm_memattr_t memattr)
#define VM_ALLOC_WAITFAIL
vm_page_t vm_phys_paddr_to_vm_page(vm_paddr_t pa)