diff options
author | kib <kib@FreeBSD.org> | 2011-11-15 14:40:00 +0000 |
---|---|---|
committer | kib <kib@FreeBSD.org> | 2011-11-15 14:40:00 +0000 |
commit | 592f1223238de6179ee6857f9d2d18e6f324f235 (patch) | |
tree | bc80187ecd08fa2898418366bdecef4675173a45 /sys/vm/vm_pager.h | |
parent | 93c04deafa4aca0d9c482c24be71a62584b8589b (diff) | |
download | FreeBSD-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.h | 14 |
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_ */ |