svn commit: r354588 - head/sys/vm

Konstantin Belousov kib at FreeBSD.org
Sun Nov 10 09:25:20 UTC 2019


Author: kib
Date: Sun Nov 10 09:25:19 2019
New Revision: 354588
URL: https://svnweb.freebsd.org/changeset/base/354588

Log:
  Include cache zones into zone_foreach() where appropriate.
  
  The r354367 is reverted since it is subsumed by this, more complete, approach.
  
  Suggested by:	markj
  Reviewed by:	alc. glebius, markj
  Tested by:	pho
  Sponsored by:	The FreeBSD Foundation
  MFC after:	1 week
  Differential revision:	https://reviews.freebsd.org/D22242

Modified:
  head/sys/vm/uma_core.c

Modified: head/sys/vm/uma_core.c
==============================================================================
--- head/sys/vm/uma_core.c	Sun Nov 10 09:14:22 2019	(r354587)
+++ head/sys/vm/uma_core.c	Sun Nov 10 09:25:19 2019	(r354588)
@@ -503,8 +503,8 @@ zone_put_bucket(uma_zone_t zone, uma_zone_domain_t zdo
 {
 
 	ZONE_LOCK_ASSERT(zone);
-	KASSERT(zone->uz_bkt_count < zone->uz_bkt_max, ("%s: zone %p overflow",
-	    __func__, zone));
+	KASSERT(!ws || zone->uz_bkt_count < zone->uz_bkt_max,
+	    ("%s: zone %p overflow", __func__, zone));
 
 	if (ws)
 		TAILQ_INSERT_HEAD(&zdom->uzd_buckets, bucket, ub_link);
@@ -582,9 +582,13 @@ zone_domain_update_wss(uma_zone_domain_t zdom)
 static void
 zone_timeout(uma_zone_t zone)
 {
-	uma_keg_t keg = zone->uz_keg;
+	uma_keg_t keg;
 	u_int slabs;
 
+	if ((zone->uz_flags & UMA_ZFLAG_CACHE) != 0)
+		goto update_wss;
+
+	keg = zone->uz_keg;
 	KEG_LOCK(keg);
 	/*
 	 * Expand the keg hash table.
@@ -623,6 +627,7 @@ zone_timeout(uma_zone_t zone)
 	}
 	KEG_UNLOCK(keg);
 
+update_wss:
 	ZONE_LOCK(zone);
 	for (int i = 0; i < vm_ndomains; i++)
 		zone_domain_update_wss(&zone->uz_domain[i]);
@@ -1081,7 +1086,8 @@ zone_reclaim(uma_zone_t zone, int waitok, bool drain)
 	 * we're running.  Normally the uma_rwlock would protect us but we
 	 * must be able to release and acquire the right lock for each keg.
 	 */
-	keg_drain(zone->uz_keg);
+	if ((zone->uz_flags & UMA_ZFLAG_CACHE) == 0)
+		keg_drain(zone->uz_keg);
 	ZONE_LOCK(zone);
 	zone->uz_flags &= ~UMA_ZFLAG_RECLAIMING;
 	wakeup(zone);
@@ -2027,6 +2033,8 @@ zone_foreach(void (*zfunc)(uma_zone_t))
 		LIST_FOREACH(zone, &keg->uk_zones, uz_link)
 			zfunc(zone);
 	}
+	LIST_FOREACH(zone, &uma_cachezones, uz_link)
+		zfunc(zone);
 	if (__predict_true(booted == BOOT_RUNNING))
 		rw_runlock(&uma_rwlock);
 }
@@ -2198,7 +2206,6 @@ uma_startup2(void)
 static void
 uma_startup3(void)
 {
-	uma_zone_t zone;
 
 #ifdef INVARIANTS
 	TUNABLE_INT_FETCH("vm.debug.divisor", &dbg_divisor);
@@ -2206,8 +2213,6 @@ uma_startup3(void)
 	uma_skip_cnt = counter_u64_alloc(M_WAITOK);
 #endif
 	zone_foreach(zone_alloc_counters);
-	LIST_FOREACH(zone, &uma_cachezones, uz_link)
-		zone_alloc_counters(zone);
 	callout_init(&uma_callout, 1);
 	callout_reset(&uma_callout, UMA_TIMEOUT * hz, uma_timeout, NULL);
 	booted = BOOT_RUNNING;


More information about the svn-src-all mailing list