Author: glebius
Date: Tue Feb  6 22:06:59 2018
New Revision: 328952
URL: https://svnweb.freebsd.org/changeset/base/328952

Log:
  Fix boot_pages calculation for machines that don't have UMA_MD_SMALL_ALLOC.
  
  o Call uma_startup1() after initializing kmem, vmem and domains.
  o Include 8 eight VM startup pages into uma_startup_count() calculation.
  o Account for vmem_startup() and vm_map_startup() preallocating pages.
  o Account for extra two allocations done by kmem_init() and vmem_create().
  o Hardcode the place of execution of vm_radix_reserve_kva(). Using SYSINIT
    allowed several other SYSINITs to sneak in before it, thus bumping
    requirement for amount of boot pages.

Modified:
  head/sys/kern/subr_vmem.c
  head/sys/vm/vm_init.c
  head/sys/vm/vm_page.c
  head/sys/vm/vm_radix.c

Modified: head/sys/kern/subr_vmem.c
==============================================================================
--- head/sys/kern/subr_vmem.c   Tue Feb  6 21:35:41 2018        (r328951)
+++ head/sys/kern/subr_vmem.c   Tue Feb  6 22:06:59 2018        (r328952)
@@ -72,7 +72,10 @@ __FBSDID("$FreeBSD$");
 #include <vm/vm_param.h>
 #include <vm/vm_page.h>
 #include <vm/vm_pageout.h>
+#include <vm/uma_int.h>
 
+int    vmem_startup_count(void);
+
 #define        VMEM_OPTORDER           5
 #define        VMEM_OPTVALUE           (1 << VMEM_OPTORDER)
 #define        VMEM_MAXORDER                                           \
@@ -652,6 +655,16 @@ vmem_bt_alloc(uma_zone_t zone, vm_size_t bytes, int do
                pause("btalloc", 1);
 
        return (NULL);
+}
+
+/*
+ * How many pages do we need to startup_alloc.
+ */
+int
+vmem_startup_count(void)
+{
+
+       return (howmany(BT_MAXALLOC, UMA_SLAB_SIZE / sizeof(struct vmem_btag)));
 }
 #endif
 

Modified: head/sys/vm/vm_init.c
==============================================================================
--- head/sys/vm/vm_init.c       Tue Feb  6 21:35:41 2018        (r328951)
+++ head/sys/vm/vm_init.c       Tue Feb  6 22:06:59 2018        (r328952)
@@ -93,6 +93,8 @@ __FBSDID("$FreeBSD$");
 #include <vm/vm_pager.h>
 #include <vm/vm_extern.h>
 
+extern void    uma_startup1(void);
+extern void    vm_radix_reserve_kva(void);
 
 #if VM_NRESERVLEVEL > 0
 #define        KVA_QUANTUM     (1 << (VM_LEVEL_0_ORDER + PAGE_SHIFT))
@@ -150,7 +152,11 @@ vm_mem_init(dummy)
         */
        vm_set_page_size();
        virtual_avail = vm_page_startup(virtual_avail);
-       
+
+#ifdef UMA_MD_SMALL_ALLOC
+       /* Announce page availability to UMA. */
+       uma_startup1();
+#endif
        /*
         * Initialize other VM packages
         */
@@ -173,6 +179,12 @@ vm_mem_init(dummy)
                    KVA_QUANTUM);
        }
 
+#ifndef        UMA_MD_SMALL_ALLOC
+       /* Set up radix zone to use noobj_alloc. */
+       vm_radix_reserve_kva();
+       /* Announce page availability to UMA. */
+       uma_startup1();
+#endif
        kmem_init_zero_region();
        pmap_init();
        vm_pager_init();

Modified: head/sys/vm/vm_page.c
==============================================================================
--- head/sys/vm/vm_page.c       Tue Feb  6 21:35:41 2018        (r328951)
+++ head/sys/vm/vm_page.c       Tue Feb  6 22:06:59 2018        (r328952)
@@ -112,6 +112,7 @@ __FBSDID("$FreeBSD$");
 #include <vm/vm_param.h>
 #include <vm/vm_domainset.h>
 #include <vm/vm_kern.h>
