summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJosef 'Jeff' Sipek <josef.sipek@nexenta.com>2015-05-30 11:08:28 -0400
committerAlbert Lee <trisk@omniti.com>2015-06-19 03:06:06 -0400
commit0c833d6473a8b5e01ef9b7bc9ac547c0a016f932 (patch)
treef9ce02e8f34744e7eb830b3bfd368052158f12e6
parent9321cd0436261240311eaac9aad60ee764e089e6 (diff)
downloadillumos-joyent-0c833d6473a8b5e01ef9b7bc9ac547c0a016f932.tar.gz
5973 kmem: double-calling kmem_depot_ws_update isn't obvious
Reviewed by: Marcel Telka <marcel@telka.sk> Reviewed by: Andy Stormont <astormont@racktopsystems.com> Approved by: Albert Lee <trisk@omniti.com>
-rw-r--r--usr/src/uts/common/os/kmem.c31
1 files changed, 19 insertions, 12 deletions
diff --git a/usr/src/uts/common/os/kmem.c b/usr/src/uts/common/os/kmem.c
index cc2f8e7895..4e0f13c3b5 100644
--- a/usr/src/uts/common/os/kmem.c
+++ b/usr/src/uts/common/os/kmem.c
@@ -20,6 +20,7 @@
*/
/*
* Copyright (c) 1994, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright 2015 Nexenta Systems, Inc. All rights reserved.
*/
/*
@@ -2169,6 +2170,21 @@ kmem_depot_ws_update(kmem_cache_t *cp)
}
/*
+ * Set the working set statistics for cp's depot to zero. (Everything is
+ * eligible for reaping.)
+ */
+static void
+kmem_depot_ws_zero(kmem_cache_t *cp)
+{
+ mutex_enter(&cp->cache_depot_lock);
+ cp->cache_full.ml_reaplimit = cp->cache_full.ml_total;
+ cp->cache_full.ml_min = cp->cache_full.ml_total;
+ cp->cache_empty.ml_reaplimit = cp->cache_empty.ml_total;
+ cp->cache_empty.ml_min = cp->cache_empty.ml_total;
+ mutex_exit(&cp->cache_depot_lock);
+}
+
+/*
* Reap all magazines that have fallen out of the depot's working set.
*/
static void
@@ -3238,14 +3254,7 @@ kmem_cache_magazine_purge(kmem_cache_t *cp)
kmem_magazine_destroy(cp, pmp, prounds);
}
- /*
- * Updating the working set statistics twice in a row has the
- * effect of setting the working set size to zero, so everything
- * is eligible for reaping.
- */
- kmem_depot_ws_update(cp);
- kmem_depot_ws_update(cp);
-
+ kmem_depot_ws_zero(cp);
kmem_depot_ws_reap(cp);
}
@@ -3270,16 +3279,14 @@ kmem_cache_magazine_enable(kmem_cache_t *cp)
}
/*
- * Reap (almost) everything right now. See kmem_cache_magazine_purge()
- * for explanation of the back-to-back kmem_depot_ws_update() calls.
+ * Reap (almost) everything right now.
*/
void
kmem_cache_reap_now(kmem_cache_t *cp)
{
ASSERT(list_link_active(&cp->cache_link));
- kmem_depot_ws_update(cp);
- kmem_depot_ws_update(cp);
+ kmem_depot_ws_zero(cp);
(void) taskq_dispatch(kmem_taskq,
(task_func_t *)kmem_depot_ws_reap, cp, TQ_SLEEP);