aboutsummaryrefslogtreecommitdiff
path: root/sys/vm/swap_pager.c
diff options
context:
space:
mode:
authorDoug Moore <dougm@FreeBSD.org>2019-11-17 18:38:37 +0000
committerDoug Moore <dougm@FreeBSD.org>2019-11-17 18:38:37 +0000
commitabdab7b633c7b8b3a221659713c068bca81157dd (patch)
treeb5e79194eb4870aec22bc83140b4414a774f4e1b /sys/vm/swap_pager.c
parent8a19cf92cf0f87f1d6d41dda1740a4e13b7ee677 (diff)
downloadsrc-abdab7b633c7b8b3a221659713c068bca81157dd.tar.gz
src-abdab7b633c7b8b3a221659713c068bca81157dd.zip
Add a helper function for testing a swap block and freeing it if empty.
Submitted by: ota_j.email.ne.jp Approved by: alc, kib, dougm Differential Revision: https://reviews.freebsd.org/D22402
Notes
Notes: svn path=/head/; revision=354795
Diffstat (limited to 'sys/vm/swap_pager.c')
-rw-r--r--sys/vm/swap_pager.c29
1 files changed, 19 insertions, 10 deletions
diff --git a/sys/vm/swap_pager.c b/sys/vm/swap_pager.c
index fd614b20d9ee..430d95759088 100644
--- a/sys/vm/swap_pager.c
+++ b/sys/vm/swap_pager.c
@@ -407,6 +407,7 @@ SYSCTL_INT(_vm, OID_AUTO, dmmax, CTLFLAG_RD, &nsw_cluster_max, 0,
static void swp_sizecheck(void);
static void swp_pager_async_iodone(struct buf *bp);
static bool swp_pager_swblk_empty(struct swblk *sb, int start, int limit);
+static void swp_pager_free_empty_swblk(vm_object_t, struct swblk *sb);
static int swapongeom(struct vnode *);
static int swaponvp(struct thread *, struct vnode *, u_long);
static int swapoff_one(struct swdevt *sp, struct ucred *cred);
@@ -1872,6 +1873,21 @@ swp_pager_swblk_empty(struct swblk *sb, int start, int limit)
}
return (true);
}
+
+/*
+ * SWP_PAGER_FREE_EMPTY_SWBLK() - frees if a block is free
+ *
+ * Nothing is done if the block is still in use.
+ */
+static void
+swp_pager_free_empty_swblk(vm_object_t object, struct swblk *sb)
+{
+
+ if (swp_pager_swblk_empty(sb, 0, SWAP_META_PAGES)) {
+ SWAP_PCTRIE_REMOVE(&object->un_pager.swp.swp_blks, sb->p);
+ uma_zfree(swblk_zone, sb);
+ }
+}
/*
* SWP_PAGER_META_BUILD() - add swap block to swap meta data for object
@@ -1990,11 +2006,8 @@ allocated:
/*
* Free the swblk if we end up with the empty page run.
*/
- if (swapblk == SWAPBLK_NONE &&
- swp_pager_swblk_empty(sb, 0, SWAP_META_PAGES)) {
- SWAP_PCTRIE_REMOVE(&object->un_pager.swp.swp_blks, rdpi);
- uma_zfree(swblk_zone, sb);
- }
+ if (swapblk == SWAPBLK_NONE)
+ swp_pager_free_empty_swblk(object, sb);
return (prev_swapblk);
}
@@ -2140,11 +2153,7 @@ swp_pager_meta_ctl(vm_object_t object, vm_pindex_t pindex, int flags)
return (SWAPBLK_NONE);
if ((flags & SWM_POP) != 0) {
sb->d[pindex % SWAP_META_PAGES] = SWAPBLK_NONE;
- if (swp_pager_swblk_empty(sb, 0, SWAP_META_PAGES)) {
- SWAP_PCTRIE_REMOVE(&object->un_pager.swp.swp_blks,
- rounddown(pindex, SWAP_META_PAGES));
- uma_zfree(swblk_zone, sb);
- }
+ swp_pager_free_empty_swblk(object, sb);
}
return (r1);
}