Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 20 Nov 2019 01:57:33 +0000 (UTC)
From:      Jeff Roberson <jeff@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r354874 - head/sys/vm
Message-ID:  <201911200157.xAK1vXGB061100@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jeff
Date: Wed Nov 20 01:57:33 2019
New Revision: 354874
URL: https://svnweb.freebsd.org/changeset/base/354874

Log:
  When we set OFFPAGE to limit fragmentation we should also set VTOSLAB
  so that we avoid the hashtables.  The hashtable is now only required if
  a zone is created with OFFPAGE specified initially, not internally.  This
  flag signals to UMA that it can't touch the allocated memory and so
  can't store a slab pointer in the containing page.
  
  Reviewed by:	markj
  Differential Revision:	https://reviews.freebsd.org/D22453

Modified:
  head/sys/vm/uma_core.c

Modified: head/sys/vm/uma_core.c
==============================================================================
--- head/sys/vm/uma_core.c	Wed Nov 20 01:14:22 2019	(r354873)
+++ head/sys/vm/uma_core.c	Wed Nov 20 01:57:33 2019	(r354874)
@@ -585,7 +585,7 @@ zone_timeout(uma_zone_t zone)
 	uma_keg_t keg;
 	u_int slabs;
 
-	if ((zone->uz_flags & UMA_ZFLAG_CACHE) != 0)
+	if ((zone->uz_flags & UMA_ZONE_HASH) == 0)
 		goto update_wss;
 
 	keg = zone->uz_keg;
@@ -1568,7 +1568,14 @@ keg_small_init(uma_keg_t keg)
 		    "new wasted space = %d\n", keg->uk_name, keg, wastedspace,
 		    slabsize / UMA_MAX_WASTE, keg->uk_ipers,
 		    slabsize - keg->uk_ipers * keg->uk_rsize);
-		keg->uk_flags |= UMA_ZONE_OFFPAGE;
+		/*
+		 * If we had access to memory to embed a slab header we
+		 * also have a page structure to use vtoslab() instead of
+		 * hash to find slabs.  If the zone was explicitly created
+		 * OFFPAGE we can't necessarily touch the memory.
+		 */
+		if ((keg->uk_flags & UMA_ZONE_OFFPAGE) == 0)
+			keg->uk_flags |= UMA_ZONE_OFFPAGE | UMA_ZONE_VTOSLAB;
 	}
 
 	if ((keg->uk_flags & UMA_ZONE_OFFPAGE) &&
@@ -1608,7 +1615,7 @@ keg_large_init(uma_keg_t keg)
 		 * slab header.
 		 */
 		if ((keg->uk_flags & UMA_ZFLAG_INTERNAL) == 0)
-			keg->uk_flags |= UMA_ZONE_OFFPAGE;
+			keg->uk_flags |= UMA_ZONE_OFFPAGE | UMA_ZONE_VTOSLAB;
 		else
 			keg->uk_ppera++;
 	}



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201911200157.xAK1vXGB061100>