svn commit: r311643 - stable/11/sys/vm
Konstantin Belousov
kib at FreeBSD.org
Sat Jan 7 11:48:45 UTC 2017
Author: kib
Date: Sat Jan 7 11:48:44 2017
New Revision: 311643
URL: https://svnweb.freebsd.org/changeset/base/311643
Log:
MFC r310496:
Fix argument type and microoptimize swp_pager_meta_free().
Modified:
stable/11/sys/vm/swap_pager.c
Directory Properties:
stable/11/ (props changed)
Modified: stable/11/sys/vm/swap_pager.c
==============================================================================
--- stable/11/sys/vm/swap_pager.c Sat Jan 7 11:44:41 2017 (r311642)
+++ stable/11/sys/vm/swap_pager.c Sat Jan 7 11:48:44 2017 (r311643)
@@ -410,7 +410,7 @@ static daddr_t swp_pager_getswapspace(in
*/
static struct swblock **swp_pager_hash(vm_object_t object, vm_pindex_t index);
static void swp_pager_meta_build(vm_object_t, vm_pindex_t, daddr_t);
-static void swp_pager_meta_free(vm_object_t, vm_pindex_t, daddr_t);
+static void swp_pager_meta_free(vm_object_t, vm_pindex_t, vm_pindex_t);
static void swp_pager_meta_free_all(vm_object_t);
static daddr_t swp_pager_meta_ctl(vm_object_t, vm_pindex_t, int);
@@ -1866,42 +1866,42 @@ done:
* with resident pages.
*/
static void
-swp_pager_meta_free(vm_object_t object, vm_pindex_t index, daddr_t count)
+swp_pager_meta_free(vm_object_t object, vm_pindex_t index, vm_pindex_t count)
{
+ struct swblock **pswap, *swap;
+ vm_pindex_t c;
+ daddr_t v;
+ int n, sidx;
VM_OBJECT_ASSERT_LOCKED(object);
- if (object->type != OBJT_SWAP)
+ if (object->type != OBJT_SWAP || count == 0)
return;
- while (count > 0) {
- struct swblock **pswap;
- struct swblock *swap;
-
- mtx_lock(&swhash_mtx);
+ mtx_lock(&swhash_mtx);
+ for (c = 0; c < count;) {
pswap = swp_pager_hash(object, index);
-
- if ((swap = *pswap) != NULL) {
- daddr_t v = swap->swb_pages[index & SWAP_META_MASK];
-
- if (v != SWAPBLK_NONE) {
- swp_pager_freeswapspace(v, 1);
- swap->swb_pages[index & SWAP_META_MASK] =
- SWAPBLK_NONE;
- if (--swap->swb_count == 0) {
- *pswap = swap->swb_hnext;
- uma_zfree(swap_zone, swap);
- --object->un_pager.swp.swp_bcount;
- }
+ sidx = index & SWAP_META_MASK;
+ n = SWAP_META_PAGES - sidx;
+ index += n;
+ if ((swap = *pswap) == NULL) {
+ c += n;
+ continue;
+ }
+ for (; c < count && sidx < SWAP_META_PAGES; ++c, ++sidx) {
+ if ((v = swap->swb_pages[sidx]) == SWAPBLK_NONE)
+ continue;
+ swp_pager_freeswapspace(v, 1);
+ swap->swb_pages[sidx] = SWAPBLK_NONE;
+ if (--swap->swb_count == 0) {
+ *pswap = swap->swb_hnext;
+ uma_zfree(swap_zone, swap);
+ --object->un_pager.swp.swp_bcount;
+ c += SWAP_META_PAGES - sidx;
+ break;
}
- --count;
- ++index;
- } else {
- int n = SWAP_META_PAGES - (index & SWAP_META_MASK);
- count -= n;
- index += n;
}
- mtx_unlock(&swhash_mtx);
}
+ mtx_unlock(&swhash_mtx);
}
/*
More information about the svn-src-stable
mailing list