summaryrefslogtreecommitdiffstats
path: root/sys/vm/vm_phys.c
diff options
context:
space:
mode:
authoralc <alc@FreeBSD.org>2007-12-20 22:45:54 +0000
committeralc <alc@FreeBSD.org>2007-12-20 22:45:54 +0000
commit4518d14d23d39aa1ddb90b5fd9e77e2103fd688c (patch)
tree7350b6bba47831c95a732e1b880a7c163e8518a3 /sys/vm/vm_phys.c
parentde6536e34df5d7e1d7c8977b472e693b6f71ef76 (diff)
downloadFreeBSD-src-4518d14d23d39aa1ddb90b5fd9e77e2103fd688c.zip
FreeBSD-src-4518d14d23d39aa1ddb90b5fd9e77e2103fd688c.tar.gz
Modify vm_phys_unfree_page() so that it no longer requires the given
page to be in the free lists. Instead, it now returns TRUE if it removed the page from the free lists and FALSE if the page was not in the free lists. This change is required to support superpage reservations. Specifically, once reservations are introduced, a cached page can either be in the free lists or a reservation.
Diffstat (limited to 'sys/vm/vm_phys.c')
-rw-r--r--sys/vm/vm_phys.c17
1 files changed, 10 insertions, 7 deletions
diff --git a/sys/vm/vm_phys.c b/sys/vm/vm_phys.c
index 0fb685e..a57304b 100644
--- a/sys/vm/vm_phys.c
+++ b/sys/vm/vm_phys.c
@@ -468,7 +468,7 @@ vm_phys_set_pool(int pool, vm_page_t m, int order)
*
* The free page queues must be locked.
*/
-void
+boolean_t
vm_phys_unfree_page(vm_page_t m)
{
struct vm_freelist *fl;
@@ -489,13 +489,15 @@ vm_phys_unfree_page(vm_page_t m)
order < VM_NFREEORDER - 1; ) {
order++;
pa = m->phys_addr & (~(vm_paddr_t)0 << (PAGE_SHIFT + order));
- KASSERT(pa >= seg->start && pa < seg->end,
- ("vm_phys_unfree_page: paddr %#jx is not within segment %p",
- (uintmax_t)pa, seg));
- m_set = &seg->first_page[atop(pa - seg->start)];
+ if (pa >= seg->start && pa < seg->end)
+ m_set = &seg->first_page[atop(pa - seg->start)];
+ else
+ return (FALSE);
}
- KASSERT(m_set->order >= order, ("vm_phys_unfree_page: page %p's order"
- " (%d) is less than expected (%d)", m_set, m_set->order, order));
+ if (m_set->order < order)
+ return (FALSE);
+ if (m_set->order == VM_NFREEORDER)
+ return (FALSE);
KASSERT(m_set->order < VM_NFREEORDER,
("vm_phys_unfree_page: page %p has unexpected order %d",
m_set, m_set->order));
@@ -525,6 +527,7 @@ vm_phys_unfree_page(vm_page_t m)
fl[order].lcnt++;
}
KASSERT(m_set == m, ("vm_phys_unfree_page: fatal inconsistency"));
+ return (TRUE);
}
/*
OpenPOWER on IntegriCloud