Author: markj
Date: Wed Sep 19 19:13:43 2018
New Revision: 338806
URL: https://svnweb.freebsd.org/changeset/base/338806

Log:
  Move kernel vmem arena initialization to vm_kern.c.
  
  This keeps the initialization coupled together with the kmem_* KPI
  implementation, which is the main user of these arenas.
  
  No functional change intended.
  
  Reviewed by:  alc
  Approved by:  re (gjb)
  Sponsored by: The FreeBSD Foundation
  Differential Revision:        https://reviews.freebsd.org/D17247

Modified:
  head/sys/vm/vm_init.c
  head/sys/vm/vm_kern.c

Modified: head/sys/vm/vm_init.c
==============================================================================
--- head/sys/vm/vm_init.c       Wed Sep 19 19:13:29 2018        (r338805)
+++ head/sys/vm/vm_init.c       Wed Sep 19 19:13:43 2018        (r338806)
@@ -98,12 +98,6 @@ extern void  uma_startup1(void);
 extern void    uma_startup2(void);
 extern void    vm_radix_reserve_kva(void);
 
-#if VM_NRESERVLEVEL > 0
-#define        KVA_QUANTUM     (1 << (VM_LEVEL_0_ORDER + PAGE_SHIFT))
-#else
-       /* On non-superpage architectures want large import sizes. */
-#define        KVA_QUANTUM     (PAGE_SIZE * 1024)
-#endif
 long physmem;
 
 /*
@@ -113,57 +107,14 @@ static void vm_mem_init(void *);
 SYSINIT(vm_mem, SI_SUB_VM, SI_ORDER_FIRST, vm_mem_init, NULL);
 
 /*
- * Import kva into the kernel arena.
- */
-static int
-kva_import(void *unused, vmem_size_t size, int flags, vmem_addr_t *addrp)
-{
-       vm_offset_t addr;
-       int result;
-
-       KASSERT((size % KVA_QUANTUM) == 0,
-           ("kva_import: Size %jd is not a multiple of %d",
-           (intmax_t)size, (int)KVA_QUANTUM));
-       addr = vm_map_min(kernel_map);
-       result = vm_map_find(kernel_map, NULL, 0, &addr, size, 0,
-           VMFS_SUPER_SPACE, VM_PROT_ALL, VM_PROT_ALL, MAP_NOFAULT);
-       if (result != KERN_SUCCESS)
-                return (ENOMEM);
-
-       *addrp = addr;
-
-       return (0);
-}
-
-#if VM_NRESERVLEVEL > 0
-/*
- * Import a superpage from the normal kernel arena into the special
- * arena for allocations with different permissions.
- */
-static int
-kernel_rwx_alloc(void *arena, vmem_size_t size, int flags, vmem_addr_t *addrp)
-{
-
-       KASSERT((size % KVA_QUANTUM) == 0,
-           ("kernel_rwx_alloc: Size %jd is not a multiple of %d",
-           (intmax_t)size, (int)KVA_QUANTUM));
-       return (vmem_xalloc(arena, size, KVA_QUANTUM, 0, 0, VMEM_ADDR_MIN,
-           VMEM_ADDR_MAX, flags, addrp));
-}
-#endif
-
-/*
  *     vm_init initializes the virtual memory system.
  *     This is done only by the first cpu up.
  *
  *     The start and end address of physical memory is passed in.
  */
-/* ARGSUSED*/
 static void
