svn commit: r324058 - stable/11/sys/vm
Mark Johnston
markj at FreeBSD.org
Wed Sep 27 14:19:49 UTC 2017
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;
More information about the svn-src-stable
mailing list