75#include <sys/kernel.h>
80#include <sys/malloc.h>
81#include <sys/rwlock.h>
95static int pbuf_ctor(
void *,
int,
void *,
int);
96static void pbuf_dtor(
void *,
int,
void *);
100 vm_ooffset_t,
struct ucred *);
116 vm_ooffset_t off,
struct ucred *cred)
124 int flags,
int *rtvals)
128 for (i = 0; i < count; i++)
192 pgops = &pagertab[i];
193 if ((*pgops)->pgo_init != NULL)
194 (*(*pgops)->pgo_init)();
206 sizeof(
struct buf) +
PBUF_PAGES *
sizeof(vm_page_t),
260 vm_prot_t prot, vm_ooffset_t off,
struct ucred *cred)
262 MPASS(type < nitems(pagertab));
264 return ((*pagertab[type]->
pgo_alloc)(handle, size, prot, off, cred));
275 MPASS(object->
type < nitems(pagertab));
276 (*pagertab[
object->type]->pgo_dealloc) (
object);
292 KASSERT(count > 0, (
"%s: 0 count", __func__));
293 for (
int i = 0 ; i < count; i++) {
295 KASSERT(i != 0 && i != count - 1,
296 (
"%s: page %d is the bogus page", __func__, i));
300 KASSERT(!pmap_page_is_mapped(m[i]),
301 (
"%s: page %p is mapped", __func__, m[i]));
302 KASSERT(m[i]->valid != VM_PAGE_BITS_ALL,
303 (
"%s: request for a valid page %p", __func__, m[i]));
304 KASSERT(m[i]->dirty == 0,
305 (
"%s: page %p is dirty", __func__, m[i]));
306 KASSERT(m[i]->
object ==
object,
307 (
"%s: wrong object %p/%p", __func__,
object, m[i]->
object));
308 KASSERT(m[i]->pindex == m[0]->pindex + i,
309 (
"%s: page %p isn't consecutive", __func__, m[i]));
323 vm_pindex_t pindex = m[0]->pindex;
327 MPASS(object->
type < nitems(pagertab));
330 r = (*pagertab[
object->type]->pgo_getpages)(
object, m, count, rbehind,
335 for (
int i = 0; i < count; i++) {
342 (
"%s: mismatch page %p pindex %ju", __func__,
343 m[i], (uintmax_t )pindex - 1));
349 if (m[i]->valid != VM_PAGE_BITS_ALL)
360 MPASS(object->
type < nitems(pagertab));
363 return ((*pagertab[object->
type]->pgo_getpages_async)(
object, m,
364 count, rbehind, rahead, iodone, arg));
384 TAILQ_FOREACH(
object, pg_list, pager_object_list) {
385 if (object->
handle == handle) {
404 MPASS(base_type == -1 ||
405 (base_type >=
OBJT_DEFAULT && base_type < nitems(pagertab)));
407 if (pagertab[res] == NULL)
410 if (res == nitems(pagertab)) {
414 if (base_type != -1) {
415 MPASS(pagertab[base_type] != NULL);
417 if (ops->pgo_##n == NULL) \
418 ops->pgo_##n = pagertab[base_type]->pgo_##n
428 FIX(update_writecount);
429 FIX(release_writecount);
430 FIX(set_writeable_dirty);
447 MPASS(pagertab[type] != NULL);
448 pagertab[type] = NULL;
455 struct buf *bp = mem;
461 bp->b_rcred = NOCRED;
462 bp->b_wcred = NOCRED;
464 bp->b_data = bp->b_kvabase;
466 bp->b_flags = B_MAXPHYS;
470 BUF_LOCK(bp, LK_EXCLUSIVE | LK_NOWAIT, NULL);
478 struct buf *bp = mem;
480 if (bp->b_rcred != NOCRED) {
482 bp->b_rcred = NOCRED;
484 if (bp->b_wcred != NOCRED) {
486 bp->b_wcred = NOCRED;
497 struct buf *bp = mem;
500 if (bp->b_kvabase == NULL)
504 LIST_INIT(&bp->b_dep);
505 bp->b_rcred = bp->b_wcred = NOCRED;
522 KASSERT(bp->b_vp == NULL, (
"pbgetvp: not free"));
523 KASSERT(bp->b_bufobj == NULL, (
"pbgetvp: not free (bufobj)"));
526 bp->b_flags |= B_PAGING;
527 bp->b_bufobj = &vp->v_bufobj;
541 KASSERT(bp->b_vp == NULL, (
"pbgetbo: not free (vnode)"));
542 KASSERT(bp->b_bufobj == NULL, (
"pbgetbo: not free (bufobj)"));
544 bp->b_flags |= B_PAGING;
555 KASSERT(bp->b_vp != NULL, (
"pbrelvp: NULL"));
556 KASSERT(bp->b_bufobj != NULL, (
"pbrelvp: NULL bufobj"));
557 KASSERT((bp->b_xflags & (BX_VNDIRTY | BX_VNCLEAN)) == 0,
558 (
"pbrelvp: pager buf on vnode list."));
562 bp->b_flags &= ~B_PAGING;
572 KASSERT(bp->b_vp == NULL, (
"pbrelbo: vnode"));
573 KASSERT(bp->b_bufobj != NULL, (
"pbrelbo: NULL bufobj"));
574 KASSERT((bp->b_xflags & (BX_VNDIRTY | BX_VNCLEAN)) == 0,
575 (
"pbrelbo: pager buf on vnode list."));
578 bp->b_flags &= ~B_PAGING;
586 MPASS(object->
type < nitems(pagertab));
588 method = pagertab[
object->type]->pgo_set_writeable_dirty;
598 MPASS(object->
type < nitems(pagertab));
600 method = pagertab[
object->type]->pgo_mightbedirty;
603 return (method(
object));
614 MPASS(object->
type < nitems(pagertab));
618 return (pagertab[object->
type]->pgo_kvme_type);
uma_zone_t uma_zsecond_create(const char *name, uma_ctor ctor, uma_dtor dtor, uma_init zinit, uma_fini zfini, uma_zone_t primary)
int uma_zone_set_max(uma_zone_t zone, int nitems)
void uma_prealloc(uma_zone_t zone, int itemcnt)
uma_zone_t uma_zcreate(const char *name, size_t size, uma_ctor ctor, uma_dtor dtor, uma_init uminit, uma_fini fini, int align, uint32_t flags)
vm_offset_t kva_alloc(vm_size_t)
void vm_object_reference_locked(vm_object_t object)
struct vnode * vm_object_vnode(vm_object_t object)
#define VM_OBJECT_ASSERT_UNLOCKED(object)
#define VM_OBJECT_ASSERT_LOCKED(object)
#define VM_OBJECT_WLOCK(object)
#define VM_OBJECT_ASSERT_PAGING(object)
#define VM_OBJECT_WUNLOCK(object)
#define VM_OBJECT_ASSERT_WLOCKED(object)
void vm_page_zero_invalid(vm_page_t m, boolean_t setvalid)
vm_page_t vm_page_relookup(vm_object_t object, vm_pindex_t pindex)
#define vm_page_assert_xbusied(m)