Author: jhibbits
Date: Sun Jan 19 21:17:57 2020
New Revision: 356896
URL: https://svnweb.freebsd.org/changeset/base/356896

Log:
  [PowerPC64] fix crash when using machdep.moea64_bpvo_pool_size tunable
  
  Summary:
  This fixes kernel crashing when tunable "machdep.moea64_bpvo_pool_size" is
  set to a value higher then 327680 (default value).  Function
  moea64_mid_bootstrap() relies on moea64_bpvo_pool_size, but at time of the
  use the variable wan't yet updated with the new value provided by user.
  
  Problem was detected after trying to use a VM with 64GB of RAM, and default
  moea64_bpvo_pool_size is insufficient (kernel boot used more than 470000) .
  I think default value must be discussed to address this use case, or find a
  way to calculate pool size automatically based on amount of memory detected.
  
  Test Plan: Tested on QEMU VM with 64GB of RAM using "set
  machdep.moea64_bpvo_pool_size=655360" on loader prompt
  
  Submitted by: Alfredo Dal'Ava JĂșnior (alfredo.junior_eldorado.org.br)
  Differential Revision:        https://reviews.freebsd.org/D23233

Modified:
  head/sys/powerpc/aim/mmu_oea64.c

Modified: head/sys/powerpc/aim/mmu_oea64.c
==============================================================================
--- head/sys/powerpc/aim/mmu_oea64.c    Sun Jan 19 20:04:44 2020        
(r356895)
+++ head/sys/powerpc/aim/mmu_oea64.c    Sun Jan 19 21:17:57 2020        
(r356896)
@@ -185,7 +185,6 @@ uma_zone_t  moea64_pvo_zone; /* zone for pvo entries */
 static struct  pvo_entry *moea64_bpvo_pool;
 static int     moea64_bpvo_pool_index = 0;
 static int     moea64_bpvo_pool_size = 327680;
-TUNABLE_INT("machdep.moea64_bpvo_pool_size", &moea64_bpvo_pool_size);
 SYSCTL_INT(_machdep, OID_AUTO, moea64_allocated_bpvo_entries, CTLFLAG_RD, 
     &moea64_bpvo_pool_index, 0, "");
 
@@ -390,9 +389,11 @@ alloc_pvo_entry(int bootstrap)
 
        if (!moea64_initialized || bootstrap) {
                if (moea64_bpvo_pool_index >= moea64_bpvo_pool_size) {
-                       panic("moea64_enter: bpvo pool exhausted, %d, %d, %zd",
-                             moea64_bpvo_pool_index, moea64_bpvo_pool_size,
-                             moea64_bpvo_pool_size * sizeof(struct pvo_entry));
+                       panic("%s: bpvo pool exhausted, index=%d, size=%d, 
bytes=%zd."
+                           "Try setting machdep.moea64_bpvo_pool_size tunable",
+                           __func__, moea64_bpvo_pool_index,
+                           moea64_bpvo_pool_size,
+                           moea64_bpvo_pool_size * sizeof(struct pvo_entry));
                }
                pvo = &moea64_bpvo_pool[
                    atomic_fetchadd_int(&moea64_bpvo_pool_index, 1)];
@@ -914,6 +915,7 @@ moea64_mid_bootstrap(mmu_t mmup, vm_offset_t kernelsta
        /*
         * Initialise the bootstrap pvo pool.
         */
+       TUNABLE_INT_FETCH("machdep.moea64_bpvo_pool_size", 
&moea64_bpvo_pool_size);
        moea64_bpvo_pool = (struct pvo_entry *)moea64_bootstrap_alloc(
                moea64_bpvo_pool_size*sizeof(struct pvo_entry), PAGE_SIZE);
        moea64_bpvo_pool_index = 0;
_______________________________________________
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