diff options
Diffstat (limited to 'sys/uvm/uvm_page.c')
-rw-r--r-- | sys/uvm/uvm_page.c | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/sys/uvm/uvm_page.c b/sys/uvm/uvm_page.c index 82951d1c99f..a431450748a 100644 --- a/sys/uvm/uvm_page.c +++ b/sys/uvm/uvm_page.c @@ -1,4 +1,4 @@ -/* $OpenBSD: uvm_page.c,v 1.103 2011/04/02 12:38:37 ariane Exp $ */ +/* $OpenBSD: uvm_page.c,v 1.104 2011/04/02 16:47:17 beck Exp $ */ /* $NetBSD: uvm_page.c,v 1.44 2000/11/27 08:40:04 chs Exp $ */ /* @@ -804,6 +804,32 @@ uvm_pagealloc_pg(struct vm_page *pg, struct uvm_object *obj, voff_t off, } /* + * interface used by the buffer cache to allocate a buffer at a time. + * The pages are allocated wired in DMA accessible memory + */ +void +uvm_pagealloc_multi(struct uvm_object *obj, voff_t off, vsize_t size, int flags) +{ + struct pglist plist; + struct vm_page *pg; + int i; + + + TAILQ_INIT(&plist); + (void) uvm_pglistalloc(size, dma_constraint.ucr_low, + dma_constraint.ucr_high, 0, 0, &plist, atop(round_page(size)), + UVM_PLA_WAITOK); + i = 0; + while ((pg = TAILQ_FIRST(&plist)) != NULL) { + pg->wire_count = 1; + atomic_setbits_int(&pg->pg_flags, PG_CLEAN | PG_FAKE); + KASSERT((pg->pg_flags & PG_DEV) == 0); + TAILQ_REMOVE(&plist, pg, pageq); + uvm_pagealloc_pg(pg, obj, off + ptoa(i++), NULL); + } +} + +/* * uvm_pagealloc_strat: allocate vm_page from a particular free list. * * => return null if no pages free |