Author: markj
Date: Wed Sep 27 14:19:47 2017
New Revision: 324058
URL: https://svnweb.freebsd.org/changeset/base/324058

Log:
  MFC r323544:
  Fix a logic error in the item size calculation for internal UMA zones.

Modified:
  stable/11/sys/vm/uma_core.c
  stable/11/sys/vm/vm_page.c
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/sys/vm/uma_core.c
==============================================================================
--- stable/11/sys/vm/uma_core.c Wed Sep 27 14:18:20 2017        (r324057)
+++ stable/11/sys/vm/uma_core.c Wed Sep 27 14:19:47 2017        (r324058)
@@ -1326,10 +1326,6 @@ keg_large_init(uma_keg_t keg)
        keg->uk_ipers = 1;
        keg->uk_rsize = keg->uk_size;
 
-       /* We can't do OFFPAGE if we're internal, bail out here. */
-       if (keg->uk_flags & UMA_ZFLAG_INTERNAL)
-               return;
-
        /* Check whether we have enough space to not do OFFPAGE. */
        if ((keg->uk_flags & UMA_ZONE_OFFPAGE) == 0) {
                shsize = sizeof(struct uma_slab);
@@ -1337,8 +1333,17 @@ keg_large_init(uma_keg_t keg)
                        shsize = (shsize & ~UMA_ALIGN_PTR) +
                            (UMA_ALIGN_PTR + 1);
 
-               if ((PAGE_SIZE * keg->uk_ppera) - keg->uk_rsize < shsize)
-                       keg->uk_flags |= UMA_ZONE_OFFPAGE;
+               if (PAGE_SIZE * keg->uk_ppera - keg->uk_rsize < shsize) {
+                       /*
+                        * We can't do OFFPAGE if we're internal, in which case
+                        * we need an extra page per allocation to contain the
+                        * slab header.
+                        */
+                       if ((keg->uk_flags & UMA_ZFLAG_INTERNAL) == 0)
+                               keg->uk_flags |= UMA_ZONE_OFFPAGE;
+                       else
+                               keg->uk_ppera++;
+               }
        }
 
        if ((keg->uk_flags & UMA_ZONE_OFFPAGE) &&

Modified: stable/11/sys/vm/vm_page.c
==============================================================================
--- stable/11/sys/vm/vm_page.c  Wed Sep 27 14:18:20 2017        (r324057)
+++ stable/11/sys/vm/vm_page.c  Wed Sep 27 14:19:47 2017        (r324058)
@@ -464,7 +464,8 @@ vm_page_startup(vm_offset_t vaddr)
         * in proportion to the zone structure size.
         */
        pages_per_zone = howmany(sizeof(struct uma_zone) +
-           sizeof(struct uma_cache) * (mp_maxid + 1), UMA_SLAB_SIZE);
+           sizeof(struct uma_cache) * (mp_maxid + 1) +
+           roundup2(sizeof(struct uma_slab), sizeof(void *)), UMA_SLAB_SIZE);
        if (pages_per_zone > 1) {
                /* Reserve more pages so that we don't run out. */
                boot_pages = UMA_BOOT_PAGES_ZONES * pages_per_zone;
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to