+#include <vm/vm_map.h>
 #include <vm/vm_object.h>
 #include <vm/vm_page.h>
 #include <vm/vm_pageout.h>
@@ -127,7 +128,7 @@ __FBSDID("$FreeBSD$");
 
 extern int     uma_startup_count(int);
 extern void    uma_startup(void *, int);
-extern void    uma_startup1(void);
+extern int     vmem_startup_count(void);
 
 /*
  *     Associated with page of user-allocatable memory is a
@@ -501,12 +502,33 @@ vm_page_startup(vm_offset_t vaddr)
 
        /*
         * Allocate memory for use when boot strapping the kernel memory
-        * allocator.
-        *
+        * allocator.  Tell UMA how many zones we are going to create
+        * before going fully functional.  UMA will add its zones.
+        */
+#ifdef UMA_MD_SMALL_ALLOC
+       boot_pages = uma_startup_count(0);
+#else
+       /*
+        * VM startup zones: vmem, vmem_btag, VM OBJECT, RADIX NODE, MAP,
+        * KMAP ENTRY, MAP ENTRY, VMSPACE.
+        */
+       boot_pages = uma_startup_count(8);
+
+       /* vmem_startup() calls uma_prealloc(). */
+       boot_pages += vmem_startup_count();
+       /* vm_map_startup() calls uma_prealloc(). */
+       boot_pages += howmany(MAX_KMAP, UMA_SLAB_SIZE / sizeof(struct vm_map));
+
+       /*
+        * Before going fully functional kmem_init() does allocation
+        * from "KMAP ENTRY" and vmem_create() does allocation from "vmem".
+        */
+       boot_pages += 2;
+#endif
+       /*
         * CTFLAG_RDTUN doesn't work during the early boot process, so we must
         * manually fetch the value.
         */
-       boot_pages = uma_startup_count(0);
        TUNABLE_INT_FETCH("vm.boot_pages", &boot_pages);
        new_end = end - (boot_pages * UMA_SLAB_SIZE);
        new_end = trunc_page(new_end);
@@ -739,9 +761,6 @@ vm_page_startup(vm_offset_t vaddr)
         * can work.
         */
        domainset_zero();
-
-       /* Announce page availability to UMA. */
-       uma_startup1();
 
        return (vaddr);
 }

Modified: head/sys/vm/vm_radix.c
==============================================================================
--- head/sys/vm/vm_radix.c      Tue Feb  6 21:35:41 2018        (r328951)
+++ head/sys/vm/vm_radix.c      Tue Feb  6 22:06:59 2018        (r328952)
@@ -284,6 +284,7 @@ vm_radix_node_zone_dtor(void *mem, int size __unused, 
 #endif
 
 #ifndef UMA_MD_SMALL_ALLOC
+void vm_radix_reserve_kva(void);
 /*
  * Reserve the KVA necessary to satisfy the node allocation.
  * This is mandatory in architectures not supporting direct
@@ -291,8 +292,8 @@ vm_radix_node_zone_dtor(void *mem, int size __unused, 
  * every node allocation, resulting into deadlocks for consumers already
  * working with kernel maps.
  */
-static void
-vm_radix_reserve_kva(void *arg __unused)
+void
+vm_radix_reserve_kva(void)
 {
 
        /*
@@ -304,8 +305,6 @@ vm_radix_reserve_kva(void *arg __unused)
            sizeof(struct vm_radix_node))))
                panic("%s: unable to reserve KVA", __func__);
 }
-SYSINIT(vm_radix_reserve_kva, SI_SUB_KMEM, SI_ORDER_THIRD,
-    vm_radix_reserve_kva, NULL);
 #endif
 
 /*
_______________________________________________
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