diff options
author | Josef 'Jeff' Sipek <josef.sipek@nexenta.com> | 2015-05-30 11:08:28 -0400 |
---|---|---|
committer | Albert Lee <trisk@omniti.com> | 2015-06-19 03:06:06 -0400 |
commit | 0c833d6473a8b5e01ef9b7bc9ac547c0a016f932 (patch) | |
tree | f9ce02e8f34744e7eb830b3bfd368052158f12e6 | |
parent | 9321cd0436261240311eaac9aad60ee764e089e6 (diff) | |
download | illumos-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.c | 31 |
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); |