Date: Thu, 23 Jan 2020 14:14:38 +0000 (UTC) From: Mark Johnston <markj@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-11@freebsd.org Subject: svn commit: r357046 - stable/11/sys/vm Message-ID: <202001231414.00NEEc4w096708@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: markj Date: Thu Jan 23 14:14:38 2020 New Revision: 357046 URL: https://svnweb.freebsd.org/changeset/base/357046 Log: MFC r356563: UMA: Don't destroy zones after the system shutdown process starts. PR: 242427 Modified: stable/11/sys/vm/uma_core.c Directory Properties: stable/11/ (props changed) Modified: stable/11/sys/vm/uma_core.c ============================================================================== --- stable/11/sys/vm/uma_core.c Thu Jan 23 14:11:02 2020 (r357045) +++ stable/11/sys/vm/uma_core.c Thu Jan 23 14:14:38 2020 (r357046) @@ -153,6 +153,7 @@ static struct sx uma_drain_lock; static int booted = 0; #define UMA_STARTUP 1 #define UMA_STARTUP2 2 +#define UMA_SHUTDOWN 3 /* * This is the handle used to schedule events that need to happen @@ -247,6 +248,7 @@ static int hash_expand(struct uma_hash *, struct uma_h static void hash_free(struct uma_hash *hash); static void uma_timeout(void *); static void uma_startup3(void); +static void uma_shutdown(void); static void *zone_alloc_item(uma_zone_t, void *, int); static void zone_free_item(uma_zone_t, void *, void *, enum zfreeskip); static void bucket_enable(void); @@ -1849,10 +1851,6 @@ uma_startup2(void) #endif } -/* - * Initialize our callout handle - * - */ static void uma_startup3(void) @@ -1865,8 +1863,18 @@ uma_startup3(void) #ifdef UMA_DEBUG printf("UMA startup3 complete.\n"); #endif + + EVENTHANDLER_REGISTER(shutdown_post_sync, uma_shutdown, NULL, + EVENTHANDLER_PRI_FIRST); } +static void +uma_shutdown(void) +{ + + booted = UMA_SHUTDOWN; +} + static uma_keg_t uma_kcreate(uma_zone_t zone, size_t size, uma_init uminit, uma_fini fini, int align, uint32_t flags) @@ -2085,6 +2093,14 @@ void uma_zdestroy(uma_zone_t zone) { + /* + * Large slabs are expensive to reclaim, so don't bother doing + * unnecessary work if we're shutting down. + */ + if (booted == UMA_SHUTDOWN && + zone->uz_fini == NULL && + zone->uz_release == (uma_release)zone_release) + return; sx_slock(&uma_drain_lock); zone_free_item(zones, zone, NULL, SKIP_NONE); sx_sunlock(&uma_drain_lock);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202001231414.00NEEc4w096708>