summaryrefslogtreecommitdiffstats
path: root/sys/vm/vm_pager.h
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2011-11-15 14:40:00 +0000
committerkib <kib@FreeBSD.org>2011-11-15 14:40:00 +0000
commit592f1223238de6179ee6857f9d2d18e6f324f235 (patch)
treebc80187ecd08fa2898418366bdecef4675173a45 /sys/vm/vm_pager.h
parent93c04deafa4aca0d9c482c24be71a62584b8589b (diff)
downloadFreeBSD-src-592f1223238de6179ee6857f9d2d18e6f324f235.zip
FreeBSD-src-592f1223238de6179ee6857f9d2d18e6f324f235.tar.gz
Update the device pager interface, while keeping the compatibility
layer for old KPI and KBI. New interface should be used together with d_mmap_single cdevsw method. Device pager can be allocated with the cdev_pager_allocate(9) function, which takes struct cdev_pager_ops, containing constructor/destructor and page fault handler methods supplied by driver. Constructor and destructor, called at the pager allocation and deallocation time, allow the driver to handle per-object private data. The pager handler is called to handle page fault on the vm map entry backed by the driver pager. Driver shall return either the vm_page_t which should be mapped, or error code (which does not cause kernel panic anymore). The page handler interface has a placeholder to specify the access mode causing the fault, but currently PROT_READ is always passed there. Sponsored by: The FreeBSD Foundation Reviewed by: alc MFC after: 1 month
Diffstat (limited to 'sys/vm/vm_pager.h')
-rw-r--r--sys/vm/vm_pager.h14
1 files changed, 14 insertions, 0 deletions
diff --git a/sys/vm/vm_pager.h b/sys/vm/vm_pager.h
index c18719a..c361be8 100644
--- a/sys/vm/vm_pager.h
+++ b/sys/vm/vm_pager.h
@@ -192,5 +192,19 @@ vm_pager_page_unswapped(vm_page_t m)
(*pagertab[m->object->type]->pgo_pageunswapped)(m);
}
+struct cdev_pager_ops {
+ int (*cdev_pg_fault)(vm_object_t vm_obj, vm_ooffset_t offset,
+ int prot, vm_page_t *mres);
+ int (*cdev_pg_ctor)(void *handle, vm_ooffset_t size, vm_prot_t prot,
+ vm_ooffset_t foff, struct ucred *cred, u_short *color);
+ void (*cdev_pg_dtor)(void *handle);
+};
+
+vm_object_t cdev_pager_allocate(void *handle, enum obj_type tp,
+ struct cdev_pager_ops *ops, vm_ooffset_t size, vm_prot_t prot,
+ vm_ooffset_t foff, struct ucred *cred);
+vm_object_t cdev_pager_lookup(void *handle);
+void cdev_pager_free_page(vm_object_t object, vm_page_t m);
+
#endif /* _KERNEL */
#endif /* _VM_PAGER_ */
OpenPOWER on IntegriCloud