-vm_mem_init(dummy)
-       void *dummy;
+vm_mem_init(void *dummy)
 {
-       int domain;
 
        /*
         * Initializes resident memory structures. From here on, all physical
@@ -183,39 +134,6 @@ vm_mem_init(dummy)
        vm_object_init();
        vm_map_startup();
        kmem_init(virtual_avail, virtual_end);
-
-       /*
-        * Initialize the kernel_arena.  This can grow on demand.
-        */
-       vmem_init(kernel_arena, "kernel arena", 0, 0, PAGE_SIZE, 0, 0);
-       vmem_set_import(kernel_arena, kva_import, NULL, NULL, KVA_QUANTUM);
-
-#if VM_NRESERVLEVEL > 0
-       /*
-        * In an architecture with superpages, maintain a separate arena
-        * for allocations with permissions that differ from the "standard"
-        * read/write permissions used for memory in the kernel_arena.
-        */
-       kernel_rwx_arena = vmem_create("kernel rwx arena", 0, 0, PAGE_SIZE,
-           0, M_WAITOK);
-       vmem_set_import(kernel_rwx_arena, kernel_rwx_alloc,
-           (vmem_release_t *)vmem_xfree, kernel_arena, KVA_QUANTUM);
-#endif
-
-       for (domain = 0; domain < vm_ndomains; domain++) {
-               vm_dom[domain].vmd_kernel_arena = vmem_create(
-                   "kernel arena domain", 0, 0, PAGE_SIZE, 0, M_WAITOK);
-               vmem_set_import(vm_dom[domain].vmd_kernel_arena,
-                   (vmem_import_t *)vmem_alloc, NULL, kernel_arena,
-                   KVA_QUANTUM);
-#if VM_NRESERVLEVEL > 0
-               vm_dom[domain].vmd_kernel_rwx_arena = vmem_create(
-                   "kernel rwx arena domain", 0, 0, PAGE_SIZE, 0, M_WAITOK);
-               vmem_set_import(vm_dom[domain].vmd_kernel_rwx_arena,
-                   kernel_rwx_alloc, (vmem_release_t *)vmem_xfree,
-                   vm_dom[domain].vmd_kernel_arena, KVA_QUANTUM);
-#endif
-       }
 
 #ifndef        UMA_MD_SMALL_ALLOC
        /* Set up radix zone to use noobj_alloc. */

Modified: head/sys/vm/vm_kern.c
==============================================================================
--- head/sys/vm/vm_kern.c       Wed Sep 19 19:13:29 2018        (r338805)
+++ head/sys/vm/vm_kern.c       Wed Sep 19 19:13:43 2018        (r338806)
@@ -121,6 +121,13 @@ SYSCTL_ULONG(_vm, OID_AUTO, max_kernel_address, CTLFLA
 #endif
     "Max kernel address");
 
+#if VM_NRESERVLEVEL > 0
+#define        KVA_QUANTUM     (1 << (VM_LEVEL_0_ORDER + PAGE_SHIFT))
+#else
+/* On non-superpage architectures want large import sizes. */
+#define        KVA_QUANTUM     (PAGE_SIZE * 1024)
+#endif
+
 /*
  *     kva_alloc:
  *
@@ -645,17 +652,59 @@ kmem_init_zero_region(void)
 }
 
 /*
+ * Import kva into the kernel arena.
+ */
+static int
+kva_import(void *unused, vmem_size_t size, int flags, vmem_addr_t *addrp)
+{
+       vm_offset_t addr;
+       int result;
+
+       KASSERT((size % KVA_QUANTUM) == 0,
+           ("kva_import: Size %jd is not a multiple of %d",
+           (intmax_t)size, (int)KVA_QUANTUM));
+       addr = vm_map_min(kernel_map);
+       result = vm_map_find(kernel_map, NULL, 0, &addr, size, 0,
+           VMFS_SUPER_SPACE, VM_PROT_ALL, VM_PROT_ALL, MAP_NOFAULT);
+       if (result != KERN_SUCCESS)
+                return (ENOMEM);
+
+       *addrp = addr;
+
+       return (0);
+}
+
+#if VM_NRESERVLEVEL > 0
+/*
+ * Import a superpage from the normal kernel arena into the special
+ * arena for allocations with different permissions.
+ */
+static int
+kernel_rwx_alloc(void *arena, vmem_size_t size, int flags, vmem_addr_t *addrp)
+{
+
+       KASSERT((size % KVA_QUANTUM) == 0,
+           ("kernel_rwx_alloc: Size %jd is not a multiple of %d",
+           (intmax_t)size, (int)KVA_QUANTUM));
+       return (vmem_xalloc(arena, size, KVA_QUANTUM, 0, 0, VMEM_ADDR_MIN,
+           VMEM_ADDR_MAX, flags, addrp));
+}
+#endif
+
+/*
  *     kmem_init:
  *
  *     Create the kernel map; insert a mapping covering kernel text, 
  *     data, bss, and all space allocated thus far (`boostrap' data).  The 
  *     new map will thus map the range between VM_MIN_KERNEL_ADDRESS and 
  *     `start' as allocated, and the range between `start' and `end' as free.
+ *     Create the kernel vmem arena and its per-domain children.
  */
 void
 kmem_init(vm_offset_t start, vm_offset_t end)
 {
        vm_map_t m;
+       int domain;
 
        m = vm_map_create(kernel_pmap, VM_MIN_KERNEL_ADDRESS, end);
        m->system_map = 1;
@@ -671,6 +720,39 @@ kmem_init(vm_offset_t start, vm_offset_t end)
            start, VM_PROT_ALL, VM_PROT_ALL, MAP_NOFAULT);
        /* ... and ending with the completion of the above `insert' */
        vm_map_unlock(m);
+
+       /*
+        * Initialize the kernel_arena.  This can grow on demand.
+        */
+       vmem_init(kernel_arena, "kernel arena", 0, 0, PAGE_SIZE, 0, 0);
+       vmem_set_import(kernel_arena, kva_import, NULL, NULL, KVA_QUANTUM);
+
+#if VM_NRESERVLEVEL > 0
+       /*
+        * In an architecture with superpages, maintain a separate arena
+        * for allocations with permissions that differ from the "standard"
+        * read/write permissions used for memory in the kernel_arena.
+        */
+       kernel_rwx_arena = vmem_create("kernel rwx arena", 0, 0, PAGE_SIZE,
+           0, M_WAITOK);
+       vmem_set_import(kernel_rwx_arena, kernel_rwx_alloc,
+           (vmem_release_t *)vmem_xfree, kernel_arena, KVA_QUANTUM);
+#endif
+
+       for (domain = 0; domain < vm_ndomains; domain++) {
+               vm_dom[domain].vmd_kernel_arena = vmem_create(
+                   "kernel arena domain", 0, 0, PAGE_SIZE, 0, M_WAITOK);
+               vmem_set_import(vm_dom[domain].vmd_kernel_arena,
+                   (vmem_import_t *)vmem_alloc, NULL, kernel_arena,
+                   KVA_QUANTUM);
+#if VM_NRESERVLEVEL > 0
+               vm_dom[domain].vmd_kernel_rwx_arena = vmem_create(
+                   "kernel rwx arena domain", 0, 0, PAGE_SIZE, 0, M_WAITOK);
+               vmem_set_import(vm_dom[domain].vmd_kernel_rwx_arena,
+                   kernel_rwx_alloc, (vmem_release_t *)vmem_xfree,
+                   vm_dom[domain].vmd_kernel_arena, KVA_QUANTUM);
+#endif
+       }
 }
 
 /*
_______________________________________________
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