summaryrefslogtreecommitdiff
path: root/sys/uvm/uvm_aobj.c
diff options
context:
space:
mode:
authorArtur Grabowski <art@cvs.openbsd.org>2001-11-28 19:28:16 +0000
committerArtur Grabowski <art@cvs.openbsd.org>2001-11-28 19:28:16 +0000
commitcba71608cdd2f0b18c4f6ff86897f18e4c30118a (patch)
treeb92e865b4ac88831d7b112a580bfcf3af96d5ed8 /sys/uvm/uvm_aobj.c
parente6a242c5ac01267b1b262ca9daa51b8ef92c97e2 (diff)
Sync in more uvm from NetBSD. Mostly just cosmetic stuff.
Contains also support for page coloring.
Diffstat (limited to 'sys/uvm/uvm_aobj.c')
-rw-r--r--sys/uvm/uvm_aobj.c99
1 files changed, 52 insertions, 47 deletions
diff --git a/sys/uvm/uvm_aobj.c b/sys/uvm/uvm_aobj.c
index 0d7d7c3aa3f..924769d66bf 100644
--- a/sys/uvm/uvm_aobj.c
+++ b/sys/uvm/uvm_aobj.c
@@ -1,5 +1,5 @@
-/* $OpenBSD: uvm_aobj.c,v 1.22 2001/11/28 13:47:39 art Exp $ */
-/* $NetBSD: uvm_aobj.c,v 1.40 2001/03/10 22:46:47 chs Exp $ */
+/* $OpenBSD: uvm_aobj.c,v 1.23 2001/11/28 19:28:14 art Exp $ */
+/* $NetBSD: uvm_aobj.c,v 1.45 2001/06/23 20:52:03 chs Exp $ */
/*
* Copyright (c) 1998 Chuck Silvers, Charles D. Cranor and
@@ -174,7 +174,7 @@ static boolean_t uao_flush __P((struct uvm_object *,
voff_t, voff_t, int));
static void uao_free __P((struct uvm_aobj *));
static int uao_get __P((struct uvm_object *, voff_t,
- vm_page_t *, int *, int,
+ struct vm_page **, int *, int,
vm_prot_t, int, int));
static boolean_t uao_releasepg __P((struct vm_page *,
struct vm_page **));
@@ -183,7 +183,7 @@ static boolean_t uao_pagein_page __P((struct uvm_aobj *, int));
/*
* aobj_pager
- *
+ *
* note that some functions (e.g. put) are handled elsewhere
*/
@@ -205,7 +205,7 @@ struct uvm_pagerops aobj_pager = {
*/
static LIST_HEAD(aobjlist, uvm_aobj) uao_list;
-static simple_lock_data_t uao_list_lock;
+static struct simplelock uao_list_lock;
/*
@@ -233,38 +233,41 @@ uao_find_swhash_elt(aobj, pageidx, create)
struct uao_swhash_elt *elt;
voff_t page_tag;
- swhash = UAO_SWHASH_HASH(aobj, pageidx); /* first hash to get bucket */
- page_tag = UAO_SWHASH_ELT_TAG(pageidx); /* tag to search for */
+ swhash = UAO_SWHASH_HASH(aobj, pageidx);
+ page_tag = UAO_SWHASH_ELT_TAG(pageidx);
/*
* now search the bucket for the requested tag
*/
+
LIST_FOREACH(elt, swhash, list) {
- if (elt->tag == page_tag)
- return(elt);
+ if (elt->tag == page_tag) {
+ return elt;
+ }
}
-
- /* fail now if we are not allowed to create a new entry in the bucket */
- if (!create)
+ if (!create) {
return NULL;
-
+ }
/*
* allocate a new entry for the bucket and init/insert it in
*/
- elt = pool_get(&uao_swhash_elt_pool, PR_WAITOK);
+
+ elt = pool_get(&uao_swhash_elt_pool, PR_NOWAIT);
+ if (elt == NULL) {
+ return NULL;
+ }
LIST_INSERT_HEAD(swhash, elt, list);
elt->tag = page_tag;
elt->count = 0;
memset(elt->slots, 0, sizeof(elt->slots));
-
- return(elt);
+ return elt;
}
/*
* uao_find_swslot: find the swap slot number for an aobj/pageidx
*
- * => object must be locked by caller
+ * => object must be locked by caller
*/
__inline static int
uao_find_swslot(aobj, pageidx)
@@ -293,7 +296,7 @@ uao_find_swslot(aobj, pageidx)
return(0);
}
- /*
+ /*
* otherwise, look in the array
*/
return(aobj->u_swslots[pageidx]);
@@ -304,6 +307,8 @@ uao_find_swslot(aobj, pageidx)
*
* => setting a slot to zero frees the slot
* => object must be locked by caller
+ * => we return the old slot number, or -1 if we failed to allocate
+ * memory to record the new slot number
*/
int
uao_set_swslot(uobj, pageidx, slot)
@@ -311,6 +316,7 @@ uao_set_swslot(uobj, pageidx, slot)
int pageidx, slot;
{
struct uvm_aobj *aobj = (struct uvm_aobj *)uobj;
+ struct uao_swhash_elt *elt;
int oldslot;
UVMHIST_FUNC("uao_set_swslot"); UVMHIST_CALLED(pdhist);
UVMHIST_LOG(pdhist, "aobj %p pageidx %d slot %d",
@@ -342,11 +348,9 @@ uao_set_swslot(uobj, pageidx, slot)
* we are freeing.
*/
- struct uao_swhash_elt *elt =
- uao_find_swhash_elt(aobj, pageidx, slot ? TRUE : FALSE);
+ elt = uao_find_swhash_elt(aobj, pageidx, slot ? TRUE : FALSE);
if (elt == NULL) {
- KASSERT(slot == 0);
- return (0);
+ return slot ? -1 : 0;
}
oldslot = UAO_SWHASH_ELT_PAGESLOT(elt, pageidx);
@@ -361,8 +365,8 @@ uao_set_swslot(uobj, pageidx, slot)
if (slot) {
if (oldslot == 0)
elt->count++;
- } else { /* freeing slot ... */
- if (oldslot) /* to be safe */
+ } else {
+ if (oldslot)
elt->count--;
if (elt->count == 0) {
@@ -370,7 +374,7 @@ uao_set_swslot(uobj, pageidx, slot)
pool_put(&uao_swhash_elt_pool, elt);
}
}
- } else {
+ } else {
/* we are using an array */
oldslot = aobj->u_swslots[pageidx];
aobj->u_swslots[pageidx] = slot;
@@ -626,7 +630,7 @@ uao_reference_locked(uobj)
return;
uobj->uo_refs++; /* bump! */
- UVMHIST_LOG(maphist, "<- done (uobj=0x%x, ref = %d)",
+ UVMHIST_LOG(maphist, "<- done (uobj=0x%x, ref = %d)",
uobj, uobj->uo_refs,0,0);
}
@@ -659,7 +663,7 @@ uao_detach_locked(uobj)
struct uvm_object *uobj;
{
struct uvm_aobj *aobj = (struct uvm_aobj *)uobj;
- struct vm_page *pg;
+ struct vm_page *pg, *nextpg;
boolean_t busybody;
UVMHIST_FUNC("uao_detach"); UVMHIST_CALLED(maphist);
@@ -691,9 +695,8 @@ uao_detach_locked(uobj)
* mark for release any that are.
*/
busybody = FALSE;
- for (pg = TAILQ_FIRST(&uobj->memq);
- pg != NULL;
- pg = TAILQ_NEXT(pg, listq)) {
+ for (pg = TAILQ_FIRST(&uobj->memq); pg != NULL; pg = nextpg) {
+ nextpg = TAILQ_NEXT(pg, listq);
if (pg->flags & PG_BUSY) {
pg->flags |= PG_RELEASED;
busybody = TRUE;
@@ -861,7 +864,7 @@ uao_flush(uobj, start, stop, flags)
if (pp == NULL)
continue;
}
-
+
switch (flags & (PGO_CLEANIT|PGO_FREE|PGO_DEACTIVATE)) {
/*
* XXX In these first 3 cases, we always just
@@ -955,7 +958,7 @@ uao_get(uobj, offset, pps, npagesp, centeridx, access_type, advice, flags)
{
struct uvm_aobj *aobj = (struct uvm_aobj *)uobj;
voff_t current_offset;
- vm_page_t ptmp;
+ struct vm_page *ptmp;
int lcv, gotpages, maxpages, swslot, rv, pageidx;
boolean_t done;
UVMHIST_FUNC("uao_get"); UVMHIST_CALLED(pdhist);
@@ -1014,7 +1017,7 @@ uao_get(uobj, offset, pps, npagesp, centeridx, access_type, advice, flags)
if (lcv == centeridx ||
(flags & PGO_ALLPAGES) != 0)
/* need to do a wait or I/O! */
- done = FALSE;
+ done = FALSE;
continue;
}
@@ -1023,7 +1026,7 @@ uao_get(uobj, offset, pps, npagesp, centeridx, access_type, advice, flags)
* result array
*/
/* caller must un-busy this page */
- ptmp->flags |= PG_BUSY;
+ ptmp->flags |= PG_BUSY;
UVM_PAGE_OWN(ptmp, "uao_get1");
pps[lcv] = ptmp;
gotpages++;
@@ -1040,7 +1043,7 @@ uao_get(uobj, offset, pps, npagesp, centeridx, access_type, advice, flags)
*npagesp = gotpages;
if (done)
/* bingo! */
- return(0);
+ return(0);
else
/* EEK! Need to unlock and I/O */
return(EBUSY);
@@ -1100,7 +1103,7 @@ uao_get(uobj, offset, pps, npagesp, centeridx, access_type, advice, flags)
uvm_wait("uao_getpage");
simple_lock(&uobj->vmobjlock);
/* goto top of pps while loop */
- continue;
+ continue;
}
/*
@@ -1109,7 +1112,7 @@ uao_get(uobj, offset, pps, npagesp, centeridx, access_type, advice, flags)
*/
ptmp->pqflags |= PQ_AOBJ;
- /*
+ /*
* got new page ready for I/O. break pps while
* loop. pps[lcv] is still NULL.
*/
@@ -1127,8 +1130,8 @@ uao_get(uobj, offset, pps, npagesp, centeridx, access_type, advice, flags)
simple_lock(&uobj->vmobjlock);
continue; /* goto top of pps while loop */
}
-
- /*
+
+ /*
* if we get here then the page has become resident and
* unbusy between steps 1 and 2. we busy it now (so we
* own it) and set pps[lcv] (so that we exit the while
@@ -1148,7 +1151,7 @@ uao_get(uobj, offset, pps, npagesp, centeridx, access_type, advice, flags)
continue; /* next lcv */
/*
- * we have a "fake/busy/clean" page that we just allocated.
+ * we have a "fake/busy/clean" page that we just allocated.
* do the needed "i/o", either reading from swap or zeroing.
*/
swslot = uao_find_swslot(aobj, pageidx);
@@ -1192,7 +1195,9 @@ uao_get(uobj, offset, pps, npagesp, centeridx, access_type, advice, flags)
*/
swslot = uao_set_swslot(&aobj->u_obj, pageidx,
SWSLOT_BAD);
- uvm_swap_markbad(swslot, 1);
+ if (swslot != -1) {
+ uvm_swap_markbad(swslot, 1);
+ }
ptmp->flags &= ~(PG_WANTED|PG_BUSY);
UVM_PAGE_OWN(ptmp, NULL);
@@ -1205,10 +1210,10 @@ uao_get(uobj, offset, pps, npagesp, centeridx, access_type, advice, flags)
}
}
- /*
+ /*
* we got the page! clear the fake flag (indicates valid
* data now in page) and plug into our result array. note
- * that page is still busy.
+ * that page is still busy.
*
* it is the callers job to:
* => check if the page is released
@@ -1233,7 +1238,7 @@ uao_get(uobj, offset, pps, npagesp, centeridx, access_type, advice, flags)
/*
* uao_releasepg: handle released page in an aobj
- *
+ *
* => "pg" is a PG_BUSY [caller owns it], PG_RELEASED page that we need
* to dispose of.
* => caller must handle PG_WANTED case
@@ -1294,7 +1299,7 @@ uao_releasepg(pg, nextpgp)
/*
* uao_dropswap: release any swap resources from this aobj page.
- *
+ *
* => aobj must be locked or have a reference count of 0.
*/
@@ -1314,7 +1319,7 @@ uao_dropswap(uobj, pageidx)
/*
* page in every page in every aobj that is paged-out to a range of swslots.
- *
+ *
* => nothing should be locked.
* => returns TRUE if pagein was aborted due to lack of memory.
*/
@@ -1415,7 +1420,7 @@ restart:
/*
* if the slot isn't in range, skip it.
*/
- if (slot < startslot ||
+ if (slot < startslot ||
slot >= endslot) {
continue;
}