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++;
        }
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to