Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F152015704
D36978.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
3 KB
Referenced Files
None
Subscribers
None
D36978.diff
View Options
diff --git a/sys/vm/swap_pager.c b/sys/vm/swap_pager.c
--- a/sys/vm/swap_pager.c
+++ b/sys/vm/swap_pager.c
@@ -482,7 +482,8 @@
/*
* Metadata functions
*/
-static daddr_t swp_pager_meta_build(vm_object_t, vm_pindex_t, daddr_t);
+static void swp_pager_meta_build(vm_object_t object, vm_pindex_t pindex,
+ daddr_t swapblk, daddr_t *s_free, daddr_t *n_free);
static void swp_pager_meta_free(vm_object_t, vm_pindex_t, vm_pindex_t);
static void swp_pager_meta_transfer(vm_object_t src, vm_object_t dst,
vm_pindex_t pindex, vm_pindex_t count);
@@ -998,7 +999,7 @@
int
swap_pager_reserve(vm_object_t object, vm_pindex_t start, vm_pindex_t size)
{
- daddr_t addr, blk, n_free, s_free;
+ daddr_t blk, n_free, s_free;
vm_pindex_t i, j;
int n;
@@ -1013,11 +1014,8 @@
return (-1);
}
for (j = 0; j < n; ++j) {
- addr = swp_pager_meta_build(object,
- start + i + j, blk + j);
- if (addr != SWAPBLK_NONE)
- swp_pager_update_freerange(&s_free, &n_free,
- addr);
+ swp_pager_meta_build(object, start + i + j, blk + j,
+ &s_free, &n_free);
}
}
swp_pager_freeswapspace(s_free, n_free);
@@ -1029,8 +1027,6 @@
swp_pager_xfer_source(vm_object_t srcobject, vm_object_t dstobject,
vm_pindex_t pindex, daddr_t addr)
{
- daddr_t dstaddr __diagused;
-
KASSERT((srcobject->flags & OBJ_SWAP) != 0,
("%s: srcobject not swappable", __func__));
KASSERT((dstobject->flags & OBJ_SWAP) != 0,
@@ -1046,9 +1042,7 @@
* swp_pager_meta_build() can sleep.
*/
VM_OBJECT_WUNLOCK(srcobject);
- dstaddr = swp_pager_meta_build(dstobject, pindex, addr);
- KASSERT(dstaddr == SWAPBLK_NONE,
- ("Unexpected destination swapblk"));
+ swp_pager_meta_build(dstobject, pindex, addr, NULL, NULL);
VM_OBJECT_WLOCK(srcobject);
return (true);
@@ -1474,7 +1468,7 @@
int flags, int *rtvals)
{
struct buf *bp;
- daddr_t addr, blk, n_free, s_free;
+ daddr_t blk, n_free, s_free;
vm_page_t mreq;
int i, j, n;
bool async;
@@ -1520,11 +1514,8 @@
for (j = 0; j < n; ++j) {
mreq = ma[i + j];
vm_page_aflag_clear(mreq, PGA_SWAP_FREE);
- addr = swp_pager_meta_build(mreq->object, mreq->pindex,
- blk + j);
- if (addr != SWAPBLK_NONE)
- swp_pager_update_freerange(&s_free, &n_free,
- addr);
+ swp_pager_meta_build(mreq->object, mreq->pindex,
+ blk + j, &s_free, &n_free);
MPASS(mreq->dirty == VM_PAGE_BITS_ALL);
mreq->oflags |= VPO_SWAPINPROG;
}
@@ -2013,10 +2004,11 @@
*
* The specified swapblk is added to the object's swap metadata. If
* the swapblk is not valid, it is freed instead. Any previously
- * assigned swapblk is returned.
+ * assigned swapblk is added to the provided freerange.
*/
-static daddr_t
-swp_pager_meta_build(vm_object_t object, vm_pindex_t pindex, daddr_t swapblk)
+static void
+swp_pager_meta_build(vm_object_t object, vm_pindex_t pindex, daddr_t swapblk,
+ daddr_t *s_free, daddr_t *n_free)
{
static volatile int swblk_zone_exhausted, swpctrie_zone_exhausted;
struct swblk *sb, *sb1;
@@ -2030,7 +2022,7 @@
sb = SWAP_PCTRIE_LOOKUP(&object->un_pager.swp.swp_blks, rdpi);
if (sb == NULL) {
if (swapblk == SWAPBLK_NONE)
- return (SWAPBLK_NONE);
+ return;
for (;;) {
sb = uma_zalloc(swblk_zone, M_NOWAIT | (curproc ==
pageproc ? M_USE_RESERVE : 0));
@@ -2107,7 +2099,12 @@
*/
if (swapblk == SWAPBLK_NONE)
swp_pager_free_empty_swblk(object, sb);
- return (prev_swapblk);
+
+ if (prev_swapblk != SWAPBLK_NONE) {
+ KASSERT(s_free != NULL && n_free != NULL,
+ ("Unexpected previously-assigned swapblk"));
+ swp_pager_update_freerange(s_free, n_free, prev_swapblk);
+ }
}
/*
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Mon, Apr 13, 2:54 AM (5 h, 55 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
31390485
Default Alt Text
D36978.diff (3 KB)
Attached To
Mode
D36978: swap_pager: Reduce code duplication for swp_page_meta_build callers
Attached
Detach File
Event Timeline
Log In to Comment