diff options
author | Ted Unangst <tedu@cvs.openbsd.org> | 2013-05-29 22:23:03 +0000 |
---|---|---|
committer | Ted Unangst <tedu@cvs.openbsd.org> | 2013-05-29 22:23:03 +0000 |
commit | b42d72f5ef32bc59dcfee82678a8a07842fe812b (patch) | |
tree | cc20fa0e4adbeb4a17de385e83c30d2f872cbcb8 /sys/uvm | |
parent | d8f3026348aadb2f15214f0cb97e5e2125a6345b (diff) |
uvm_loan has not (ever) been compiled or used.
Diffstat (limited to 'sys/uvm')
-rw-r--r-- | sys/uvm/uvm.h | 3 | ||||
-rw-r--r-- | sys/uvm/uvm_loan.c | 719 | ||||
-rw-r--r-- | sys/uvm/uvm_loan.h | 60 |
3 files changed, 1 insertions, 781 deletions
diff --git a/sys/uvm/uvm.h b/sys/uvm/uvm.h index c236fb421a9..14dac14dde2 100644 --- a/sys/uvm/uvm.h +++ b/sys/uvm/uvm.h @@ -1,4 +1,4 @@ -/* $OpenBSD: uvm.h,v 1.47 2012/03/09 13:01:29 ariane Exp $ */ +/* $OpenBSD: uvm.h,v 1.48 2013/05/29 22:23:01 tedu Exp $ */ /* $NetBSD: uvm.h,v 1.24 2000/11/27 08:40:02 chs Exp $ */ /* @@ -49,7 +49,6 @@ #include <uvm/uvm_fault.h> #include <uvm/uvm_glue.h> #include <uvm/uvm_km.h> -#include <uvm/uvm_loan.h> #include <uvm/uvm_map.h> #include <uvm/uvm_object.h> #include <uvm/uvm_page.h> diff --git a/sys/uvm/uvm_loan.c b/sys/uvm/uvm_loan.c deleted file mode 100644 index 20af9ad7e63..00000000000 --- a/sys/uvm/uvm_loan.c +++ /dev/null @@ -1,719 +0,0 @@ -/* $OpenBSD: uvm_loan.c,v 1.34 2009/07/22 21:05:37 oga Exp $ */ -/* $NetBSD: uvm_loan.c,v 1.22 2000/06/27 17:29:25 mrg Exp $ */ - -/* - * - * Copyright (c) 1997 Charles D. Cranor and Washington University. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Charles D. Cranor and - * Washington University. - * 4. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * from: Id: uvm_loan.c,v 1.1.6.4 1998/02/06 05:08:43 chs Exp - */ - -/* - * uvm_loan.c: page loanout handler - */ - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/kernel.h> -#include <sys/proc.h> -#include <sys/malloc.h> -#include <sys/mman.h> - -#include <uvm/uvm.h> - -/* - * "loaned" pages are pages which are (read-only, copy-on-write) loaned - * from the VM system to other parts of the kernel. this allows page - * copying to be avoided (e.g. you can loan pages from objs/anons to - * the mbuf system). - * - * there are 3 types of loans possible: - * O->K uvm_object page to wired kernel page (e.g. mbuf data area) - * A->K anon page to wired kernel page (e.g. mbuf data area) - * O->A uvm_object to anon loan (e.g. vnode page to an anon) - * note that it possible to have an O page loaned to both an A and K - * at the same time. - * - * loans are tracked by pg->loan_count. an O->A page will have both - * a uvm_object and a vm_anon, but PQ_ANON will not be set. this sort - * of page is considered "owned" by the uvm_object (not the anon). - * - * each loan of a page to the kernel bumps the pg->wire_count. the - * kernel mappings for these pages will be read-only and wired. since - * the page will also be wired, it will not be a candidate for pageout, - * and thus will never be pmap_page_protect()'d with VM_PROT_NONE. a - * write fault in the kernel to one of these pages will not cause - * copy-on-write. instead, the page fault is considered fatal. this - * is because the kernel mapping will have no way to look up the - * object/anon which the page is owned by. this is a good side-effect, - * since a kernel write to a loaned page is an error. - * - * owners that want to free their pages and discover that they are - * loaned out simply "disown" them (the page becomes an orphan). these - * pages should be freed when the last loan is dropped. in some cases - * an anon may "adopt" an orphaned page. - * - * locking: to read pg->loan_count either the owner or the page queues - * must be locked. to modify pg->loan_count, both the owner of the page - * and the PQs must be locked. pg->flags is (as always) locked by - * the owner of the page. - * - * note that locking from the "loaned" side is tricky since the object - * getting the loaned page has no reference to the page's owner and thus - * the owner could "die" at any time. in order to prevent the owner - * from dying the page queues should be locked. this forces us to sometimes - * use "try" locking. - * - * loans are typically broken by the following events: - * 1. write fault to a loaned page - * 2. pageout of clean+inactive O->A loaned page - * 3. owner frees page (e.g. pager flush) - * - * note that loaning a page causes all mappings of the page to become - * read-only (via pmap_page_protect). this could have an unexpected - * effect on normal "wired" pages if one is not careful (XXX). - */ - -/* - * local prototypes - */ - -static int uvm_loananon(struct uvm_faultinfo *, void ***, - int, struct vm_anon *); -static int uvm_loanentry(struct uvm_faultinfo *, void ***, int); -static int uvm_loanuobj(struct uvm_faultinfo *, void ***, - int, vaddr_t); -static int uvm_loanzero(struct uvm_faultinfo *, void ***, int); - -/* - * inlines - */ - -/* - * uvm_loanentry: loan out pages in a map entry (helper fn for uvm_loan()) - * - * => "ufi" is the result of a successful map lookup (meaning that - * the maps are locked by the caller) - * => we may unlock the maps if needed (for I/O) - * => we put our output result in "output" - * => we return the number of pages we loaned, or -1 if we had an error - */ - -static __inline int -uvm_loanentry(struct uvm_faultinfo *ufi, void ***output, int flags) -{ - vaddr_t curaddr = ufi->orig_rvaddr; - vsize_t togo = ufi->size; - struct vm_aref *aref = &ufi->entry->aref; - struct uvm_object *uobj = ufi->entry->object.uvm_obj; - struct vm_anon *anon; - int rv, result = 0; - - /* - * lock us the rest of the way down - */ - if (uobj) - simple_lock(&uobj->vmobjlock); - - /* - * loop until done - */ - while (togo) { - - /* - * find the page we want. check the anon layer first. - */ - - if (aref->ar_amap) { - anon = amap_lookup(aref, curaddr - ufi->entry->start); - } else { - anon = NULL; - } - - if (anon) { - rv = uvm_loananon(ufi, output, flags, anon); - } else if (uobj) { - rv = uvm_loanuobj(ufi, output, flags, curaddr); - } else if (UVM_ET_ISCOPYONWRITE(ufi->entry)) { - rv = uvm_loanzero(ufi, output, flags); - } else { - rv = -1; /* null map entry... fail now */ - } - - /* total failure */ - if (rv < 0) - return(-1); - - /* relock failed, need to do another lookup */ - if (rv == 0) - return(result); - - /* - * got it... advance to next page - */ - result++; - togo -= PAGE_SIZE; - curaddr += PAGE_SIZE; - } - - /* - * unlock everything and return - */ - uvmfault_unlockall(ufi, aref->ar_amap, uobj, NULL); - return(result); -} - -/* - * normal functions - */ - -/* - * uvm_loan: loan pages out to anons or to the kernel - * - * => map should be unlocked - * => start and len should be multiples of PAGE_SIZE - * => result is either an array of anon's or vm_pages (depending on flags) - * => flag values: UVM_LOAN_TOANON - loan to anons - * UVM_LOAN_TOPAGE - loan to wired kernel page - * one and only one of these flags must be set! - */ - -int -uvm_loan(struct vm_map *map, vaddr_t start, vsize_t len, - void **result, int flags) -{ - struct uvm_faultinfo ufi; - void **output; - int rv; - -#ifdef DIAGNOSTIC - if (map->flags & VM_MAP_INTRSAFE) - panic("uvm_loan: intrsafe map"); -#endif - - /* - * ensure that one and only one of the flags is set - */ - - if ((flags & (UVM_LOAN_TOANON|UVM_LOAN_TOPAGE)) == - (UVM_LOAN_TOANON|UVM_LOAN_TOPAGE) || - (flags & (UVM_LOAN_TOANON|UVM_LOAN_TOPAGE)) == 0) - return (EFAULT); - - /* - * "output" is a pointer to the current place to put the loaned - * page... - */ - - output = &result[0]; /* start at the beginning ... */ - - /* - * while we've got pages to do - */ - - while (len > 0) { - - /* - * fill in params for a call to uvmfault_lookup - */ - - ufi.orig_map = map; - ufi.orig_rvaddr = start; - ufi.orig_size = len; - - /* - * do the lookup, the only time this will fail is if we hit on - * an unmapped region (an error) - */ - - if (!uvmfault_lookup(&ufi, FALSE)) - goto fail; - - /* - * map now locked. now do the loanout... - */ - rv = uvm_loanentry(&ufi, &output, flags); - if (rv < 0) - goto fail; - - /* - * done! the map is unlocked. advance, if possible. - * - * XXXCDC: could be recoded to hold the map lock with - * smarter code (but it only happens on map entry - * boundaries, so it isn't that bad). - */ - if (rv) { - rv <<= PAGE_SHIFT; - len -= rv; - start += rv; - } - } - - /* - * got it! return success. - */ - - return (0); - -fail: - /* - * fail: failed to do it. drop our loans and return failure code. - */ - if (output - result) { - if (flags & UVM_LOAN_TOANON) - uvm_unloananon((struct vm_anon **)result, - output - result); - else - uvm_unloanpage((struct vm_page **)result, - output - result); - } - return (EFAULT); -} - -/* - * uvm_loananon: loan a page from an anon out - * - * => return value: - * -1 = fatal error, everything is unlocked, abort. - * 0 = lookup in ufi went stale, everything unlocked, relookup and - * try again - * 1 = got it, everything still locked - */ - -int -uvm_loananon(struct uvm_faultinfo *ufi, void ***output, int flags, - struct vm_anon *anon) -{ - struct vm_page *pg; - int result; - - /* - * if we are loaning to another anon then it is easy, we just - * bump the reference count on the current anon and return a - * pointer to it. - */ - if (flags & UVM_LOAN_TOANON) { - simple_lock(&anon->an_lock); - pg = anon->an_page; - if (pg && (pg->pg_flags & PQ_ANON) != 0 && anon->an_ref == 1) - /* read protect it */ - pmap_page_protect(pg, VM_PROT_READ); - anon->an_ref++; - **output = anon; - *output = (*output) + 1; - simple_unlock(&anon->an_lock); - return(1); - } - - /* - * we are loaning to a kernel-page. we need to get the page - * resident so we can wire it. uvmfault_anonget will handle - * this for us. - */ - - simple_lock(&anon->an_lock); - result = uvmfault_anonget(ufi, ufi->entry->aref.ar_amap, anon); - - /* - * if we were unable to get the anon, then uvmfault_anonget has - * unlocked everything and returned an error code. - */ - - if (result != VM_PAGER_OK) { - - /* need to refault (i.e. refresh our lookup) ? */ - if (result == VM_PAGER_REFAULT) - return(0); - - /* "try again"? sleep a bit and retry ... */ - if (result == VM_PAGER_AGAIN) { - tsleep((caddr_t)&lbolt, PVM, "loanagain", 0); - return(0); - } - - /* otherwise flag it as an error */ - return(-1); - } - - /* - * we have the page and its owner locked: do the loan now. - */ - - pg = anon->an_page; - uvm_lock_pageq(); - if (pg->loan_count == 0) - pmap_page_protect(pg, VM_PROT_READ); - pg->loan_count++; - uvm_pagewire(pg); /* always wire it */ - uvm_unlock_pageq(); - **output = pg; - *output = (*output) + 1; - - /* unlock anon and return success */ - if (pg->uobject) - simple_unlock(&pg->uobject->vmobjlock); - simple_unlock(&anon->an_lock); - return(1); -} - -/* - * uvm_loanuobj: loan a page from a uobj out - * - * => return value: - * -1 = fatal error, everything is unlocked, abort. - * 0 = lookup in ufi went stale, everything unlocked, relookup and - * try again - * 1 = got it, everything still locked - */ - -int -uvm_loanuobj(struct uvm_faultinfo *ufi, void ***output, int flags, vaddr_t va) -{ - struct vm_amap *amap = ufi->entry->aref.ar_amap; - struct uvm_object *uobj = ufi->entry->object.uvm_obj; - struct vm_page *pg; - struct vm_anon *anon; - int result, npages; - boolean_t locked; - - /* - * first we must make sure the page is resident. - * - * XXXCDC: duplicate code with uvm_fault(). - */ - - if (uobj->pgops->pgo_get) { - npages = 1; - pg = NULL; - result = uobj->pgops->pgo_get(uobj, va - ufi->entry->start, - &pg, &npages, 0, VM_PROT_READ, MADV_NORMAL, PGO_LOCKED); - } else { - result = VM_PAGER_ERROR; - } - - /* - * check the result of the locked pgo_get. if there is a problem, - * then we fail the loan. - */ - - if (result != VM_PAGER_OK && result != VM_PAGER_UNLOCK) { - uvmfault_unlockall(ufi, amap, uobj, NULL); - return(-1); - } - - /* - * if we need to unlock for I/O, do so now. - */ - - if (result == VM_PAGER_UNLOCK) { - uvmfault_unlockall(ufi, amap, NULL, NULL); - - npages = 1; - /* locked: uobj */ - result = uobj->pgops->pgo_get(uobj, va - ufi->entry->start, - &pg, &npages, 0, VM_PROT_READ, MADV_NORMAL, 0); - /* locked: <nothing> */ - - /* - * check for errors - */ - - if (result != VM_PAGER_OK) { - if (result == VM_PAGER_AGAIN) { - tsleep((caddr_t)&lbolt, PVM, "fltagain2", 0); - return(0); /* redo the lookup and try again */ - } - return(-1); /* total failure */ - } - - /* - * pgo_get was a success. attempt to relock everything. - */ - - locked = uvmfault_relock(ufi); - simple_lock(&uobj->vmobjlock); - - /* - * Re-verify that amap slot is still free. if there is a - * problem we drop our lock (thus force a lookup refresh/retry). - */ - - if (locked && amap && amap_lookup(&ufi->entry->aref, - ufi->orig_rvaddr - ufi->entry->start)) { - - if (locked) - uvmfault_unlockall(ufi, amap, NULL, NULL); - locked = FALSE; - } - - /* - * didn't get the lock? release the page and retry. - */ - - if (locked == FALSE) { - - if (pg->pg_flags & PG_WANTED) - /* still holding object lock */ - wakeup(pg); - - uvm_lock_pageq(); - uvm_pageactivate(pg); /* make sure it is in queues */ - uvm_unlock_pageq(); - atomic_clearbits_int(&pg->pg_flags, PG_BUSY|PG_WANTED); - UVM_PAGE_OWN(pg, NULL); - simple_unlock(&uobj->vmobjlock); - return (0); - } - } - - /* - * at this point we have the page we want ("pg") marked PG_BUSY for us - * and we have all data structures locked. do the loanout. - */ - - if ((flags & UVM_LOAN_TOANON) == 0) { /* loan to wired-kernel page? */ - uvm_lock_pageq(); - if (pg->loan_count == 0) - pmap_page_protect(pg, VM_PROT_READ); - pg->loan_count++; - uvm_pagewire(pg); - uvm_unlock_pageq(); - **output = pg; - *output = (*output) + 1; - if (pg->pg_flags & PG_WANTED) - wakeup(pg); - atomic_clearbits_int(&pg->pg_flags, PG_WANTED|PG_BUSY); - UVM_PAGE_OWN(pg, NULL); - return(1); /* got it! */ - } - - /* - * must be a loan to an anon. check to see if there is already - * an anon associated with this page. if so, then just return - * a reference to this object. the page should already be - * mapped read-only because it is already on loan. - */ - - if (pg->uanon) { - anon = pg->uanon; - simple_lock(&anon->an_lock); - anon->an_ref++; - simple_unlock(&anon->an_lock); - **output = anon; - *output = (*output) + 1; - uvm_lock_pageq(); - uvm_pageactivate(pg); /* reactivate */ - uvm_unlock_pageq(); - if (pg->pg_flags & PG_WANTED) - wakeup(pg); - atomic_clearbits_int(&pg->pg_flags, PG_WANTED|PG_BUSY); - UVM_PAGE_OWN(pg, NULL); - return(1); - } - - /* - * need to allocate a new anon - */ - - anon = uvm_analloc(); - if (anon == NULL) { /* out of VM! */ - if (pg->pg_flags & PG_WANTED) - wakeup(pg); - atomic_clearbits_int(&pg->pg_flags, PG_WANTED|PG_BUSY); - UVM_PAGE_OWN(pg, NULL); - uvmfault_unlockall(ufi, amap, uobj, NULL); - return(-1); - } - anon->an_page = pg; - pg->uanon = anon; - uvm_lock_pageq(); - if (pg->loan_count == 0) - pmap_page_protect(pg, VM_PROT_READ); - pg->loan_count++; - uvm_pageactivate(pg); - uvm_unlock_pageq(); - **output = anon; - *output = (*output) + 1; - if (pg->pg_flags & PG_WANTED) - wakeup(pg); - atomic_clearbits_int(&pg->pg_flags, PG_WANTED|PG_BUSY); - UVM_PAGE_OWN(pg, NULL); - return(1); -} - -/* - * uvm_loanzero: "loan" a zero-fill page out - * - * => return value: - * -1 = fatal error, everything is unlocked, abort. - * 0 = lookup in ufi went stale, everything unlocked, relookup and - * try again - * 1 = got it, everything still locked - */ - -int -uvm_loanzero(struct uvm_faultinfo *ufi, void ***output, int flags) -{ - struct vm_anon *anon; - struct vm_page *pg; - - if ((flags & UVM_LOAN_TOANON) == 0) { /* loaning to kernel-page */ - - while ((pg = uvm_pagealloc(NULL, 0, NULL, - UVM_PGA_ZERO)) == NULL) { - uvmfault_unlockall(ufi, ufi->entry->aref.ar_amap, - ufi->entry->object.uvm_obj, NULL); - uvm_wait("loanzero1"); - if (!uvmfault_relock(ufi)) - return(0); - if (ufi->entry->object.uvm_obj) - simple_lock( - &ufi->entry->object.uvm_obj->vmobjlock); - /* ... and try again */ - } - - /* got a zero'd page; return */ - atomic_clearbits_int(&pg->pg_flags, PG_BUSY|PG_FAKE); - UVM_PAGE_OWN(pg, NULL); - **output = pg; - *output = (*output) + 1; - uvm_lock_pageq(); - /* wire it as we are loaning to kernel-page */ - uvm_pagewire(pg); - pg->loan_count = 1; - uvm_unlock_pageq(); - return(1); - } - - /* loaning to an anon */ - while ((anon = uvm_analloc()) == NULL || - (pg = uvm_pagealloc(NULL, 0, anon, UVM_PGA_ZERO)) == NULL) { - - /* unlock everything */ - uvmfault_unlockall(ufi, ufi->entry->aref.ar_amap, - ufi->entry->object.uvm_obj, NULL); - - /* out of swap causes us to fail */ - if (anon == NULL) - return(-1); - - uvm_anfree(anon); - uvm_wait("loanzero2"); /* wait for pagedaemon */ - - if (!uvmfault_relock(ufi)) - /* map changed while unlocked, need relookup */ - return (0); - - /* relock everything else */ - if (ufi->entry->object.uvm_obj) - simple_lock(&ufi->entry->object.uvm_obj->vmobjlock); - /* ... and try again */ - } - - /* got a zero'd page; return */ - atomic_clearbits_int(&pg->pg_flags, PG_BUSY|PG_FAKE); - UVM_PAGE_OWN(pg, NULL); - uvm_lock_pageq(); - uvm_pageactivate(pg); - uvm_unlock_pageq(); - **output = anon; - *output = (*output) + 1; - return(1); -} - - -/* - * uvm_unloananon: kill loans on anons (basically a normal ref drop) - * - * => we expect all our resources to be unlocked - */ - -void -uvm_unloananon(struct vm_anon **aloans, int nanons) -{ - struct vm_anon *anon; - - while (nanons-- > 0) { - int refs; - - anon = *aloans++; - simple_lock(&anon->an_lock); - refs = --anon->an_ref; - simple_unlock(&anon->an_lock); - - if (refs == 0) { - uvm_anfree(anon); /* last reference: kill anon */ - } - } -} - -/* - * uvm_unloanpage: kill loans on pages loaned out to the kernel - * - * => we expect all our resources to be unlocked - */ - -void -uvm_unloanpage(struct vm_page **ploans, int npages) -{ - struct vm_page *pg; - - uvm_lock_pageq(); - - while (npages-- > 0) { - pg = *ploans++; - - if (pg->loan_count < 1) - panic("uvm_unloanpage: page %p isn't loaned", pg); - - pg->loan_count--; /* drop loan */ - uvm_pageunwire(pg); /* and wire */ - - /* - * if page is unowned and we killed last loan, then we can - * free it - */ - if (pg->loan_count == 0 && pg->uobject == NULL && - pg->uanon == NULL) { - - if (pg->pg_flags & PG_BUSY) - panic("uvm_unloanpage: page %p unowned but PG_BUSY!", pg); - - /* be safe */ - pmap_page_protect(pg, VM_PROT_NONE); - uvm_pagefree(pg); /* pageq locked above */ - - } - } - - uvm_unlock_pageq(); -} - diff --git a/sys/uvm/uvm_loan.h b/sys/uvm/uvm_loan.h deleted file mode 100644 index 67ee445d718..00000000000 --- a/sys/uvm/uvm_loan.h +++ /dev/null @@ -1,60 +0,0 @@ -/* $OpenBSD: uvm_loan.h,v 1.7 2002/03/14 01:27:18 millert Exp $ */ -/* $NetBSD: uvm_loan.h,v 1.7 1999/06/21 17:25:11 thorpej Exp $ */ - -/* - * - * Copyright (c) 1997 Charles D. Cranor and Washington University. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Charles D. Cranor and - * Washington University. - * 4. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * from: Id: uvm_loan.h,v 1.1.4.1 1997/12/08 16:07:14 chuck Exp - */ - -#ifndef _UVM_UVM_LOAN_H_ -#define _UVM_UVM_LOAN_H_ - -#ifdef _KERNEL - -/* - * flags for uvm_loan - */ - -#define UVM_LOAN_TOANON 0x1 /* loan to anon */ -#define UVM_LOAN_TOPAGE 0x2 /* loan to page */ - -/* - * loan prototypes - */ - -int uvm_loan(struct vm_map *, vaddr_t, vsize_t, void **, int); -void uvm_unloananon(struct vm_anon **, int); -void uvm_unloanpage(struct vm_page **, int); - -#endif /* _KERNEL */ - -#endif /* _UVM_UVM_LOAN_H_ */ |